这次让我们分析scrapy重试机制的源码,学习其中的思想,编写定制化middleware,捕捉爬取失败的URL等信息。
scrapy简介
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
一张图可看清楚scrapy中数据的流向:
简单了解一下各个部分的功能,可以看下面简化版数据流:
总有漏网之鱼
不管你的主机配置多么吊炸天,还是网速多么给力,在scrapy的大规模任务中,最终爬取的item数量都不会等于期望爬取的数量,也就是说总有那么一些爬取失败的漏网之鱼,通过分析scrapy的日志,可以知道造成失败的原因有以下两种情况:
exception_count
httperror
以上的不管是exception还是httperror, scrapy中都有对应的retry机制,在settings.py文件中我们可以设置有关重试的参数,等运行遇到异常和错误时候,scrapy就会自动处理这些问题,其中最关键的部分就是重试中间件,下面让我们看一下scrapy的retry middleware。
RetryMiddle源码分析
在scrapy项目的middlewares.py文件中 敲如下代码:
from scrapy.downloadermiddlewares.retry import RetryMiddleware
复制代码
按住ctrl键(Mac是command键),鼠标左键点击RetryMiddleware进入该中间件所在的项目文件的位置,也可以通过查看文件的形式找到该该中间件的位置,路径是:
site-packages/scrapy/downloadermiddlewares/retry.RetryMiddleware
复制代码
源码如下:
class RetryMiddleware(object):
# IOError is raised by