Heim BlogWeb-Scraping Praktischer Leitfaden zum Web Scraping mit Python Pyppeteer

Praktischer Leitfaden zum Web Scraping mit Python Pyppeteer

von Kadek

Pyppeteer ist ein Python-Wrapper für die Puppeteer-Bibliothek, die ursprünglich für Node.js entwickelt wurde. Dies ermöglicht die Verwendung asynchroner Methoden zur Verarbeitung von Seiten und Daten und unterscheidet es von anderen Web-Scraping-Bibliotheken.

In diesem Artikel werden verschiedene Aspekte der Arbeit mit der Pyppeteer-Bibliothek behandelt, von der Installation und den Anforderungen bis hin zur Interaktion mit Elementen und Daten auf einer Seite.

Wir werden auch häufig auftretende Probleme und deren Lösung besprechen. Um die Fähigkeiten und Vorteile dieser Bibliothek besser zu verstehen, stellen wir Vergleichstabellen mit Pyppeteer und anderen beliebten Web-Scraping-Bibliotheken bereit.

Was ist Pyppeteer?

Pyppeteer ist eine beliebte Python-Bibliothek zur Interaktion mit Chromium-Headless-Browsern und zur Simulation der Aktionen eines echten Benutzers. Wie bereits erwähnt, wurde es ursprünglich für NodeJS als Puppeteer entwickelt und später auf Python portiert.

Zu den Hauptfunktionen der Pyppeteer-Bibliothek gehören Seitenverwaltung, Ereignisbehandlung, Arbeiten mit Selektoren, Ausführen von JavaScript-Code im Kontext einer Seite sowie Funktionen zum Erstellen von Screenshots und Aufzeichnen von Videos einer Websitzung.

Erste Schritte mit Pyppeteer

Um mit der Pyppeteer-Bibliothek zu beginnen, benötigen Sie Python v3.6 oder höher und einen Code-Editor oder eine Python-IDE. Wir werden Visual Studio Code verwenden, einen leichten und leistungsstarken Code-Editor mit Syntaxhervorhebung und einem integrierten Compiler.

So installieren Sie Pyppeteer

Um die Bibliothek zu installieren, öffnen Sie ein Terminal oder eine Eingabeaufforderung und geben Sie Folgendes ein:

pip install pyppeteer

Die neueste Version von Chromium wird während der Bibliotheksinstallation automatisch heruntergeladen und installiert. Wenn Sie den Vorgang beschleunigen oder manuell installieren möchten, verwenden Sie den folgenden Befehl:

pyppeteer-install

Sobald die Bibliothek installiert ist, können Sie sie in Ihren Projekten verwenden.

Von Pyppeteer unterstützte Browser

Pyppeteer ist eine Python-Bibliothek, die es Benutzern ermöglicht, Chromium-Browser zu steuern. Andere Browser wie Firefox oder Safari werden nicht unterstützt. Stattdessen wird eine eigene gebündelte Version von Chromium verwendet, die automatisch mit der Bibliothek installiert wird.

Grundlegendes Pyppeteer-Projekt

Erstellen wir eine neue Python-Datei mit der Erweiterung .py. Importieren Sie die erforderlichen Bibliotheken, starten Sie Chromium und navigieren Sie mit Pyppeteer zu einer beliebigen Seite. Zunächst müssen wir die folgenden Bibliotheken importieren:

import asyncio
from Pyppeteer import launch

Die Asyncio-Bibliothek ist erforderlich, damit Pyppeteer im asynchronen Modus ausgeführt werden kann. Dies ist eine effizientere Möglichkeit, Pyppeteer auszuführen, da mehrere Aufgaben gleichzeitig ausgeführt werden können. Die Asyncio-Bibliothek ist mit Python vorinstalliert, sodass wir sie nicht separat installieren müssen.

Erstellen Sie als Nächstes eine Funktion, die Sie asynchron aufrufen und ausführen können:

async def main():

In dieser Funktion führen wir alle Aktionen aus, einschließlich des Startens und Schließens des Browsers und der Navigation zwischen Seiten. Beschreiben wir die Befehle zum Starten des Browsers, zum Erstellen einer neuen Registerkarte, zum Navigieren zu einer Seite und zum Schließen des Browsers:

    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://www.example.com')
    await browser.close()

