浅谈 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动态加载网页(一)
由于别的项目组在做舆情的预言项目,我手头正好没有什么项目,突然心血来潮想研究一下爬虫.分析的简单原型.网上查查这方面的资料还真是多,眼睛都看花了.搜了搜对于我这种新手来说,想做一个简单的爬虫程序,所以 ...
随机推荐
- mysql数据库日期,ip等处理
一.日期 1.select now(); 查询当前时间,格式为:年-月-日 时:分:秒,如2015-12-17 17:37:20 2.select unix_timestamp(); 将字符串类型的日 ...
- 标签案例-开发foreach标签
if(item.getClass().isArray()){ this.collection = new ArrayList(); int length = Array.getLength(items ...
- 关于 apue.h 的使用方法
unix中有很多地方使用到apue.h .apue.h是作者自己写的一个头文件,这个文件怎么用,晚上有很多方法,但是经过尝试大多不好用. 经过本人尝试,可以把src.3e.tar.gz 的代码解压到 ...
- Thinking Of Matrix
http://blog.163.com/bzm_square/blog/static/9355546320129582254842/ PS: 一种有关于矩阵的思维方法.....WiKi 向量空间,不定 ...
- IntelliJ IDEA使用小技巧
1:设置类,接口,枚举注解模板 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NA ...
- 查找Maven JAR坐标
http://mvnrepository.com/ http://search.maven.org/
- NGUI渲染流程
1 渲染流程 NGUI的渲染流程其实就是把Widget组件生成Mesh所需要的缓存数据,然后生成对应的DrallCall组合对应数据,生成渲染需要的Mesh数据,提交渲染. Widget(数据) UI ...
- maxscale
一.maxscale简介1.MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换.2.官网:https://mariadb ...
- 深入解析PHP中逗号与点号的区别
大部分同学都知道逗号要比点号快,但就是不知道为什么,更不知道逗号与点号这两者之间到底有什么区别.下面小编就来详细的为大家介绍一下,需要的朋友可以过来参考下 echo 'abc'.'def'; //用点 ...
- spdk intel
前言 继为SDN和NFV领域带来福音的DPDK之后,英特尔于2015年9月开始,逐步将为NVMe等新一代存储规范优化的Linux性能工具包SPDK(Storage Performance Develo ...