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

发布于 2022-09-07 16:10:25 字数 1255 浏览 15 评论 0

目标:希望在请求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)
            

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你怎么敢 2022-09-14 16:10:25

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

以上是我猜测,供参考。

银河中√捞星星 2022-09-14 16:10:25

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文