Nachdem wir nun die asynchrone Funktion beschrieben haben, die alle notwendigen Aktionen ausführt, nennen wir sie.

asyncio.get_event_loop().run_until_complete(main())

Wir werden dieses einfache Beispiel verwenden, um in Zukunft komplexere Skripte zu erstellen. Der Grundaufbau des Beispiels bleibt jedoch gleich.

Erweiterte Konfiguration mit Pyppeteer

In diesem Abschnitt untersuchen wir die Parameter, die vor dem Aufruf des Browsers konfiguriert werden können, wodurch Ihr Skript funktionaler wird. Wir zeigen Ihnen, wie Sie Proxys konfigurieren, Benutzeragenten hinzufügen und verwalten und mit Cookies umgehen.

Verwendung von Proxys

In früheren Artikeln haben wir die Verwendung von Proxys mit Python behandelt, einschließlich einer Diskussion der besten Proxy-Anbieter. In diesem Tutorial konzentrieren wir uns auf die Verwendung von Proxys mit Pyppeteer.

Um einen Proxy hinzuzufügen, verwenden Sie beim Starten des Browsers den Parameter args. Der Einfachheit halber erstellen Sie Variablen zum Speichern des Proxyservers und des Ports.

    proxy_server="your_proxy_server"
    proxy_port="your_proxy_port"

Erstellen Sie dann die Vorlage zur Angabe von Proxys:

    proxy_url = f'http://{proxy_server}:{proxy_port}'

Fügen Sie beim Aufruf des Browsers ein Proxy-Argument als Parameter hinzu:

    browser = await launch(args=(f'--proxy-server={proxy_url}'))

Im Übrigen bleibt das Primärbeispiel unverändert.

Ändern von Benutzeragenten

Im Gegensatz zu Proxys werden Benutzeragenten nach dem Start des Browsers angegeben und als Parameter für die gestartete Seite angegeben. Lassen Sie uns eine leere Seite erstellen:

    page = await browser.newPage()

Als nächstes erstellen Sie eine Variable zum Speichern des Benutzeragenten. Dies ist aus Gründen der Bequemlichkeit und zur Vereinfachung des Prozesses des Ersetzens und Ersetzens bei Bedarf erforderlich.

    user_agent = "Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail Firefox/firefoxversion"

Legen Sie dann den angegebenen Benutzeragenten fest.

    await page.setUserAgent(user_agent)

Pyppeteer verwendet jetzt beim Besuch einer Website den angegebenen Benutzeragenten. Um das Risiko einer Blockierung zu verringern, können Sie eine Reihe von Benutzeragenten erstellen und beim Erstellen einer neuen Seite zufällig einen aus der Liste auswählen. Dadurch wird es für Websites schwieriger, Ihre Scraping-Aktivitäten zu identifizieren und zu blockieren.

Cookies verwalten

Cookies werden auf der Seite auf die gleiche Weise wie der Benutzeragent als Parameter angegeben:

    cookie = {'name': 'example_cookie', 'value': '123456789'}
    await page.setCookie(cookie)

Pyppeteer unterstützt neben den hier besprochenen noch viele weitere Parameter. Für eine vollständige Liste können Sie die offizielle Dokumentation verwenden.

Im einfachen Beispiel haben wir gezeigt, wie man über einen Link zu einer Seite navigiert. In diesem Abschnitt erfahren Sie, wie Sie alle gewünschten Informationen aus einer Seite extrahieren, einschließlich Daten von Seiten mit dynamisch geladenen Inhalten. Als Beispiel verwenden wir die OpenCart-Demoseite.

Holen Sie sich HTML-Inhalte

Lassen Sie uns die Hauptfunktion im Hauptbeispiel ändern und zur OpenCart-Demoseite navigieren.

    await page.goto('https://demo.opencart.com/')

Extrahieren Sie als Nächstes den gesamten Inhalt der Seite.

    content = await page.content()

Und drucken Sie das Ergebnis auf dem Bildschirm aus:

    print(content)

Wenn Sie die Anweisungen korrekt befolgt haben, sehen Sie im Terminal oder in der Eingabeaufforderung den gesamten HTML-Code der von Ihnen angeforderten Seite.

Verwendung von XPath- und CSS-Selektoren für Data Scraping

