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

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我不知道你这里遇到验证码是不是页面通过
302
重定向出现的,如果是的话,我觉得可能是因为这里重新发送的那个请求是重定向后的那个url
,而这个url
本身就是要跳转到验证码页面,所以这里重复请求返回的依旧是验证码页面。以上是我猜测,供参考。
response.request.meta.get('redirect_urls') 这个里面应该有重定向之前的原始URL