Wie gehe ich mit dem Captcha um, wenn ich Web Scraping in Puppeteer mache?

Lesezeit: 8 Minuten

Ich verwende Puppeteer für Web Scraping und habe gerade bemerkt, dass die Website, die ich zu scrapen versuche, manchmal nach einem Captcha fragt, weil ich so viele Besuche von meinem Computer aus mache. Das Captcha-Formular sieht so aus:

captcha

Ich bräuchte also Hilfe, wie ich damit umgehen soll. Ich habe darüber nachgedacht, das Captcha-Formular an die Client-Seite zu senden, seit ich Express und EJS verwende, um die Werte an meine Index-Website zu senden, aber ich weiß nicht, ob Puppeteer so etwas senden kann.

Irgendwelche Ideen?

Dies ist ein reCAPTCHA (Version 2, check out Demos hier), die Ihnen als Eigentümer der Seite angezeigt wird, möchte nicht, dass Sie die Seite automatisch crawlen.

Ihre Optionen sind die folgenden:

Option 1: Stoppen Sie das Crawlen oder versuchen Sie, eine offizielle API zu verwenden

Da der Eigentümer der Seite nicht möchte, dass Sie diese Seite crawlen, können Sie diese Entscheidung einfach respektieren und das Crawlen beenden. Vielleicht gibt es eine dokumentierte API, die Sie verwenden können.

Option 2: Captcha-Lösung automatisieren/auslagern

Es gibt eine ganze Branche, in der Menschen (häufig in Entwicklungsländern) Captchas für die Bots anderer Leute ausfüllen. Ich werde nicht auf eine bestimmte Website verlinken, aber Sie können die andere Antwort von überprüfen Md. Abu Taher für weitere Informationen zum Thema oder suchen Sie nach Captcha-Löser.

Option 3: Lösen Sie das Captcha selbst

Lassen Sie mich dazu erklären, wie reCAPTCHA funktioniert und was passiert, wenn Sie eine Seite besuchen, die es verwendet.


Funktionsweise von reCAPTCHA (v2).

Jede Seite hat eine ID, die Sie anhand des Quellcodes überprüfen können, Beispiel:

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

Wenn der reCAPTCHA-Code geladen wird, fügt er a hinzu Antwort textarea zum Formular ohne Wert. Es wird so aussehen:

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

Nachdem Sie die Challenge gelöst haben, fügt reCAPTCHA diesem Textfeld beim Absenden des Formulars eine sehr lange Zeichenfolge hinzu (die dann später vom Server/reCAPTCHA-Dienst im Backend überprüft werden kann).


So lösen Sie das Captcha selbst

Durch Kopieren des Wertes der textarea können Sie die “gelöste Herausforderung” von einem Browser auf einen anderen übertragen (das ist auch das, was die Lösungsdienste für Sie tun). Der vollständige Prozess sieht wie folgt aus:

  1. Ermitteln Sie, ob die Seite reCAPTCHA verwendet (z. B. prüfen Sie auf .g-recaptcha) im “kriechenden” Browser
  2. Öffnen Sie einen zweiten Browser im Non-Headless-Modus mit derselben URL
  3. Lösen Sie das Captcha selbst
  4. Lesen Sie den Wert aus: document.querySelector('#g-recaptcha-response').value
  5. Geben Sie diesen Wert in den ersten Browser ein: document.querySelector('#g-recaptcha-response').value="..."
  6. Senden Sie das Formular ab

Weitere Informationen/Lektüre

