浅谈 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动态加载网页(一)
由于别的项目组在做舆情的预言项目,我手头正好没有什么项目,突然心血来潮想研究一下爬虫.分析的简单原型.网上查查这方面的资料还真是多,眼睛都看花了.搜了搜对于我这种新手来说,想做一个简单的爬虫程序,所以 ...
随机推荐
- jenkins使用git SCM时changelog乱码(Jenkins部署在Linux上,任务在Windows Slave上构建)
问题原因 changelog的获取方式(git-client插件): 首先调用git whatchanged命令,读取输出字节流(UTF-8编码的Commit Message). 将字节流解码为字符串 ...
- 神奇的VIM~转IBM
% 地址范围符号,代表文件中的所有行,作用等同于地址范围 1,$ . 与任意单字符(换行符除外)匹配,例如 y.s 可以匹配 yas y.s 或 y s 等等. * 与前一字符的0次或多次出现匹配,例 ...
- bahuanghou111
#include<stdio.h> int map[8][8]={0}; int count=0; int safe(int x,int y) { int i; int j; for(i= ...
- Java之内存诊断
Java 内存诊断比较容易, 需要: 1 获取heap dump 2 分析heap dump 1.1 获取dump之1 VM arguments: -XX:+HeapDumpOnOutOfMemory ...
- 【Demo】QQ,github,微博第三方社交登录
本文主要讲解 集成 第三方社交账号登录 为什么会有这个需求? 主要是因为目前互联网的网站数量太多,如果在各个站点都注册一个账号 用户非常不容易记住每个账号的用户名和密码,并且非常难保证每个账号的密码足 ...
- 在asp.net WebForms中使用路由Route
1.新建WebForms应用程序 2.打开Global.asax文件代码如下: public class Global : System.Web.HttpApplication { protected ...
- 初识The Battle of Polytopia
1.首先了解了一下<文明5-美丽新文明>视频介绍网址:http://list.youku.com/albumlist/show?id=19481409&ascending=1&am ...
- 采用阿里的API进行动态域名解析
#!/usr/bin/env python # -*- coding:utf-8 -*- import os from aliyunsdkcore import client from aliyuns ...
- Session与Cookie概念
摘:一.Session机制session是一种服务器端的状态管理技术,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息.当程序需要为某个客户端的请求创建一个session的时候,服务 ...
- 理解会话Session