Normalerweise benötigen wir nur bestimmte Elemente einer Seite, wie Produkte, Überschriften oder Preise, nicht den gesamten HTML-Code. Um diese Daten zu extrahieren, können wir CSS-Selektoren oder XPath verwenden. CSS-Selektoren sind für Anfänger einfacher, während XPath erweiterte Funktionen und Fähigkeiten bietet. Letztendlich hängt die beste Option für Sie von Ihren spezifischen Bedürfnissen ab.

Pyppeteer unterstützt sowohl CSS-Selektoren als auch XPath. Werfen wir einen Blick darauf, wie man jedes einzelne verwendet. Beispielsweise extrahieren wir alle h1-Überschriften einer Seite. Dazu können wir die Funktion querySelector() verwenden:

    await page.goto('https://demo.opencart.com/')
    element = await page.querySelector('h1')

In diesem Stadium erhalten wir das gesamte Element, nicht nur seinen Inhalt. Um den Textinhalt aus dem Element zu extrahieren, verwenden wir die folgende Funktion:

    text_content = await page.evaluate('(element) => element.textContent', element)

Um zu überprüfen, ob die Extraktion erfolgreich war, können wir den Textinhalt auf der Konsole ausgeben:

    print(text_content)

Mithilfe von CSS-Selektoren können Sie alle erforderlichen Informationen aus einer Seite extrahieren. Für ein besseres Beispiel extrahieren wir jedoch dieselben Daten mit XPath. Das Extraktionsprinzip für XPath ähnelt dem, was wir bereits gesehen haben:

    element = await page.xpath('//h1')
    text_content = await page.evaluate('(element) => element.textContent', element(0))

Beachten Sie, dass im Fall von XPath page.xpath() gibt eine Liste von Elementen zurück, daher müssen wir über seinen Index auf das Element zugreifen (z. B. element(0)).

Umgang mit Zeitüberschreitungen

Pyppeteer bietet Methoden zur Behandlung von Zeitüberschreitungen, um dem Browser genügend Zeit zum Abschließen von Vorgängen zu geben. Sie können beispielsweise beim Navigieren zu einer Seite den Timeout-Parameter verwenden, um die maximale Seitenladezeit zu begrenzen:

    await page.goto('https://demo.opencart.com/', {'timeout': 5000})

Dadurch wird der Browser angewiesen, bis zu 5 Sekunden auf das Laden der Seite zu warten, bevor ein Timeout-Fehler ausgegeben wird.

Die Implementierung wartet auf das Laden der Seite

Darüber hinaus können Sie die verwenden waitUntil() Methode, um anzugeben, wann die Navigation Ihrer Meinung nach erfolgreich war. Sie könnten beispielsweise das Ladeereignis verwenden, um darauf zu warten, dass die Seite vollständig geladen ist oder die domcontentloaded Ereignis, das darauf wartet, dass das DOM geladen wird:

    page.goto('https://demo.opencart.com/', waitUntil="load")

Dadurch wird der Browser angewiesen, auf die Auslösung des Ladeereignisses zu warten, bevor er fortfährt.

Dynamische Seiten kratzen

Um das Laden einer Seite mit dynamisch generiertem Inhalt zu verfolgen, können Sie einen Selektor für ein dynamisch geladenes Element verwenden und darauf warten, dass es geladen wird.

    await page.waitForSelector('#someDynamicElement')

Wenn Sie diese Funktion also verwenden, nachdem Sie zu einer Seite navigiert sind, wartet Ihr Skript, bis das erforderliche Element auf der Seite erscheint, bevor es mit der Ausführung fortfährt.

Interaktion mit der Seite

Die Datenerfassung ist ein wichtiger Teil des Scraping-Prozesses, aber es ist auch wichtig, Benutzeraktionen nachzuahmen. Dies trägt dazu bei, das Risiko einer Blockierung zu verringern und sicherzustellen, dass Sie alle benötigten Daten erhalten, auch wenn diese unter der Falte verborgen sind. Mit Pyppeteer können Sie auch mit Formularen interagieren, um Daten daraus zu extrahieren und diese auszufüllen. Dies kann wichtig sein, wenn Sie eine Website crawlen, die eine Authentifizierung erfordert.

Anklicken von Schaltflächen und Elementen