Es gibt nicht viele öffentliche Informationen von Google, wie genau reCAPTCHA funktioniert, da dies ein Katz-und-Maus-Spiel zwischen Bot-Erstellern und Google-Erkennungsalgorithmen ist, aber es gibt einige Online-Ressourcen mit weiteren Informationen:

  • Offizielle Dokumente von Google: Offensichtlich erklären sie nur die Grundlagen und nicht, wie es “hinten” funktioniert
  • InsideReCaptcha: Dies ist ein Projekt aus dem Jahr 2014, das versucht, reCAPTCHA “reverse-engineering” zu machen. Obwohl dies schon ziemlich alt ist, gibt es immer noch viele nützliche Informationen auf der Seite.
  • Noch eine Frage zu Stackoverflow: Diese Frage enthält einige nützliche Informationen zu reCAPTCHA, aber auch viele spekulative (und sehr wahrscheinlich) veraltete Ansätze, wie man ein reCAPTCHA täuschen kann.

  • @ThomasDondorf Können Sie mir bitte erklären, wie das Captcha-Lösen von Drittanbietern funktioniert, während sie die Seite mit Captcha mit einer anderen IP und einem anderen Browser öffnen? Verfolgt Google nicht die IP und den Browser, auf dem das Captcha gelöst wird? Und wie ist es möglich, die Antwort mit einem anderen Browser, einer anderen IP und einem anderen Standort zu lösen?

    – Sumet

    17. Juli 2019 um 11:38 Uhr


  • @sumeet AFAIK das Captcha ist nicht an den Browser oder die IP-Adresse gebunden. Wenn Sie das Captcha lösen, können Sie bestehen, egal wie zwielichtig Ihr Browser-“Fingerabdruck” sein mag.

    – Thomas Döndorf

    17. Juli 2019 um 15:03 Uhr

  • Wenn Sie auf der Website mindestens eine Anfrage stellen können, bevor das CAPTCHA angezeigt wird, gibt es auch eine vierte Option, einen Anbieter von Proxys mit „privaten“ IP-Adressen zu verwenden. Sie geben Ihnen eine Reihe von IP-Adressen, Sie stellen Anfragen von einer IP-Adresse, bis Sie das CAPTCHA erhalten, und wechseln dann zu einer neuen IP-Adresse.

    – Boris v

    8. November 2021 um 21:27 Uhr

Benutzer-Avatar
Md. Abu Taher

Sie sollten die folgende Kombination verwenden:

  • Verwenden Sie eine API, wenn die Zielwebsite dies bereitstellt. Das ist der legalste Weg.
  • Erhöhen Sie die Wartezeit zwischen Scraping-Anfragen, senden Sie keine Massenanfragen an den Server.
  • IP häufig ändern/rotieren.
  • Ändern Sie den Benutzeragenten, die Größe des Browser-Ansichtsfensters und den Fingerabdruck.
  • Verwenden Sie Lösungen von Drittanbietern für Captcha.
  • Lösen Sie das Captcha selbst, überprüfen Sie die Antwort von Thomas Dondorf. Grundsätzlich müssen Sie warten, bis das Captcha in einem anderen Browser angezeigt wird, und es von dort aus lösen. Lösungen von Drittanbietern erledigen dies für Sie.

Haftungsausschluss: Verwenden Sie keine Anti-Captcha-Plugins/-Dienste, um Ressourcen zu missbrauchen. Ressourcen sind teuer.


Grundsätzlich besteht die Idee darin, Anti-Captcha-Dienste wie (2captcha) zu verwenden, um mit anhaltendem Recaptcha fertig zu werden.

Sie können dieses Plugin namens verwenden puppeteer-extra-plugin-recaptcha von 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)
  })
)

Anschließend können Sie den Browser wie gewohnt ausführen. Es wird jedes Captcha auf der Seite aufnehmen und versuchen, es zu lösen. Sie müssen den Submit-Button finden, der sich von Site zu Site unterscheidet, falls vorhanden.

