Scrapy与动态验证码

Ang*_*lLB 2 python selenium captcha scrapy web-scraping

我试图captcha在网站中打破一个表单,但这个验证码是动态的,它没有URL,而是它有这样的东西

src="captcha?accion=image"
Run Code Online (Sandbox Code Playgroud)

这里最好的选择是什么?我读过类似使用中间件或类似东西的东西.另外我知道可以使用Selenium或Splash或其他浏览器驱动程序(屏幕截图)来完成,但我想用它来做Scrapy,如果可能的话.

Ped*_*ito 6

这是一个完整的解决方案,可以绕过指定的captcha使用anticaptchaPIL.

由于这种动态captcha,我们需要抓取img包含该元素的元素的打印屏幕captcha.为此我们使用save_screenshot()PIL裁剪并保存<img name="imagen"...到磁盘(captcha.png).
然后我们提交captcha.pnganti-captcha那将返回解决方案,即:

from PIL import Image
from python_anticaptcha import AnticaptchaClient, ImageToTextTask
from selenium import webdriver

def get_captcha():
    captcha_fn = "captcha.png"
    element = driver.find_element_by_name("imagen") # element name containing the catcha image
    location = element.location
    size = element.size
    driver.save_screenshot("temp.png")

    x = location['x']
    y = location['y']
    w = size['width']
    h = size['height']
    width = x + w
    height = y + h

    im = Image.open('temp.png')
    im = im.crop((int(x), int(y), int(width), int(height)))
    im.save(captcha_fn)

    # request anti-captcha service to decode the captcha

    api_key = 'XXXXXXXXXXXXXXXXXXXXXXXXXX' # api key -> https://anti-captcha.com/
    captcha_fp = open(captcha_fn, 'rb')
    client = AnticaptchaClient(api_key)
    task = ImageToTextTask(captcha_fp)
    job = client.createTask(task)
    job.join()
    return job.get_captcha_text()

start_url = "YOU KNOW THE URL"
driver = webdriver.Chrome()
driver.get(start_url)
captcha = get_captcha()
print( captcha )
Run Code Online (Sandbox Code Playgroud)

输出:

ifds
Run Code Online (Sandbox Code Playgroud)

captcha.png

在此输入图像描述


笔记:

  • 使用它是你自己的责任(聪明) ;
  • 您可以通过正确处理异常来改进代码;
  • anticaptcha是一项付费服务(0.5美元/ 1000英镑);
  • 我不隶属于anticaptcha.