Eine der wichtigsten und am häufigsten verwendeten Aktionen ist das Klicken auf eine Schaltfläche oder ein Element. Pyppeteer unterscheidet nicht zwischen diesen Aktionen und sie werden auf die gleiche Weise ausgeführt:

  1. Suchen Sie das Element anhand seines Selektors.
  2. Klicken Sie mit dem darauf click() Funktion.

Schauen wir uns ein Beispiel an, wie man mit einem auf eine Schaltfläche klickt id="button":

    await page.click('#button')

Pyppeteer wartet, bis der Klick abgeschlossen ist, bevor weitere Aktionen ausgeführt werden. Sie können explizit warten, bis der Klick abgeschlossen ist (z. B. „await page.waitForNavigation()). Die einzige Ausnahme besteht darin, dass der Klick eine Navigation zu einer anderen Seite auslöst.

Füllen Sie ein Eingabefeld aus

Der type() Die Funktion dient zum Ausfüllen von Formularen. Es funktioniert ähnlich wie das click() Funktion, aber anstatt auf ein Element zu klicken, gibt es Text hinein. Benutzen type()wählen Sie das Element über seinen Selektor aus und übergeben Sie den Text, den Sie eingeben möchten, an die Funktion.

    await page.type('input(name="username")', 'put_your_text')

Wenn Sie den Text hingegen aus einem Eingabeformular abrufen möchten, können Sie Folgendes verwenden:

    input_text = await page.evaluate('document.querySelector("input(name="username")").value')

Dies kann nützlich sein, wenn Sie Daten aus nicht bearbeitbaren Feldern extrahieren müssen, die automatisch generiert werden.

Bestimmte Aktionen ausführen

Pyppeteer bietet umfangreiche Möglichkeiten zur Ausführung von JavaScript-Code im Kontext einer Seite, mit denen Aktionen ausgeführt werden können, die mit den Standard-APIs nicht möglich sind. Beispielsweise haben wir diesen Ansatz zuvor verwendet, um den Wert eines Eingabefelds zu ermitteln. Wie wir im vorherigen Beispiel gezeigt haben, können Sie die verwenden page.evaluate() Methode zum Ausführen beliebigen JavaScript-Codes.

    await page.evaluate('console.log("Hello world!")')

Wenn Sie mehr Kontrolle über die Simulation von Benutzeraktionen wünschen, unterstützt Pyppeteer eine Vielzahl spezieller Funktionen, wie beispielsweise die Simulation des Drückens der Eingabetaste:

     await page.keyboard.press('Enter')

Oder sogar mit der Maus über ein Element fahren:

    await page.hover('.example-element')

Eine vollständige Liste der Funktionen finden Sie in der offiziellen Dokumentation.

Melden Sie sich mit Pyppeteer an

Lassen Sie uns alles, was wir besprochen haben, kombinieren und ein kleines Skript entwickeln, um die Benutzerauthentifizierung mit Pyppeteer zu simulieren. Wir verwenden die Grundvorlage aus dem ersten Beispiel und nehmen dazu einige Änderungen vor. Nachdem wir zur Seite navigiert sind, finden wir die erforderlichen Felder und füllen das Formular aus:

    await page.type('#login-input', 'login')
    await page.type('#password-input', 'password')

Dann finden wir die Schaltfläche „Anmelden“ und klicken darauf.

    await page.click('#login-button')

Alternativ können Sie stattdessen auch das Drücken der Eingabetaste simulieren, da der Cursor nach dem Ausfüllen von Formularen im Eingabefeld bleibt.

Seitenscrollen

Um eine Seite in Pyppeteer zu scrollen, müssen Sie verwenden page.evaluate() um JavaScript-Code im Kontext der Seite auszuführen. Um beispielsweise eine Seite um 300 Pixel nach unten zu scrollen, können Sie diesen Code verwenden:

    await page.evaluate('window.scrollBy(0, 300)')

Mit dieser Scroll-Option können Sie die Seite horizontal und vertikal frei scrollen.

Screenshots aufnehmen

