¿Cómo lidiar con el captcha al hacer Web Scraping en Puppeteer?

3 minutos de lectura

Estoy usando Puppeteer para Web Scraping y me acabo de dar cuenta de que, a veces, el sitio web que estoy tratando de raspar pide un captcha debido a la cantidad de visitas que estoy haciendo desde mi computadora. El formulario de captcha se ve así:

captcha

Por lo tanto, necesitaría ayuda sobre cómo manejar esto. He estado pensando en enviar el formulario de captcha al lado del cliente ya que uso Express y EJS para enviar los valores a mi sitio web índice, pero no sé si Puppeteer puede enviar algo así.

¿Algunas ideas?

avatar de usuario
Maryland Abu Taher

Debe usar una combinación de lo siguiente:

  • Use una API si el sitio web de destino la proporciona. Es la forma más legal.
  • Aumente el tiempo de espera entre las solicitudes de raspado, no envíe solicitudes masivas al servidor.
  • Cambie/rote la IP con frecuencia.
  • Cambie el agente de usuario, el tamaño de la ventana gráfica del navegador y la huella digital.
  • Utilice soluciones de terceros para captcha.
  • Resuelva el captcha usted mismo, verifique la respuesta de Thomas Dondorf. Básicamente, debe esperar a que aparezca el captcha en otro navegador, resolverlo desde allí. Las soluciones de terceros hacen esto por usted.

Descargo de responsabilidad: no use complementos / servicios anti-captcha para hacer un mal uso de los recursos. Los recursos son caros.


Básicamente, la idea es usar servicios anti-captcha como (2captcha) para lidiar con recaptcha persistente.

Puedes usar este complemento llamado puppeteer-extra-plugin-recaptcha por bertsend

// puppeteer-extra is a drop-in replacement for puppeteer,
// it augments the installed puppeteer with plugin functionality
const puppeteer = require('puppeteer-extra')

// add recaptcha plugin and provide it your 2captcha token
// 2captcha is the builtin solution provider but others work as well.
const RecaptchaPlugin = require('puppeteer-extra-plugin-recaptcha')
puppeteer.use(
  RecaptchaPlugin({
    provider: { id: '2captcha', token: 'XXXXXXX' },
    visualFeedback: true // colorize reCAPTCHAs (violet = detected, green = solved)
  })
)

Después puede ejecutar el navegador como de costumbre. Recogerá cualquier captcha en la página e intentará resolverlo. Debe encontrar el botón Enviar que varía de un sitio a otro si existe.

// puppeteer usage as normal
puppeteer.launch({ headless: true }).then(async browser => {
  const page = await browser.newPage()
  await page.goto('https://www.google.com/recaptcha/api2/demo')

  // That's it, a single line of code to solve reCAPTCHAs 🎉
  await page.solveRecaptchas()

  await Promise.all([
    page.waitForNavigation(),
    page.click(`#recaptcha-demo-submit`)
  ])
  await page.screenshot({ path: 'response.png', fullPage: true })
  await browser.close()
})

PD:

  • Hay otros complementos, incluso hice uno muy simple porque captcha es cada vez más difícil de resolver incluso para un humano como yo. Puedes leer el código aquí.
  • No estoy afiliado a 2Captcha ni a ningún otro servicio de terceros mencionado anteriormente.
  • Creé mi propia solución, que es similar a la otra respuesta de Thomas Dondorf, pero me rendí pronto porque Captcha se está volviendo más ridículo y no tengo energía mental para resolverlos.

  • Lamentablemente, el sitio web de destino no proporciona una API para usar. Ya lo he buscado… He probado tu código, pero parece que algo anda mal. No resuelve el captcha ya que me aparece un borde rojo alrededor y me dice que demuestre que no soy un bot: i.imgur.com/jIVPvuE.png. ¿Se debe a que tengo un idioma diferente al inglés?

    usuario10021033

    4 de abril de 2019 a las 10:37

  • Además, ¿qué debo poner en el token? He reemplazado esos XXX por el valor de la clave del sitio de datos. ¿Es eso correcto?

    usuario10021033

    4 de abril de 2019 a las 10:38

  • No, compras créditos de 2captcha, usas su API (no estoy afiliado a ellos). En caso de que no quiera usar dinero, la única otra forma es resolver el captcha usted mismo, que no agregué a mi respuesta, pero Thomas Dondorf lo agregó en otra respuesta. Alguien tiene que resolver el captcha, tú u otras personas. 😀

    – Dr. Abu Taher

    4 de abril de 2019 a las 12:52

Se pueden usar servidores proxy para que el sitio de destino no detecte una carga de respuestas de una sola dirección IP.

(Traducido al Traductor de Google)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad