浅谈 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代理类代理的实际对象实例?
在hibernate中,通过sql语句查询带clob字段的记录,查出来的结果集是List<HashMap<String,Object>>类型,在调用jackson的接口转为js ...
- # 20145205 《Java程序设计》第1周学习总结
教材学习内容总结 第一章中 JAVA的三大体系:JAVA SE .JAVA EE.JAVA ME.而在其中书中主要介绍我们入门学习者所要学习的JVAA SE,其又可分为四个主要组成部分同Java SE ...
- python UnicodeDecodeError: 'ascii' codec can't decode byte 0xa6 in position 907: ordinal not in range(128)
import sysreload(sys)sys.setdefaultencoding('utf-8')
- 重置dns
flusdns
- 【资料下载区】【iCore3相关代码、资料下载地址】更新日期2017/1/5
[iCore3 ARM代码下载地址][全部]DEMO1.0测试程序发布例程一:ARM驱动三色LED例程二:读取arm按键状态例程三:EXTI中断输入实验——读取ARM按键状态例程四:USART通信实验 ...
- px与rem关系及转换
PX特点 1. IE无法调整那些使用px作为单位的字体大小:2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位:3. Firefox能够调整px和em,rem,但是96%以上的中 ...
- 阿里云服务器Linux CentOS安装配置(七)域名解析
阿里云服务器Linux CentOS安装配置(七)域名解析 1.购买域名 登录阿里云,左侧菜单点击[域名],然后[域名注册],完成域名购买.(一般首年45元) 2.添加域名解析 在域名列表里点击你的域 ...
- 汇编语言标记寄存器标记位_NV UP EI NG NZ AC PE CY
在8086CPU中,有一种标记寄存器,长度为16bit: 其中存储的信息被称为程序状态字(Program Status Word,PSW),以下将该寄存器简称为flag. 功能:1)用来存储相关指令的 ...
- 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别
一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...
- Linux 升级修改libc gcc 文件名称,导致执行命令失效问题解决
升级linux文件时,若不小心把文件名给重命名了,结果导致执行所有命令都不识别. 比如我们不小心执行了 mv /lib64/libc.so.6 /lib64/libc.so.6.bak 结果导致所有系 ...