Как бороться с капчей при выполнении Web Scraping in Puppeteer? - PullRequest
2 голосов
/ 03 апреля 2019

Я использую Puppeteer для Web Scraping, и я только что заметил, что иногда веб-сайт, который я пытаюсь очистить, запрашивает капчу из-за количества посещений с моего компьютера. Форма капчи выглядит следующим образом:

captcha

Итак, мне нужна помощь, чтобы справиться с этим. Я думал об отправке формы капчи на стороне клиента, так как я использую Express и EJS для отправки значений на мой индексный веб-сайт, но я не знаю, может ли Puppeteer отправить что-то подобное.

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 03 апреля 2019

Это reCAPTCHA (версия 2, ознакомьтесь с демонстрациями здесь ), который показан вам как владелец страницы, который не хочет, чтобы вы автоматически сканировали страницу.

Ваши варианты следующие:

Вариант 1: прекратить сканирование или попытаться использовать официальный API

Поскольку владелец страницы не хочет, чтобы вы сканировали эту страницу, вы можете просто уважать это решение и прекратить сканирование. Возможно, есть документированный API, который вы можете использовать.

Вариант 2: Автоматизация / Аутсорсинг решения по проверке капчи

Существует целая индустрия, в которой люди (часто в развивающихся странах) заполняют капчи для ботов других людей. Я не буду ссылаться на какой-либо конкретный сайт, но вы можете проверить другой ответ от Md. Абу Тахер для получения дополнительной информации по теме или поиска Captcha Solver .

Вариант 3: Решите капчу самостоятельно

Для этого позвольте мне объяснить, как работает reCAPTCHA и что происходит, когда вы посещаете страницу, используя ее.


Как работает reCAPTCHA (v2)

У каждой страницы есть идентификатор, который вы можете проверить, посмотрев на исходный код, например:

<div class="g-recaptcha form-field" data-sitekey="ID_OF_THE_WEBSITE_LONG_RANDOM_STRING"></div>

Когда код reCAPTCHA загружен, он добавляет ответ textarea в форму без значения. Это будет выглядеть так:

<textarea id="g-recaptcha-response" name="g-recaptcha-response" class="g-recaptcha-response" style="... display: none;"></textarea>

После того как вы решили проблему, reCAPTCHA добавит очень длинную строку в это текстовое поле (которое затем может быть проверено службой server / reCAPTCHA в бэкэнде) при отправке формы.


Как самостоятельно решить капчу

Скопировав значение поля textarea, вы можете перенести «решенную задачу» из одного браузера в другой (это также то, для чего вам нужны услуги решения). Полный процесс выглядит так:

  1. Определите, использует ли страница reCAPTCHA (например, проверьте для .g-recaptcha) в "сканирующем" браузере
  2. Откройте второй браузер в режиме без заголовка с тем же URL-адресом
  3. Решите капчу самостоятельно
  4. Считать значение из: document.querySelector('#g-recaptcha-response').value
  5. Поместите это значение в первый браузер: document.querySelector('#g-recaptcha-response').value = '...'
  6. Отправить форму

Дополнительная информация / чтение

От Google мало публичной информации о том, как именно работает reCAPTCHA, так как это игра в кошки-мышки между создателями ботов и алгоритмами обнаружения Google, но в Интернете есть некоторые ресурсы с дополнительной информацией:

  • Официальные документы от Google : Очевидно, они просто объясняют основы, а не то, как это работает "в спину"
  • InsideReCaptcha : Это проект 2014 года, который пытается "реинжинировать" reCAPTCHA. Хотя он довольно старый, на странице все еще много полезной информации.
  • Еще один вопрос о стековом потоке : Этот вопрос содержит некоторую полезную информацию о reCAPTCHA, а также о многих спекулятивных (и весьма вероятных) устаревших подходах к тому, как обмануть reCAPTCHA.
3 голосов
/ 03 апреля 2019

Вы должны использовать комбинацию из следующих:

  • Используйте API, если целевой сайт предоставляет это.Это наиболее законный способ.
  • Увеличьте время ожидания между запросами на очистку, не отправляйте массовый запрос на сервер.
  • Часто меняйте / поворачивайте IP.
  • Смените пользовательский агент,размер окна просмотра и отпечаток браузера.
  • Используйте сторонние решения для капчи.
  • Решите капчу самостоятельно, проверьте ответ Томаса Дондорфа.В основном вам нужно дождаться появления капчи в другом браузере, решить ее оттуда.Сторонние решения делают это для вас.

Отказ от ответственности: не используйте плагины / сервисы против капчи для неправомерного использования ресурсов.Ресурсы дороги.


По сути, идея состоит в том, чтобы использовать анти-каптч-сервисы, такие как (2captcha), чтобы справиться с сохраняющимся recaptcha.

Вы можете использовать этот плагин puppeteer-extra-plugin-recaptcha от berstend.

// 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)
  })
)

После этого вы можете запустить браузер как обычно.Он подберет любую капчу на странице и попытается ее решить.Вы должны найти кнопку отправки, которая варьируется от сайта к сайту, если он существует.

// 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()
})

PS:

  • Есть другие плагины, даже я сделал очень простой, потому чтоКапчу становится сложнее решить даже для такого человека, как я.Вы можете прочитать код здесь .
  • Я не имею отношения к 2Captcha или любым другим сторонним сервисам, упомянутым выше.
  • Я создал свое собственное решение, похожее на другой ответ Томаса Дондорфа, но вскоре сдался, так как капча становится все более нелепой, и у меня нет умственной энергии, чтобы разрешить их.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...