Pyppeteer bietet eine spezielle Funktion zum Erstellen von Screenshots. Diese Funktion unterstützt das Speichern von Screenshots in mehreren Formaten, einschließlich PNG und JPEG. PNG ist ein verlustfreies Komprimierungsformat, das qualitativ hochwertige Bilder erzeugt, während JPEG ein verlustbehaftetes Komprimierungsformat ist, das kleinere Dateigrößen erzeugt.

    await page.screenshot({'path': 'folder/path/screenshot.png'})

Um Screenshots in einem separaten Ordner zu speichern, stellen Sie sicher, dass der Ordner vorhanden ist und Sie über die Berechtigung zum Schreiben darauf verfügen. Andernfalls schlägt das Skript fehl.

Fehlerbehebung und Fehlerbehandlung

Bei der Verwendung von Pyppeteer können Fehler auftreten, die durch falsche Paketinstallationen, Abhängigkeiten oder Versionen oder durch fehlende erforderliche Komponenten verursacht werden. Schauen wir uns die häufigsten Fehler an und wie man sie behebt.

Häufige Probleme wie „Pyppeteer ist nicht installiert“

Die Fehlermeldung „Pyppeteer nicht installiert“ weist darauf hin, dass das Paket entweder nicht installiert ist oder als nicht installiert gilt. Dieser Fehler tritt normalerweise auf, weil die Paketinstallation mit einem Fehler abgebrochen wurde, beispielsweise aufgrund einer Versionsinkongruenz.

Wie eingangs erwähnt, funktioniert Pyppeteer nur mit Python 3.6 und höher. In diesem Fall sollten Sie Python auf eine neuere Version aktualisieren oder neu installieren. Wenn Sie Python 3.6 oder höher verwenden, können Sie versuchen, Pyppeteer noch einmal zu installieren:

pip install pyppeteer

In einigen Fällen kann es zu Problemen aufgrund der Inkompatibilität zwischen Pyppeteer und dem installierten Chromium kommen. Versuchen Sie, bestimmte, kompatible Versionen zu installieren:

pip install pyppeteer==<version>
pyppeteer-install --force

Geben Sie die Version an, die Sie auf der Seite „Pyppeteer-Releases“ auf GitHub finden.

Umgang mit unerwarteten Browserschließungen in Pyppeteer

Die möglichen Lösungen für diesen Fehler hängen von seiner Ursache ab. Wenn Sie beispielsweise Pyppeteer gerade erst installiert haben und Probleme beim Starten des Browsers haben, ist die Chromium-Installation möglicherweise nicht erfolgreich. In diesem Fall können Sie versuchen, den Browser und seine Abhängigkeiten neu zu installieren.

pyppeteer-install

Wenn Sie befürchten, dass der Browser während der Skriptausführung unerwartet geschlossen wird, können Sie zur Behandlung dieser Fälle standardmäßige Try/Catch-Blöcke verwenden.

Die Bibliothek, die Pyppeteer hinsichtlich der Funktionalität am ähnlichsten ist, ist Selenium. Allerdings verfügt Pyppeteer über ähnliche Funktionen wie andere Python-Scraping-Bibliotheken, wie etwa Beautiful Soup oder Scrapy. In diesem Abschnitt wird Pyppeteer mit anderen Bibliotheken, Scraping-Ansätzen oder Datenverarbeitungsmethoden verglichen.

Pyppeteer vs. BeautifulSoup

Für einen prägnanteren und informativeren Vergleich finden Sie hier eine Tabelle, die die wichtigsten Unterschiede zwischen Pyppeteer und BeautifulSoup zusammenfasst:

Besonderheit Pyppeteer Schöne Suppe
Zweck Automatisierung von Browserinteraktionen, dynamischer Inhaltsausführung und Benutzeraktionen. Parsen von HTML- und XML-Dokumenten, Extrahieren von Informationen aus statischem Markup.
Benutzerfreundlichkeit Komplex aufgrund der Notwendigkeit, die Browserinstanz und den asynchronen Code zu verwalten. Bietet einen einfacheren und deklarativeren Ansatz für die HTML-Analyse.
Leistung Kann langsamer sein, insbesondere bei der Verarbeitung großer Mengen dynamischer Inhalte Effizienter für das Parsen statischer Seiten.
Anwendungsfälle Interaktion mit dynamischen Webseiten, Scraping von Daten nach der JavaScript-Ausführung, Erstellen von Screenshots und mehr. Datenextraktion aus statischem HTML, Navigieren und Durchsuchen von Markups.

