Kürzlich habe ich erfahren, dass die Verwendung eines regulären Ausdrucks zum Parsen des HTML-Codes einer Website, um die benötigten Daten zu erhalten, nicht die beste Vorgehensweise ist.
Meine Frage ist also einfach: Was ist dann der beste / effizienteste und allgemein stabile Weg, um diese Daten zu erhalten?
Ich sollte beachten, dass:
- Es gibt keine APIs
- Es gibt keine andere Quelle, aus der ich die Daten beziehen kann (keine Datenbanken, Feeds und dergleichen).
- Es besteht kein Zugriff auf die Quelldateien. (Daten von öffentlichen Websites)
- Angenommen, die Daten sind normaler Text, der in einer Tabelle auf einer HTML-Seite angezeigt wird
Ich verwende derzeit Python für mein Projekt, aber eine sprachunabhängige Lösung / Tipps wäre schön.
Als Nebenfrage: Wie würden Sie vorgehen, wenn die Webseite von Ajax-Aufrufen erstellt wird?
BEARBEITEN:
Beim HTML-Parsing weiß ich, dass es keinen stabilen Weg gibt, um die Daten abzurufen. Sobald sich die Seite ändert, ist Ihr Parser für fertig. Was ich in diesem Fall mit Stable meine, ist: eine effiziente Methode zum Parsen der Seite, die mir immer die gleichen Ergebnisse liefert (natürlich für den gleichen Datensatz), vorausgesetzt, die Seite ändert sich nicht .
Antworten:
Nun, hier sind meine 2 Cent:
Wenn kein AJAX beteiligt ist oder es einfach gelöscht werden kann, "korrigieren" Sie den HTML-Code in XHTML (z. B. mit HTMLTidy) und verwenden Sie XPath anstelle von regulären Ausdrücken, um die Informationen zu extrahieren.
Auf einer gut strukturierten Webseite befinden sich die logisch getrennten Informationseinheiten in verschiedenen
<div>
s oder einem anderen Tag, was bedeutet, dass Sie mit einem einfachen XPath-Ausdruck leicht die richtigen Informationen finden können. Dies ist auch deshalb großartig, weil Sie es beispielsweise in der Chrome-Konsole oder in der Firefox-Entwicklerkonsole testen und überprüfen können, ob es funktioniert, bevor Sie auch nur eine Zeile anderen Codes schreiben.Dieser Ansatz weist auch ein sehr hohes Signal-Rausch-Verhältnis auf, da Ausdrücke zur Auswahl der relevanten Informationen normalerweise Einzeiler sind. Sie sind auch viel einfacher zu lesen als reguläre Ausdrücke und wurden für diesen Zweck entwickelt.
Wenn die Seite AJAX und schwerwiegendes JavaScript enthält, binden Sie eine Browserkomponente in die Anwendung ein und verwenden Sie deren DOM, um die von Ihnen benötigten Ereignisse auszulösen, und XPath, um Informationen zu extrahieren. Es gibt viele gute einbettbare Browserkomponenten, von denen die meisten unter der Haube echte Browser verwenden. Dies ist eine gute Sache, da eine Webseite möglicherweise falsches (X) HTML enthält, aber dennoch in allen gängigen Browsern gut wiedergegeben wird ( Tatsächlich werden die meisten Seiten irgendwann so).
quelle
Nach meiner Erfahrung können Sie in einer .NET-Umgebung das HTML Agility Pack nutzen .
Wenn die Seite als XHTML formatiert ist, können Sie auch einen regulären XML-Parser verwenden. Es gibt viel für jede Umgebung, die Sie sich vorstellen können.
Bei der Nebenfrage zu AJAX können Sie normalen HTTP-Netzwerkcode verwenden, um Daten abzurufen und zu analysieren.
Wenn Ihr AJAX-Stack XML zurückgibt, haben Sie wieder viele Möglichkeiten. Wenn JSON zurückgegeben wird, ziehen Sie eine Bibliothek in Betracht, mit der Sie den Stream typisierten Objekten zuordnen können. In .NET schlage ich Ihnen Newtonsoft.Json vor .
quelle
Das Parsen von HTML ist keine völlig triviale Aufgabe, da man sich mit möglicherweise falschem Markup (Tag-Suppe) auseinandersetzen muss. Im Laufe der Jahre haben Browser mehr oder weniger dieselbe Strategie zur Behandlung von Fehlern implementiert, und dieser Algorithmus wurde in der HTML5-Spezifikation getauft (ja, die HTML5-Spezifikation gibt an, was mit Dingen zu tun ist, die nicht HTML5 sind).
Das sind Bibliotheken für alle wichtigen Sprachen, um HTML zu analysieren, zum Beispiel diese .
In jedem Fall ist das, was Sie erhalten, in keiner Weise stabil. Jedes Mal, wenn sich das Webseitenformat ändert, müssen Sie Ihren Scraper anpassen.
quelle
Wenn Ajax-Aufrufe getätigt werden, ist es sehr wahrscheinlich, dass es sich entweder um eine POST- oder eine GET-URL mit einigen Variablen handelt.
Ich würde das JavaScript untersuchen, um herauszufinden, was die Endpunkte und Parameter sind. Danach ist es sehr wahrscheinlich, dass die zurückgegebenen Daten entweder json / xml / Klartext oder teilweise HTML sind.
Sobald Sie die oben genannten Informationen kennen, stellen Sie einfach eine GET- oder POST-Anforderung an diesen Endpunkt und analysieren die zurückgegebenen Daten.
quelle
HTTP_X_REQUESTED_WITH
istXMLHttpRequest
. Gute implementieren auch eine Art XSRF-Schutz für POST-Anfragen, sodass Sie auch dieses magische Cookie benötigen. Das Kitzeln von AJAX-Endpunkten, die nicht absichtlich von einer öffentlichen API verfügbar gemacht wurden, ist für mich etwas schwierig, und Ihr Scraper ist genauso anfällig für Schäden, wenn sich die Ausgabe (oder Anforderungsrichtlinie) ändert.Es gibt keinen stabilen oder besseren Weg, dies zu tun. HTML-Webseiten wurden nicht für die Manipulation durch Computer erstellt. Es ist für menschliche Benutzer, aber wenn Sie es tun müssen, schlage ich vor, dass Sie einen Browser und etwas Javascript verwenden. Bei meiner Arbeit war ich an einem Projekt beteiligt, bei dem einige Informationen von einer Website eines Drittanbieters extrahiert werden müssen. Die Anwendung wurde als Chrome-Erweiterung entwickelt. Die Anwendungslogik wird mit Javascript geschrieben, das nach Abschluss des Seitenladens auf der Site eingefügt wird. Die extrahierten Daten werden über einen http-Server an eine Datenbank gesendet. Es ist nicht der beste Ansatz, aber es funktioniert. Ps: Der Site-Inhaber hat uns dazu autorisiert.
quelle