scrapy自定义RetryMiddleware

本文介绍了如何在Scrapy项目中创建自定义RetryMiddleware,当JSON响应包含特定信息时,将请求加入重试队列。内容包括处理含有cookie禁用信息的策略,以及遵循Scrapy Download Middleware的process_response方法来调整请求行为,确保失败页面在爬虫完成所有常规页面抓取后重新安排下载。同时提到了在settings中激活该中间件以及重试时间和过滤规则的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

爬虫repo地址:https://github.com/Karmenzind/EasyGoSpider

此处需求为:

  • 返回json中带有{"code": 0}时,将此请求加入重试队列
  • 假如json中含有cookie被禁信息,对cookie列表进行修正

源码注释中有一句:

Failed pages are collected on the scraping process and rescheduled at the end, once the spider has finished crawling all regular (non failed) pages.

继而根据Scrapy doc对通用Download Middleware中process_response的介绍:

If it returns a Request object, the middleware chain is halted and the returned request is rescheduled to be downloaded in the future. This is the same behavior as if a request is returned from process_request().

返回request对象时,该response不会再进入spider.parse_item方法,因而无需考虑在后者中的处理。

最后修改结果为:

class LocalRetryMiddleware(RetryMiddleware):

    def process_response(self, request, response, spider):
        if request.meta.get('dont_retry', False):
            return response

        if response.status in self.retry_http_codes:
            reason = response_status_message(response.status)
            return self._retry(request, reason, spider) or response

        # customiz' here
        resp_dct = json.loads(response.body)
        if resp_dct.get('code') != 0:
            reason = "Code is not 0."
            if resp_dct.get("data") == "\\u8be5\\u7528\\u6237\\u8bbf\\u95ee\\u6b21\\u6570\\u8fc7\\u591a".decode(
                    'unicode_escape'):  # 访问次数过多
                banned_cookie = response.request.cookies
                reason = "%s has been BANNED today." % banned_cookie
                spider.logger.warning(reason)
                spider.cookies.remove(banned_cookie)
                mongo_cli.cookies.find_one_and_update({"cookie": banned_cookie},
                                                      {"$set": {"FailedDate": str(datetime.date.today())}})
            return self._retry(request, reason, spider) or response

        return response

settings中激活

DOWNLOADER_MIDDLEWARES = {
    "scrapy.contrib.downloadermiddleware.redirect.RedirectMiddleware": None,
    "EasyGoSpider.middleware.LocalRetryMiddleWare": 302
    }

另外需要修改Retry time和Filter规则,此前已经设置,忽略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值