Scrapy con captcha dynamic

Estoy intentando romper un captcha dentro de un formulario desde un sitio web, pero este captcha es dynamic, no tiene una URL, en cambio tiene algo como esto.

 src="captcha?accion=image" 

¿Cuál es la mejor opción aquí? He leído algo como usar middlewares o algo así. También sé que se puede hacer con Selenium o Splash u otro controlador del navegador (captura de pantalla), pero quiero hacerlo solo con Scrapy , si es posible, por supuesto.

Aquí hay una solución completa para evitar el captcha especificado usando anticaptcha y PIL .

Debido a la dinámica de este captcha , necesitamos agarrar una pantalla de impresión del elemento img que contiene el captcha . Para eso usamos save_screenshot() y PIL para recortar y guardar en el disco ( captcha.png ).
Luego captcha.png a anti-captcha que devolverá la solución, es decir:

 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 ) 

Salida:

 ifds 

captcha.png

introduzca la descripción de la imagen aquí


Notas:

  • Úsalo bajo tu propia responsabilidad (sé inteligente) ;
  • Puedes mejorar el código manejando las excepciones adecuadamente;
  • anticaptcha es un servicio de pago (0.5 $ / 1000 imgs);
  • No estoy afiliado a anticaptcha .