Die Wahl zwischen BeautifulSoup und Pyppeteer hängt von den spezifischen Anforderungen Ihres Projekts ab. Wenn Sie Daten von statischen Webseiten analysieren müssen, ist BeautifulSoup eine einfachere und schnellere Option. Wenn Sie jedoch Benutzeraktionen simulieren oder mit dynamischen Webseiten interagieren müssen, ist Pyppeteer die bessere Wahl.

Pyppeteer vs. Scrapy

Schauen wir uns eine Vergleichstabelle von Pyppeteer und Scrapy an:

Besonderheit Pyppeteer Scrapy
Zweck Web Scraping mit Browser-Automatisierung Universelles Web-Crawling und Scraping
Browser-Automatisierung Ja Nein (Schwerpunkt auf HTTP-Anfragen)
Benutzerfreundlichkeit Komplexer aufgrund der Browser-Integration Einfacher zu verwenden
Skalierbarkeit Geeignet für kleinere Projekte Entwickelt für skalierbares und großflächiges Schaben
Flexibilität Bietet Flexibilität für komplexe Szenarien Weniger flexibel für Szenarien, die Browser-Interaktivität erfordern
Leistung Langsamer aufgrund des Browser-Startaufwands Schneller für herkömmliches HTTP-basiertes Scraping

Wie Sie der Tabelle entnehmen können, eignen sich Pyppeteer und Scrapy für unterschiedliche Zwecke. Pyppeteer ist die bessere Wahl für kleine Projekte, die die Verarbeitung dynamischer Webseiten oder die Ausführung von JavaScript erfordern. Scrapy eignet sich besser für große oder skalierbare Projekte, die einfache HTML-Seiten scrapen.

Pyppeteer vs. Selenium

Schauen wir uns eine Vergleichstabelle von Pyppeteer und Selen an:

Besonderheit Pyppeteer Selen
Browser-Unterstützung Nur Chrom Mehrere Browser (Chrome, Firefox, Edge usw.)
Asynchronität Asynchron (asynchron/warten) Synchron (unterstützt asynchron, aber traditionell synchron)
Anwendungsfälle Ideal für Headless-Automatisierung und Web-Scraping Universelle Webautomatisierung, Tests und Browserinteraktionen
Leistung Im Allgemeinen schneller aufgrund seiner asynchronen Natur Aufgrund der Synchronität und zusätzlicher Schichten etwas langsamer

Selenium und Pyppeteer sind beide beliebte Open-Source-Tools für die Webautomatisierung. Sie bieten ähnliche Funktionen und Fähigkeiten, es gibt jedoch einige wesentliche Unterschiede, die bei der Wahl zwischen ihnen berücksichtigt werden müssen.

Die Wahl zwischen beiden hängt in erster Linie von der Notwendigkeit einer asynchronen Ausführung und persönlichen Vorlieben ab. Darüber hinaus wird Pyppeteer häufig für Headless-Aufgaben und Einfachheit bevorzugt, während Selenium aufgrund seiner Vielseitigkeit für eine Vielzahl von Web-Automatisierungsszenarien geeignet ist.

Fazit und Erkenntnisse

In diesem Artikel haben wir verschiedene Aspekte und Anwendungsfälle der Pyppeteer-Bibliothek besprochen, von der Installation und ihren Kernfunktionen bis hin zu möglichen Problemen und Vergleichen mit anderen verfügbaren Scraping-Bibliotheken und Frameworks.

Insbesondere haben wir behandelt, wie man Daten mithilfe von Benutzeragenten und Cookies konfiguriert und personalisiert, Daten findet und extrahiert, echte Benutzeraktionen nachahmt und verschiedene Elemente auf einer Seite steuert. Wir haben auch mögliche Probleme bei der Verwendung von Pyppeteer besprochen, wie etwa Ratenbegrenzung und Browsererkennung.

Insgesamt ist Pyppeteer eine leistungsstarke und vielseitige Bibliothek, die für verschiedene Scraping-Aufgaben verwendet werden kann. Es ist einfach zu erlernen und zu verwenden und bietet eine breite Palette an Funktionen, was es zu einer guten Wahl sowohl für Anfänger als auch für erfahrene Scraper macht.

Related Posts

Hinterlasse einen Kommentar