scrapy RetryMiddleware中间件 重试请求携带请求头和代理ip的问题

目标:希望在请求ip失败,或则在遇到验证码的时候 重复发起当前请求,直到请求成功,减少爬取的数据遗漏。
问题:不知我的思路是否正确,目前能在中间件识别到有验证码,也能重复请求,并且确实是携带了新的ip。
可是重复请求返回的依然是验证码,中间件方法里是不是少些了什么?

(设置了代理ip,随机请求User-Agent)

中间件RetryMiddleware 代码如下:

重试请求

class LocalRetryMiddleware(RetryMiddleware):

    def process_response(self, request, response, spider):
        if request.meta.get('dont_retry', False):
            return response
        print('输出当前页面:', response.body)
        # 验证码判断
        img = response.xpath('//img[@src="/Account/ValidateImage"]')
        print(img)
        if img:
            print('1中间件处 发现有验证码,需要重复请求!')
            time.sleep(random.choice(range(6)))
            print('当前请求ip:', request.meta.get('proxy'))

            return self._retry(request, response.body, spider) or response
        return response



    def process_exception(self, request, exception, spider):
        if isinstance(exception, self.EXCEPTIONS_TO_RETRY) and not request.meta.get('dont_retry', False):
            # 删除该代理
            #self.delete_proxy(request.meta.get('proxy', False))
            time.sleep(random.randint(3, 5))
            print('2中间件处 发现请求异常,需要重复请求!')

            return self._retry(request, exception, spider)
            
阅读 8.5k
2 个回答

我不知道你这里遇到验证码是不是页面通过 302 重定向出现的,如果是的话,我觉得可能是因为这里重新发送的那个请求是重定向后的那个 url,而这个 url 本身就是要跳转到验证码页面,所以这里重复请求返回的依旧是验证码页面。

以上是我猜测,供参考。

新手上路,请多包涵

response.request.meta.get('redirect_urls') 这个里面应该有重定向之前的原始URL

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进