使用动态验证码进行抓取

时间:2018-12-13 19:18:37

标签: python selenium web-scraping scrapy captcha

我正在尝试从网站的表单中破坏captcha,但是此验证码是动态的,没有URL,而是类似这样的

src="captcha?accion=image"

这里最好的选择是什么?我已经读过类似使用中间件之类的东西。我也知道可以用Selenium或Splash或其他浏览器驱动程序(屏幕截图)来完成,但是我想只用Scrapy来做到这一点。

1 个答案:

答案 0 :(得分:5)

这是使用anticaptchaPIL 绕过指定的captcha的完整解决方案。

由于此captcha的动态性,我们需要获取包含img的{​​{1}}元素的打印屏幕。为此,我们使用captchasave_screenshot()来裁剪PIL并将其保存到磁盘(<img name="imagen"...)。
然后,我们将captcha.png提交到captcha.png,这将返回解决方案,即:

anti-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 )

captcha.png

enter image description here


注释:

  • 使用它要自己负责(聪明)
  • 您可以通过适当地处理异常来改进代码;
  • ifds paid service(0.5 $ / 1000 imgs);
  • 我与anticaptcha没有关系。