这是一个非常深入的话题,有许多解决方案。但如果您想要应用您在帖子中定义的逻辑,可以使用Scrapy下载中间件。
类似这样:
class CaptchaMiddleware(object):
max_retries = 5
def process_response(request, response, spider):
if not request.meta.get('solve_captcha', False):
return response
catpcha = find_catpcha(response)
if not captcha:
return response
solved = solve_captcha(captcha)
if solved:
response.meta['catpcha'] = captcha
response.meta['solved_catpcha'] = solved
return response
else:
if request.meta.get('catpcha_retries', 0) == max_retries:
logging.warning('max retries for captcha reached for {}'.format(request.url))
raise IgnoreRequest
request.meta['dont_filter'] = True
request.meta['captcha_retries'] = request.meta.get('captcha_retries', 0) + 1
return request
这个例子将拦截每个响应并尝试解决验证码。如果失败,它将重试页面以获取新的验证码,如果成功,它将向响应中添加一些元数据键,并带有已解决的验证码值。
在您的爬虫中,您可以像这样使用它:
这个例子将拦截每个响应并尝试解决验证码。如果失败,它将重试页面以获取新的验证码,如果成功,它将向响应中添加一些元数据键,并带有已解决的验证码值。
在您的爬虫中,您可以像这样使用它:
class MySpider(scrapy.Spider):
def parse(self, response):
url = ''
yield Request(url, callback=self.parse_captchad, meta={'solve_captcha': True},
errback=self.parse_fail)
def parse_captchad(self, response):
solved = response['solved']
def parse_fail(self, response):