scrapy 如何让重试功能变得更加强大

1,145 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

最近在基于 scrapy 重新搭建一个更加强大的爬虫框架, 今天分享一下在搭建重试中间键的过程中的一些思考和总结

scrapy 自带的中间键中,就包括了一个重试中间键, 那么我们先来看一下 scrapy 是如何检测异常以及实现重试功能的:

首先看一下 scrapy 代码, 重试功能代码在: scrapy/downloadermiddlewares/retry.py 中

有一个叫做:RetryMiddleware 的类

image.png

代码逻辑很简单:

先定义了异常的检测项, 比如各种超时、 DNS 解析失败, IO 报错等等问题。 然后初始化读取一下 settings 里边的配置项, 比如重试次数, 异常状态码(比如像 400+, 500+ 这种),重试优先级(priority_adjust) 再定义一下 process_response 和 process_exception, 如果遇到之前检测项的问题, 就直接调用 _retry 方法。 _retry 方法会调用一个静态方法,并返回:

image.png

我们来看一下逻辑, 其实也很清晰:

读取 settings 和 stats,然后添加这次重试的一些信息到 stats 里, 检测当前重试次数, 调整优先级,再把封装好的新的 request 返回。

好的, 那么到目前为止, 我们已经看完了 scrapy 自带的重试机制实现了, 本质就是读取一些 settings, 然后在中间键里检测, 一旦遇到异常的检测项,就把重新封装好的 request 作为返回值就可以了。

可是我们目前想的是基于 scrapy 自带的检测项进行优化, 这个时候该怎么做呢, 既然要对一个类进行功能增强, 当然选择继承啦(擅于复用是高效工作的基础之一)

image.png

继承重试中间键后, 重写了 process_response, 加入了「基于关键词」,「基于 response 文本」「基于 url 链接」等等的异常检测项, 这部分代码具体代码就不放了, 逻辑也不难, 大家可以自己编写出想要的检测项。 同时也重写了 _retry 方法, 加入了更加详细的打点信息。 最后呢, 只要在 settings 里的 DOWNLOADER_MIDDLEWARES 中加入自己写好的重试中间键路径, 就完事儿啦~

image.png

文章内容如果对您有帮助, 希望可以点一波关注~ 谢谢您的支持

image.png