gpt4 book ai didi

python - 我如何设置 Scrapy 来处理验证码

转载 作者:太空狗 更新时间:2023-10-29 17:07:27 25 4
gpt4 key购买 nike

我正在尝试抓取一个要求用户输入搜索值和验证码的网站。我有一个验证码的光学字符识别 (OCR) 例程,成功率约为 33%。由于验证码始终是字母文本,如果 OCR 函数返回非字母字符,我想重新加载验证码。一旦我有一个文本“单词”,我想提交搜索表单。

结果返回到同一页面,表单准备好进行新的搜索和新的验证码。所以我需要冲洗并重复,直到用尽我的搜索词。

这是顶级算法:

  1. 初始加载页面
  2. 下载验证码图片,通过OCR运行
  3. 如果 OCR 没有返回纯文本结果,请刷新验证码并重复此步骤
  4. 在页面中提交带有搜索词和验证码的查询表单
  5. 检查响应以查看验证码是否正确
  6. 如果正确,则抓取数据
  7. 转到2

我试过使用管道获取验证码,但我没有表单提交的值。如果我只是获取图像而不通过框架,使用 urllib 或其他东西,那么不会提交带有 session 的 cookie,因此服务器上的验证码验证失败。

理想的 Scrapy 方法是什么?

最佳答案

这是一个非常有深度的话题,有很多解决方案。但是如果你想应用你在帖子中定义的逻辑,你可以使用 scrapy Downloader Middlewares .

类似于:

class CaptchaMiddleware(object):
max_retries = 5
def process_response(request, response, spider):
if not request.meta.get('solve_captcha', False):
return response # only solve requests that are marked with meta key
catpcha = find_catpcha(response)
if not captcha: # it might not have captcha at all!
return response
solved = solve_captcha(captcha)
if solved:
response.meta['catpcha'] = captcha
response.meta['solved_catpcha'] = solved
return response
else:
# retry page for new captcha
# prevent endless loop
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 = ''# url that requires captcha
yield Request(url, callback=self.parse_captchad, meta={'solve_captcha': True},
errback=self.parse_fail)

def parse_captchad(self, response):
solved = response['solved']
# do stuff

def parse_fail(self, response):
# failed to retrieve captcha in 5 tries :(
# do stuff

关于python - 我如何设置 Scrapy 来处理验证码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39137559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com