Daten von einer Webseite auf stabile und effiziente Weise abrufen

11

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 .

Mike
quelle
8
Es gibt keinen stabilen Weg, egal wie Sie Ihr Scraping implementieren, es kann leicht mit einer einfachen Änderung der Webseite brechen. Der stabile Weg, um Ihre Daten zu erhalten, besteht darin, die Autoren der Daten zu kontaktieren und einen Deal zu vermitteln, damit Sie die Daten in einem vernünftigen Format erhalten. Manchmal kostet das nicht einmal Geld.
Joachim Sauer
1
@ JoachimSauer - Die Frage konnte immer noch mit der 'besten' Methode beantwortet werden.
Anonym
Da die meisten Websites dynamisch sind und ihre Daten in Datenbanken speichern, ist es am besten, die Datenbank von der Website abzurufen. Wenn die Website über eine API verfügt, können Sie diese verwenden. Wenn Sie die statischen Seiten entfernen möchten, funktionieren die integrierten Python-Module urllib und HTMLParser einwandfrei. Einige Pakete zum Scraping von HTML sind auch bei PyPi verfügbar.
Ubermensch
Site Scraping ist ein heikles Geschäft. Es gibt wirklich keinen stabilen Weg, dies zu tun, weil Websitebesitzer dies nicht möchten und die Branche als Ganzes versucht, die Leute davon abzuhalten, dies zu tun.
Steven Evers
1
Vielleicht einen Webbrowser wie Webkit einbetten und dann DOM-Scripting verwenden, um Informationen von der gerenderten Seite abzurufen? Fast jede Plattform kann das, aber so würden Sie es in Qt machen: doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
user16764

Antworten:

2

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).

K.Steff
quelle
Danke, ich werde mir XPath auf jeden Fall noch einmal ansehen. Ich bin es nicht gewohnt, damit zu arbeiten, also ist es eine schöne Sache zu lernen. +1 :)
Mike
5

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 .

gsscoder
quelle
Und mit "HTTP-Netzwerkcode" meinen Sie die Erfassung der Antwort des Servers, wenn eine Anfrage gestellt wird? Vielen Dank für die Vorschläge, ich werde sie mir sicher ansehen. +1
Mike
Genau. In .NET können Sie System.Net.WebClient oder eine Bibliothek wie RestSharp | verwenden restsharp.org . Ich habe es auch auf Mono für Droid verwendet.
Gsscoder
4

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.

Andrea
quelle
Danke, ich habe Beautiful Soup verwendet , um die Arbeit zu erledigen. Ich weiß, dass es nicht stabil sein wird, das sollte ich wahrscheinlich in meinen Fragen klarstellen. +1 für Sie :)
Mike
4

Als Nebenfrage: Wie würden Sie vorgehen, wenn die Webseite von Ajax-Aufrufen erstellt wird?

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.

Dunkle Nacht
quelle
2
Es ist erwähnenswert, dass viele Dienste die HTTP-Header überprüfen, um sicherzustellen, dass dies der Fall HTTP_X_REQUESTED_WITHist XMLHttpRequest. 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.
Tim Post
@ TimPost Sie sind 100% korrekt. Ich bin damit einverstanden, dass es in der Tat "icky" ist :), aber in Ermangelung einer öffentlichen API muss ..
Darknight
Ich könnte dies für meine eigene AJAX-basierte Anwendung verwenden (und mit "eigen" meine ich nicht, dass ich es geschrieben habe, aber das Setup gehört mir), aber es wäre nicht richtig, zu versuchen, das System eines anderen Servers zu umgehen, also muss ich @ zustimmen TimPost, es fühlt sich irgendwie "eklig" an. Es ist jedoch eine gute Idee, danke! +1!
Mike
1

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.

nohros
quelle
Ich weiß, dass HTML-Seiten nicht von Computern analysiert werden sollten, aber manchmal gibt es einfach keine andere Option. Außerdem verwende ich öffentlich zugängliche Informationen für ein persönliches Projekt, das in keiner Weise kommerziell ist. Ich glaube nicht, dass ich eine ausdrückliche Genehmigung benötige, oder? Danke für deinen Beitrag! +1 auch für dich;)
Mike
@MikeHeremans Um zu erfahren, ob Sie berechtigt sind, Informationen von einer Website abzurufen, lesen Sie die ToS und robots.txt. Wenn beide Ihnen nicht das Recht verweigern, Informationen automatisch abzukratzen, sollten Sie in den meisten Fällen rechtlich in Ordnung sein. Natürlich, IANAL ...
K.Steff
Wenn Sie den Code des genannten Projekts sehen möchten : code.google.com/p/acao-toolkit/source/browse/… . Überprüfen Sie die Datei content_script.js. Dies ist der Code, der auf der Seite eingefügt wird.
Nohros