Scrapy爬虫技巧分享

laical · · 1594 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

Scrapy爬虫是用Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。 Scrapy 使用了 Twisted'twɪstɪd异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。 Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv、json等文件中。它能我们更好的完成爬虫任务,自己写Python爬虫程序好比孤军奋战,而使用了Scrapy就好比手底下有了千军万马 • Scrapy Engine(Scrapy核心) 负责数据流在各个组件之间的流。 • Spiders(爬虫)发出Requests请求,经由Scrapy Engine(Scrapy核心) 交给Scheduler(调度器),Downloader(下载器)Scheduler(调度器) 获得Requests请求,然后根据Requests请求,从网络下载数据。 • Downloader(下载器)的Responses响应再传递给Spiders进行分析。根据需求提取出Items,交给Item Pipeline进行下载。Spiders和Item Pipeline是需要用户根据响应的需求进行编写的。 • 除此之外,还有两个中间件,Downloaders Mddlewares和Spider Middlewares,这两个中间件为用户提供方面,通过插入自定义代码扩展Scrapy的功能,例如去重等。 在正式开始爬虫编写之前,有几种小技巧,可以方便我们操纵和调试爬虫。 一、建立main.py文件,直接在Pycharm下进行调试 很多时候我们在使用Scrapy爬虫框架的时候,如果想运行Scrapy爬虫项目的话,一般都会想着去命令行中直接执行命令“scrapy crawl crawler_name”,其中crawler_name指的是爬虫的名字,在一开始创建Scrapy爬虫模板的时候就指定了的,而且在该爬虫项目中具有唯一性。但是每次跑到命令行下去执行,看交互的结果,有时候并不是很清晰,所以这里介绍一种方法,可以帮助大家提高开发效率,尤其是调试的时候更是显得方便。 在与爬虫项目的scrapy.cfg文件同级目录下建立一个main.py文件,用于控制整个爬虫项目的执行。 在该文件夹中写入的代码见下图。其中execute函数是内嵌在scrapy中的,调用这个函数可以直接调用该Scrapy工程项目的爬虫脚本,这个函数的执行需要在爬虫项目的父目录下进行。而第7行代码的意思就是获取当前py文件的父目录,省去我们直接复制路径的精力和时间,同时也方便我们将该项目放到其他的平台上去运行,不会报路径的错误。execute函数里边的参数其实就是将Scrapy爬虫执行命令拆分,然后分别以一个字符的方式放到了一个数组中。 之后我们直接运行这个main.py文件便可以调用Scrapy爬虫程序了。 二、设置网站robots.txt规则为False 一般的,我们在运用Scrapy框架抓取数据之前,需要提前到settings.py文件中,将“ROBOTSTXT_OBEY = True”改为ROBOTSTXT_OBEY = False。 在未改动之后settings.py文件中默认爬虫是遵守网站的robots.txt规则的,如下图所示。 如果遵守robots.txt规则的话,那么爬取的结果会自动过滤掉很多我们想要的目标信息,因此有必要将该参数设置为False,如下图所示。 设置好robots.txt规则之后,我们便可以抓到更多网页的信息。 关于Scrapy爬虫项目运行和调试的部分小技巧有很多,希望小伙伴们可以多多利用起来,让其为自己的项目服务,可以事半功倍。同时Scrapy爬虫需要配合亿牛云高质量的爬虫代理IP 才能更加长期稳定采集相关数据。 performance && performance.mark && performance.mark("start-js-render"); var MaxErrorReportLimit = 100; // 简单的将错误采集上报到 /api/logs/error window.onerror = function(message, source, lineno, colno, error) { // 同一个页面最多上报100次错误,防止某个循环错误页面一直打开,不断的报错 if (MaxErrorReportLimit-- < 0) return; try { var msg = { message: message, source: source, lineno: lineno, colno: colno, stack: error && error.stack, traceId: window.appData && window.appData.traceId, href: window.location.href, }; msg = JSON.stringify(msg); // 用于 macaca E2E 自动化测试 window.__macaca_latest_error = msg; var req = new XMLHttpRequest(); req.open('post', '/api/logs/error', true); req.setRequestHeader('Content-Type', 'application/json'); req.send(msg); // yuyanMonitor 记录错误堆栈 if (window.yuyanMonitor) { yuyanMonitor.logError(error, { code: 1, msg: message, }); } } catch (err) { console.log('report error', err); } }; // 监听 window.onload 是否执行,用于组件中执行 onload 后续事件 window.addEventListener('load', function() { try { // 移动端开启 var isMobile = navigator.userAgent.toLowerCase().match(/iphone|ipad|android|micromessenger/i); if (isMobile) { var rootNode = document.querySelector('#ReactApp'); if (rootNode && !rootNode.innerHTML) { // ready 3s 后节点内容为空,展示友好报错 setTimeout(function() { // 插入节点前再次检查是否白屏 if (!rootNode.innerHTML) { var html = '<div>'; html += '<h3 style="margin-top: 45%;text-align: center;">页面打不开?快来找开发 GG 帮忙</h3>'; if (window.appData && window.appData.traceId) { html += '<p style="padding: 10px 30px;">反馈信息: ' + window.appData.traceId + '</p>'; } html += '<p style="padding: 10px 30px;">截图或复制反馈信息到: <a target="_blank" href="https://www.yuque.com/yuque/topics/new">https://www.yuque.com/yuque/topics</a></p>' html += '</div>'; rootNode.innerHTML = html; } }, 3000); } } } catch (e) { console.log(e); } }, false); if ('serviceWorker' in navigator) { if (!/[?&]enable_sw=false/.test(location.search) && window.appData && window.appData.settings.enable_serviceworker) { window.addEventListener('load', function() { navigator.serviceWorker.register('/serviceworker.js'); }); } else { navigator.serviceWorker.getRegistrations().then(function(registrations) { registrations.forEach(sw => sw.unregister()); }); } } window.routerBase = '/'; window.resourceBaseUrl = 'https://gw.alipayobjects.com/os/chair-script/skylark/'; window.__webpack_public_path__ = '/os/chair-script/skylark/'; 1 / 5 !function(t,e,a,r,c){t.TracertCmdCache=t.TracertCmdCache||[],t[c]=window[c]|| {_isRenderInit:!0,call:function(){t.TracertCmdCache.push(arguments)}, start:function(t){this.call('start',t)}},t[c].l=new Date; var n=e.createElement(a),s=e.getElementsByTagName(a)[0]; n.async=!0,n.src=r,s.parentNode.insertBefore(n,s)} (window,document,'script','https://ur.alipay.com/tracert_a385.js','Tracert'); Tracert.start({ spmAPos: 'a385', spmBPos: 'b4693', role_id: '1313142', mdata: { group_id: appData.group.id, book_id: appData.book.id, doc_id: appData.doc.id, }, }); 站长统计 window.yuyanMonitor = new YuyanMonitor({ _appId: '589c123e2b89c03d127000da', env: '外网', userId: 'laical', });

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1594 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传