Hallo, Bewohner! Wenn Programmieren wie Magie ist, dann ist Web Scraping eine sehr mächtige Hexerei. Durch Schreiben eines einfachen automatisierten Programms können Sie Anforderungen an Webserver senden, Daten von diesen anfordern, diese analysieren und die benötigten Informationen extrahieren. Die neue erweiterte Ausgabe des Buches führt nicht nur das Web-Scraping ein, sondern hilft auch beim Sammeln jeglicher Art von Daten im modernen Internet. Teil I befasst sich mit der Mechanik des Web-Scraping: Verwendung von Python zum Anfordern von Informationen von einem Webserver, Durchführen einer grundlegenden Serverantwortverarbeitung und Organisieren automatisierter Interaktionen mit Websites. In Teil II werden spezifischere Tools und Anwendungen erläutert, die in jedem Web-Scraping-Szenario nützlich sind. - Analysieren Sie komplexe HTML-Seiten.- Entwickeln Sie Suchroboter mit dem Scrapy-Framework. - Erfahren Sie, wie Sie verkratzte Daten speichern. - Lesen und extrahieren Sie Daten aus Dokumenten. - Bereinigen und normalisieren Sie schlecht formatierte Daten. - Lesen und schreiben Sie Informationen in natürlichen Sprachen. - Beherrschen Sie die Suche nach Formularen und Anmeldungen. - Lernen Sie JavaScript-Scraping und API-Arbeit. - Verwenden und schreiben Sie Programme, um Bilder in Text umzuwandeln. - Lernen Sie, Kratzfallen und Bot-Blocker zu umgehen. - Testen Sie Ihre eigene Website mit Scraping.- Lernen Sie JavaScript-Scraping und API-Arbeit. - Verwenden und schreiben Sie Programme, um Bilder in Text umzuwandeln. - Lernen Sie, Kratzfallen und Bot-Blocker zu umgehen. - Testen Sie Ihre eigene Website mit Scraping.- Lernen Sie JavaScript-Scraping und API-Arbeit. - Verwenden und schreiben Sie Programme, um Bilder in Text umzuwandeln. - Lernen Sie, Kratzfallen und Bot-Blocker zu umgehen. - Testen Sie Ihre eigene Website mit Scraping.
Webcrawling mit API
JavaScript wird traditionell als universeller Fluch von Webcrawlern angesehen. Vor langer Zeit konnten Sie sicher sein, dass eine an einen Webserver gesendete Anfrage dieselben Daten empfängt, die ein Benutzer in seinem Browser sehen würde, wenn er dieselbe Anfrage stellt.
Da sich JavaScript- und Ajax-Methoden zum Generieren und Laden von Inhalten vermehren, wird die oben beschriebene Situation immer seltener. In Kapitel 11 haben wir uns einen Weg angesehen, um dieses Problem zu lösen: Selenium zur Automatisierung des Browsers und zum Abrufen von Daten. Das ist einfach zu machen. Das funktioniert fast immer.
Das Problem ist, dass sich jede Web-Scraping-Aufgabe wie ein Nagel anfühlt, wenn Sie einen Hammer in der Hand haben, der so stark und effektiv wie Selen ist.
In diesem Kapitel erfahren Sie, wie Sie unter Umgehung des gesamten JavaScript (ohne es auszuführen oder sogar zu laden!) Direkt auf die Datenquelle zugreifen können - die APIs, die diese Daten generieren.
Eine kurze Einführung in die API
Es gibt unzählige Bücher, Vorträge und Tutorials zu den Nuancen von REST-APIs, GraphQL21, JSON und XML, die jedoch alle auf einem einfachen Konzept basieren. Die API definiert eine standardisierte Syntax, die es einem Programm ermöglicht, mit einem anderen zu interagieren, selbst wenn sie in verschiedenen Sprachen geschrieben sind oder unterschiedliche Strukturen haben.
Dieser Abschnitt konzentriert sich auf Web-APIs (insbesondere solche, die es dem Webserver ermöglichen, mit dem Browser zu interagieren). Hier verstehen wir unter API diese Art von Schnittstelle. Sie können jedoch berücksichtigen, dass API in anderen Kontexten auch ein Oberbegriff ist, der beispielsweise eine Schnittstelle bedeuten kann, über die ein Java-Programm mit einem Python-Programm interagieren kann, das auf demselben Computer ausgeführt wird. API bedeutet nicht immer "Schnittstelle über das Internet" und muss keine Webtechnologien enthalten.
Web-APIs werden am häufigsten von Entwicklern verwendet, um mit weit verbreiteten und gut dokumentierten Open Source-Diensten zu interagieren. Beispielsweise bietet der amerikanische Kabelsport-Fernsehsender ESPN eine API (http://www.espn.com/apis/devcenter/docs/) für Informationen zu Athleten, Spielergebnissen usw. an. Google verfügt über einen Entwicklerbereich (https: / /console.developers.google.com) Es gibt Dutzende von APIs für Sprachübersetzung, Analyse und Geolokalisierung.
In der Dokumentation für alle diese APIs werden normalerweise Routen oder Endpunkte in Form von URLs beschrieben, die mit veränderlichen Parametern entweder als Teil dieser URLs oder als GET-Parameter angefordert werden können.
In der folgenden URL ist pathparam beispielsweise ein Pfadparameter:
example.com/the-api-route/pathparam
Und hier ist pathparam der Wert des Parameters param1:
example.com/the-api-route?param1=pathparam
Beide Methoden zum Übertragen von Daten an die API werden jedoch häufig verwendet. Wie viele andere Aspekte der Informatik sind sie Gegenstand hitziger philosophischer Diskussionen darüber, wann und wo Variablen über den Pfad und wann - über Parameter übergeben werden sollen.
Die Antwort auf eine API-Anfrage wird normalerweise im JSON- oder XML-Format zurückgegeben. Heutzutage ist JSON viel beliebter als XML, aber letzteres ist manchmal auch anzutreffen. Bei vielen APIs können Sie den Antworttyp auswählen, normalerweise mit einem anderen Parameter, der bestimmt, welchen Antworttyp Sie erhalten möchten.
Hier ist ein Beispiel für eine JSON-Antwort auf eine API-Anforderung:
{"user":{"id": 123, "name": "Ryan Mitchell", "city": "Boston"}}
Und hier ist die Antwort auf die API-Anfrage im XML-Format:
<user><id>123</id><name>Ryan Mitchell</name><city>Boston</city></user>
Die Website ip-api.com (http://ip-api.com/) verfügt über eine klare und bequeme API, die IP-Adressen in echte physische Adressen konvertiert. Sie können versuchen
, eine einfache API-Anfrage zu stellen, indem Sie die folgende IP-Adresse: ip-api.com/json/50.78.253.58 in Ihren Browser eingeben.
Sie erhalten dann eine Antwort wie folgt:
{"ip":"50.78.253.58","country_code":"US","country_name":"United States", "region_code":"MA","region_name":"Massachusetts","city":"Boston", "zip_code":"02116","time_zone":"America/New_York","latitude":42.3496, "longitude":-71.0746,"metro_code":506}
Beachten Sie, dass die Anforderung einen json-Pfadparameter enthält. Um eine Antwort im XML- oder CSV-Format zu erhalten, müssen Sie sie durch das entsprechende Format ersetzen:
ip-api.com/xml/50.78.253.58
ip-api.com/csv/50.78.253.58
API- und HTTP-Methoden
Im vorherigen Abschnitt Wir haben uns die API angesehen und eine GET-Anfrage an den Server gesendet, um Informationen zu erhalten. Es gibt vier Hauptmethoden (oder Methoden) zum Anfordern von Informationen von einem Webserver über HTTP:
- GET;
- POST;
- STELLEN;
- LÖSCHEN.
Technisch gesehen gibt es mehr als vier Arten von Anforderungen (z. B. HEAD, OPTIONS und CONNECT), die jedoch in der API nur selten verwendet werden und auf die Sie wahrscheinlich nie stoßen werden. Die überwiegende Mehrheit der APIs ist auf diese vier Methoden beschränkt, manchmal sogar auf einen Teil davon. Es gibt immer APIs, die nur GET oder nur GET und POST verwenden.
GET ist die Anforderung, die Sie beim Besuch einer Website verwenden, indem Sie deren Adresse in die Adressleiste Ihres Browsers eingeben. Wenn Sie ip-api.com/json/50.78.253.58 besuchen , verwenden Sie die GET-Methode. Diese Anfrage kann als Befehl betrachtet werden: "Hey, Webserver, bitte geben Sie mir diese Informationen."
Eine GET-Anforderung ändert per Definition nicht den Inhalt der Serverdatenbank. Nichts wird gespeichert und nichts wird geändert. Die Informationen werden nur gelesen.
POST ist eine Anforderung, die beim Ausfüllen eines Formulars oder beim Übermitteln von Informationen verwendet wird und vermutlich zur Verarbeitung durch ein Serverskript bestimmt ist. Jedes Mal, wenn Sie sich auf der Site anmelden, stellen Sie eine POST-Anfrage, indem Sie einen Benutzernamen und (hoffentlich) ein verschlüsseltes Passwort eingeben. Wenn Sie eine POST-Anfrage über die API stellen, teilen Sie dem Server mit: "Bitte speichern Sie diese Informationen in der Datenbank."
PUT-Anforderungen bei der Interaktion mit Websites werden seltener verwendet, treten jedoch von Zeit zu Zeit in der API auf. Diese Anforderung wird verwendet, um ein Objekt oder Informationen zu ändern. Beispielsweise kann die API eine POST-Anforderung zum Erstellen eines Benutzers und eine PUT-Anforderung zum Ändern ihrer E-Mail-Adresse verwenden.
DELETE-Anforderungen werden, wie Sie vielleicht vermuten, zum Löschen eines Objekts verwendet. Wenn Sie beispielsweise eine DELETE-Anforderung an myapi.com/user/23 senden , wird die Benutzer-ID 23 gelöscht. DELETE-Methoden werden in offenen APIs nicht häufig gefunden, da sie hauptsächlich zum Verteilen von Informationen oder zum Erstellen von Informationen erstellt werden oder Informationen veröffentlichen, aber nicht aus den Datenbanken entfernen.
Im Gegensatz zu GET-, POST-, PUT- und DELETE-Anforderungen können zusätzlich zur URL oder Route, von der die Daten angefordert werden, Informationen im Hauptteil der Anforderung übergeben werden.
Wie die vom Webserver empfangene Antwort sind diese Daten im Anforderungshauptteil normalerweise JSON oder weniger häufig XML. Das spezifische Datenformat wird durch die API-Syntax bestimmt. Wenn Sie beispielsweise eine API verwenden, die Kommentare zu Blog-Posts hinzufügt, können Sie die folgende PUT-Anforderung erstellen:
example.com/comments?post=123
mit einem Anforderungshauptteil wie diesem:
{"title": "Great post about APIs!", "body": "Very informative. Really helped me out with a tricky technical challenge I was facing. Thanks for taking the time to write such a detailed blog post about PUT requests!", "author": {"name": "Ryan Mitchell", "website": "http://pythonscraping.com", "company": "O'Reilly Media"}}
Beachten Sie, dass die Blogpost-ID (123) als Parameter in der URL übergeben wird und der Inhalt des von uns erstellten Kommentars im Anforderungshauptteil übergeben wird. Parameter und Daten können sowohl im Parameter als auch im Anforderungshauptteil übergeben werden. Welche Parameter benötigt werden und wo sie übergeben werden, hängt wiederum von der API-Syntax ab.
Weitere
Informationen zum Beantworten von API-Anforderungen Wie wir im Beispiel ip-api.com am Anfang dieses Kapitels gesehen haben, besteht ein wichtiges Merkmal von APIs darin, dass diese Schnittstellen gut formatierte Antworten zurückgeben. Die gängigsten Antwortformate sind XML (eXtensible Markup Language) und JSON (JavaScript Object Notation).
In den letzten Jahren ist JSON aus mehreren Hauptgründen viel beliebter als XML geworden. Erstens sind JSON-Dateien normalerweise kleiner als gut gestaltete XML-Dateien. Vergleichen Sie beispielsweise die folgenden XML-Daten mit einer Länge von 98 Zeichen:
<user><firstname>Ryan</firstname><lastname>Mitchell</
lastname><username>Kludgist</username></user>
Schauen Sie sich nun dieselben JSON-Daten an:
{"user":{"firstname":"Ryan","lastname":"Mitchell","username":"Kludgist"}}
Das sind nur 73 Zeichen, satte 36% weniger als bei denselben XML-Daten.
Natürlich ist das Argument wahrscheinlich, dass XML folgendermaßen formatiert werden kann:
<user firstname="ryan" lastname="mitchell" username="Kludgist"></user>
Dies wird jedoch nicht empfohlen, da diese Ansicht keine tiefe Datenverschachtelung unterstützt. Trotzdem ist der Eintrag 71 Zeichen lang - ungefähr so viel wie der entsprechende JSON.
Ein weiterer Grund, warum JSON so schnell populärer als XML wird, hat mit dem Wechsel der Webtechnologien zu tun. Bisher waren API-Empfänger meist serverseitige PHP- oder .NET-Skripte. Nun kann sich herausstellen, dass ein Framework wie Angular oder Backbone API-Aufrufe empfängt und sendet. Bis zu einem gewissen Grad ist es den Servertechnologien egal, wie die Daten für sie aussehen. JavaScript-Bibliotheken wie Backbone finden es jedoch einfacher, mit JSON umzugehen.
Es ist allgemein anerkannt, dass APIs eine Antwort entweder im XML- oder im JSON-Format zurückgeben, aber jede andere Option ist möglich. Der API-Antworttyp ist nur durch die Vorstellungskraft des Programmierers begrenzt, der diese Schnittstelle erstellt hat. Ein weiteres typisches Antwortformat ist CSV (wie im Beispiel von ip-api.com gezeigt). Mit separaten APIs können Sie sogar Dateien erstellen. Sie können eine Anfrage an den Server senden, der ein Bild mit dem angegebenen Text überlagert, oder Sie können eine bestimmte XLSX- oder PDF-Datei anfordern.
Einige APIs geben überhaupt keine Antwort zurück. Wenn Sie beispielsweise eine Anfrage an den Server senden, um einen Kommentar zu einem Blog-Beitrag zu erstellen, kann dieser nur einen HTTP-Antwortcode von 200 zurückgeben. Dies bedeutet: „Ich habe einen Kommentar gepostet. alles in Ordnung!" Andere Abfragen geben möglicherweise eine minimale Antwort wie folgt zurück:
{"success": true}
Im Fehlerfall erhalten Sie folgende Antwort:
{"error": {"message": "Something super bad happened"}}
Wenn die API nicht gut konfiguriert ist, erhalten Sie möglicherweise eine nicht entzifferbare Stapelverfolgung oder einen englischen Text. Wenn Sie eine Anforderung an eine API senden, ist es normalerweise sinnvoll, zunächst zu überprüfen, ob die empfangene Antwort tatsächlich im JSON-Format (oder XML oder CSV oder in dem von Ihnen erwarteten Format) vorliegt.
Über den Autor
Ryan Mitchell ist Senior Software Engineer bei HedgeServ, Boston, wo sie APIs und Tools für die Datenanalyse entwickelt. Ryan absolvierte das College of Engineering and Technology. Franklin V. Olin hat einen MSc in Software Engineering und ein Zertifikat in Datenanalyse und -verarbeitung aus den Weiterbildungskursen der Harvard University. Bevor sie zu HedgeServ kam, arbeitete Ryan bei Abine, wo sie Web-Scraper und Automatisierungstools in Python entwickelte. Er berät regelmäßig bei Web-Scraping-Projekten für Einzelhandel, Finanzen und Pharma. Arbeitet gleichzeitig als Berater und freiberuflicher Lehrer an der Northeastern University und dem College of Engineering and Technology. Franklin V. Olin.
Weitere Details zum Buch finden Sie auf der Website des Verlags
» Inhaltsverzeichnis
» Auszug
für Einwohner 25% Rabatt auf den Gutschein - Python
Nach Zahlung der Papierversion des Buches wird ein E-Book an das e gesendet -mail.