// 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:

  • Es gibt andere Plugins, sogar ich habe ein sehr einfaches gemacht, weil Captcha selbst für einen Menschen wie mich immer schwieriger zu lösen ist. Sie können den Code lesen hier.
  • Ich bin ausdrücklich nicht mit 2Captcha oder anderen oben genannten Drittanbieterdiensten verbunden.
  • Ich hatte meine eigene Lösung erstellt, die der anderen Antwort von Thomas Dondorf ähnelt, aber bald aufgegeben, da Captcha immer lächerlicher wird und ich keine mentale Energie habe, um sie zu lösen.

  • Leider bietet die Zielwebsite keine zu verwendende API. Ich habe schon danach gesucht … Ich habe Ihren Code getestet, aber es scheint, dass etwas nicht stimmt. Es löst das Captcha nicht, da es rot umrandet ist und mich auffordert zu beweisen, dass ich kein Bot bin: i.imgur.com/jIVPvuE.png. Liegt es daran, dass ich eine andere Sprache als Englisch habe?

    Benutzer10021033

    4. April 2019 um 10:37 Uhr

  • Außerdem, was soll ich in Token eingeben? Ich habe diese XXX für den data-sitekey-Wert ersetzt. Ist das korrekt?

    Benutzer10021033

    4. April 2019 um 10:38 Uhr

  • Nein, Sie kaufen Credits von 2captcha und verwenden deren API (ich bin nicht mit ihnen verbunden). Falls Sie kein Geld verwenden möchten, besteht die einzige andere Möglichkeit darin, das Captcha selbst zu lösen, das ich nicht zu meiner Antwort hinzugefügt habe, aber Thomas Dondorf hat es zu einer anderen Antwort hinzugefügt. Jemand muss das Captcha lösen, Sie oder andere Personen. 😀

    – Md. Abu Taher

    4. April 2019 um 12:52 Uhr

Proxy-Server können verwendet werden, damit die Zielsite nicht viele Antworten von einer einzelnen IP-Adresse erkennt.

(Übersetzt in Google Übersetzer)

Ich habe den Vorschlag von @Thomas Dondorf ausprobiert, aber ich denke, das Problem mit den im Abschnitt „So lösen Sie das Captcha selbst“ beschriebenen Schritten besteht darin, dass das Token des CAPTCHA nur einmal gültig ist. Ich werde versuchen, im Folgenden alles im Detail zu erklären.

WAS ICH VERWENDE

Ich verwende als ersten Browser (der das Captcha nicht löst) Google Chrome und als zweiten Browser (den, in dem ich das Captcha löse und den Token nehme) Firefox.

SCHRITTE

  1. Ich löse das Captcha auf dieser Seite manuell https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php
  2. Ich gebe den folgenden Code ein document.querySelector('#g-recaptcha-response').value in der Google Chrome-Konsole, aber ich erhalte eine Fehlermeldung (VM22:1 Uncaught TypeError: Cannot read property ‘value’ of null at :1:48), also suche ich einfach nach dem Token, indem ich Elements in Google Chrome öffne und suche g-recaptcha-response mit STRG+F
  3. Ich kopiere das Token des Recaptcha (hier ist ein Bild, das zeigt, wo sich das Token befindet, nachdem der Text grün hervorgehoben ist)Hier ist der Teil des Codes der Webseite, der das Token enthält
  4. Ich gebe den folgenden Code ein document.querySelector('#g-recaptcha-response').value="..."Ersetzen Sie in der Firefox-Konsole das “…” durch das gerade kopierte Recaptcha-Token
  5. Ich bekomme den folgenden FehlerError und, wenn Sie dann auf die klicken Dokumentation verlinktwerden Sie lesen, dass der Fehler darauf zurückzuführen ist, dass ein Token nur einmal verwendet werden kann und natürlich bereits für das CAPTCHA verwendet wurde, das Sie gerade gelöst haben, um das Token selbst zu erhalten (also scheint das einzige Ziel Zu dem Token ist zu sagen, dass das CAPTCHA bereits gelöst wurde, es scheint eine Art Abwehrmaßnahme zu sein, um Replay-Angriffe zu verhindern, wie hier in der besagten offizielle Dokumentation des Recaptcha.
1011380cookie-checkWie gehe ich mit dem Captcha um, wenn ich Web Scraping in Puppeteer mache?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy