浅谈 Scrapy 爬虫(二)
越写越像官方文档的翻译,偏离了初衷。写一些官方文档里没有的内容吧。
- 在不限制宽带的环境下,根据页面的大小, Scrapy 一秒能爬取40-70个页面,一天在400万到600万页面。也就是说 Scrapy 应付千万级或者亿级的爬取没有问题。
- Scrapy 主要限制是select函数,在其他方面优化完美的情况下,大概有60%-70%的CPU花费在select上,剩下10%花费在框架本身。
- Scrapy 可以使用Windows下的IOCP或者Linux下的epoll机制。IOCP我试过,效果很一般,而且有很多链接出错的情况,应该是Twisted本身对Windows支持的问题。据说epoll效果要好一些,我没试过。
- Scrapy 支持续爬,在启动的时候指定JOBDIR即可。JOBDIR实际原理是Scrapy在启动的时候检查是否设置了变量JOBDIR,如果设置了,则读取该目录的数据进行初始化。
- 续爬不是非常靠谱,只有使用Ctrl+C退出才能保证下次能续爬,如果不小心多按了一次Ctrl+C,没有执行到收尾工作,有很大几率下次续爬的时候会出问题。
- Scrapy本身没有增量爬取的机制,这个得根据需求,自己实现。
- Python有一个MySQLdb库,有一个函数executemany,开始以为这个函数是内部多次执行execute,后来实际测试发现不是。在大量插入数据的情况下,many函数的执行效率比execute高很多。
- Scrapy本身已经带了URL去重。
- Scrapy不会执行class AJianSpider(BaseSpider)类的__DEL__。如果有在蜘蛛关闭的时候执行的收尾工作,可以使用扩展机制,在spider_closed中处理。
- Request有一个meta属性,可以用于存储和传递附加数据,实际是一个dict。
- 获取链接建议用正则表达式,解析整个HTML非常耗时,哪怕使用最快的lxml,依然会比Python里的正则表达式慢四倍以上。而且还有大量的不规范HTML,处理起来很麻烦。正则的问题是会匹配到script里的网址,可以简单总结一下遇到的不正常URL,过滤一下即可。
- 实际爬抓时,爬取国内网站会有卡住一段时间的情况,几秒到十几秒下载流量为几k,过段时间恢复正常。爬取外国网站会有ConnectionLost的情况,原因不明。我采取的是比较暴力的方式,设置重试次数为1000次。或者修改一下代码,Scrapy用的中间件处理的错误重试,可以修改retry.py的代码,在多次重试失败的情况下,把URL存储到数据库或文件中。
- Scrapy有一个比较坑的地方是二进制文件,Scrapy会爬取到二进制文件,Scrapy内置的二进制文件处理方式,是过滤扩展名,显然不能满足需求。Scrapy没有一个只获取URL HTTP头的功能。如果在获取URL的时候自己抓取HTTP头获取Content-Type会破坏twisted本身的机制,导致爬取异常缓慢。这里我的处理方法是写了一个中间件,发送请求的时候过滤扩展名,如果扩展名在黑名单中,再自己获取一下HTTP头。如果文件类型真的是二进制文件则放弃请求。
- 中间件出现异常的时候Scrapy会直接退出,不会打印堆栈,写中间件的时候可以先try住,在except主动打印异常。
- Scrapy自带cProfile,分析性能很管用。
浅谈 Scrapy 爬虫(二)的更多相关文章
- 浅谈Scrapy爬虫(一)
以下谈论的 scrapy 基于 0.20.2 版本(当前最新版本是 0.22.0 ),python 2.7.6. 开发环境是windows 7 sp1. 互联网上比较有价值的参考资料 1. Scr ...
- 浅谈Kotlin(二):基本类型、基本语法、代码风格
浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 通过上面的文章,在A ...
- 浅谈Java代理二:Cglib动态代理-MethodInterceptor
浅谈Java代理二:Cglib动态代理-MethodInterceptor CGLib动态代理特点: 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生 ...
- 浅谈网络爬虫爬js动态加载网页(二)
没错,最后我还是使用了Selenium,去实现上一篇我所说的问题,别的没有试,只试了一下firefox的引擎,总体效果对我来说还是可以接受的. 继续昨天的话题,既然要实现上篇所说的问题,那么就需要一个 ...
- 浅谈scrapy框架安装使用
Scrapy笔记: 一 安装: pip3 install wheel pip3 install lxml pip3 install pyopenssl pip3 install -i https:// ...
- crawler_浅谈网络爬虫
题记: 1024,今天是个程序猿的节日 ,哈哈,转为正题,从事了一线网络爬虫开发有近1000天.简单阐述下个人对网络爬虫的理解. 提纲: 1:是什么 2:能做什么 3:怎么做 4:综述 1:是什么 w ...
- 浅谈网络爬虫爬js动态加载网页(三)
上一篇讨论了web driver对动态网页的抓取与分析,可以很清楚的看出这是一种集中式处理方式,简单说,就是利用服务器,打开一个真正的brower,然后将需要解析的地址交给浏览器,浏览器去解析,然后将 ...
- 浅谈Spring(二)
一.AOP编程(面向切面编程) AOP的本质是代理. 1.静态代理设计模式 概念:通过代理类为原始类增加额外功能. 代理类 = 原始类 + 额外功能 +实现原始类的相同接口. 优点:避免原始类因为额外 ...
- 浅谈网络爬虫爬js动态加载网页(一)
由于别的项目组在做舆情的预言项目,我手头正好没有什么项目,突然心血来潮想研究一下爬虫.分析的简单原型.网上查查这方面的资料还真是多,眼睛都看花了.搜了搜对于我这种新手来说,想做一个简单的爬虫程序,所以 ...
随机推荐
- Hibernate加载数据失败failed to lazily initialize a collection of role
在测试获取数据库中的数据或者在页面获取时,有时会遇到这样的错误提示: failed to lazily initialize a collection of role: com.exam.entity ...
- ZOJ 2771
Description Considering a light entering three adjacent planes of glass. At any meeting surface, t ...
- shujuk
数据库管理的目标:在适当的时候以适当的形式向适当的人提供适当的数据. 2. 数据管理的内容:组织业务的管理(学生的信息) :技术的管理(数据库的建立等) 3. 数据库管理的发展阶段:人工,文件,数据库 ...
- jquery autocomplete插件
jquery autocomplete插件 https://goodies.pixabay.com/jquery/auto-complete/demo.html autocomplete-table ...
- VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法(转自网络)
最近开始使用VS2010,在引用COM组件的时候,出现了无法嵌入互操作类型“……”,请改用适用的接口的错误提示.查阅资料,找到解决方案,记录如下: 选中项目中引入的dll,鼠标右键,选择属性,把“嵌入 ...
- mydumper 和 myloader 的使用
mydumper 和 myloader 的使用 MySQL 自身的 mysqldump 工具支持单线程工作, 依次一个个导出多个表,没有一个并行的机 ,这就使得它无法迅速的备份数据. mydumper ...
- Secure Digital
https://en.wikipedia.org/wiki/Secure_Digital#Technical_details Secure Digital (SD) is a non-volatile ...
- Map<Key,Value>基于Value值排序
Map<Key,Value> 排序默认是按照KEY值的升序来进行. 针对按照Value来进行排序有两种方法: 第一种 使用TreeMap 代码如下 public class test{ ...
- source insight 编程风格(持续更新)
1.字体Source Code Pro 出身于豪门Adobe,从名字上来看就知道是转为编码而生的.基本上也是拥有前面所提的编程字体的所有要素的.这个字体基本上具有编程字体所需的所有要素:等宽.支持Cl ...
- ax Mail
SysMailer mailer = new SysMailer(); SysEmailParameters parameters = SysEmailParameters::find(); ; tr ...