Frage

Wie kann man auf intelligente Weise Daten von Suchergebnissen auf einer Seite zurück analysieren?

Zum Beispiel kann sagen, dass ich mag einen Web-Service erstellen, die durch Analysieren der Suchergebnisse von Websites viele Buchanbieter für Online-Bücher durchsucht. Ich konnte die rohen HTML-Daten auf der Seite bekommen und einige regexs tun, um die Daten Arbeit für meinen Web-Service zu machen, aber wenn eine der Websites, die Formatierung der Seiten ändern, mein Code Pausen!

RSS ist in der Tat eine wunderbare Option, aber viele Seiten haben keine XML / JSON-basierte Suche.

Gibt es Kits gibt, die automatisch auf den Seiten Informationen verbreiten helfen? Eine verrückte Idee wäre, eine Fuzzy-AI-Modul haben, Muster erkennen auf einer Seite Suchergebnisse und die Ergebnisse entsprechend analysieren ...

War es hilfreich?

Lösung

Ich habe einige dieser vor kurzem getan, und hier sind meine Erfahrungen.

Es gibt drei grundlegende Ansätze:

  1. Reguläre Ausdrücke.
    • Die flexible, am einfachsten mit losem strukturierten Informationen und Ändern von Formaten zu verwenden.
    • Härtere Struktur / tag Analyse zu tun, aber einfache Textanpassung zu tun.
    • Errichtet in der Validierung von Datenformatierung.
    • härter als andere zu halten, weil Sie einen regulären Ausdruck für jedes Muster zu extrahieren Sie wollen schreiben verwenden / verwandeln das Dokument
    • Im Allgemeinen langsamer als 2 und 3
    • Funktioniert gut für Listen ähnlich formatierten Elemente
    • Ein gutes Regex Entwicklung / Test-Tool und einige Musterseiten helfen. Ich habe gute Dinge wurden hier über RegexBuddy zu sagen. Probieren Sie mal die Demo.
    • Ich habe den größten Erfolg mit diesem hat. Die Flexibilität können Sie arbeiten mit fiesen, brutal in the wild HTML-Code.
  2. HTML zu XHTML konvertieren und XML-Extraktionstools verwenden. Bereinigen HTML, wandeln es in Rechts XHTML, und verwenden Sie XPath / XQuery / X-was auch immer es als XML-Daten abfragen.
    • Werkzeuge: tagsoup, HTMLTidy, etc
    • Qualität von HTML-to-XHML Umwandlung ist sehr wichtig und sehr variabel.
    • Beste Lösung, wenn Daten, die Sie durch das HTML-Layout und Tags (Daten in HTML-Tabellen, Listen, DIV / SPAN-Gruppen, usw.)
    • strukturiert wollen
    • Am besten geeignet für das Erhalten Linkstruktur, verschachtelte Tabellen, Bilder, Listen, usw.
    • Sollte schneller als Option 1, aber langsamer als Option 3.
    • Funktioniert gut, wenn Content-Formatierung Änderungen / variabel, aber Dokumentstruktur / Layout nicht.
    • Wenn die Daten nicht durch HTML-Tags strukturiert ist, sind Sie in Schwierigkeiten.
    • Kann mit Option 1 verwendet werden.
  3. Parser-Generator (ANTLR, etc.) - Erstellen Sie eine Grammatik für die Analyse und die Seite zu analysieren.
    • Ich habe nicht versucht, weil es nicht geeignet für meine (unordentlich) Seiten
    • war
    • Die meisten geeignet, wenn HTML-Struktur sehr strukturiert, sehr konstant, regelmäßig, und ändert sich nie.
    • verwenden, wenn es einfach zu beschreiben Muster im Dokument, aber sie keine HTML-Tags beinhalten und Rekursion oder komplexe Verhaltensweisen
    • beinhalten
    • Erfordert keine XHTML-Eingang
    • FASTEST Durchsatz, in der Regel
    • Große Lernkurve, aber leichter pflegen

Ich habe gebastelt mit Web-Ernte für Option 2, aber ich finde ihre Syntax sein irgendwie komisch. Mix von XML und einig pseudo-Java-Skriptsprache. Wenn Sie wie Java, und wie XML-Stil Datenextraktion (XPath, XQuery), die vielleicht das Richtige für Sie sein.


Edit: Wenn Sie reguläre Ausdrücke verwenden, stellen Sie sicher, dass Sie eine Bibliothek mit faulen Quantifizierer verwenden und einfangenden Gruppen! PHP ältere regex Bibliotheken fehlen diese, und sie sind unverzichtbar, um Daten zwischen Öffnen / Schließen-Tags in HTML entspricht.

Andere Tipps

Ohne festgelegt HTML-Struktur zu analysieren, würde ich hasse für die Suche nach Daten von regulären Ausdrücken zu halten. Vielleicht haben Sie mehr Glück haben die HTML durch einen richtigen Parser verarbeiten, die den Baum aufbaut. Dann Elemente wählen ... das wäre besser verwaltbar.

Offensichtlich ist der beste Weg, um einige XML-Ausgabe aus dem Motor mit einem festen Markup, das Sie analysieren und validieren können. Ich würde denken, dass ein HTML-Parsing-Bibliothek mit einigen ‚im Dunkel‘ des erzeugten Baumes Sondieren wäre einfacher, als regulärer Ausdrücke zu halten.

Auf diese Weise müssen Sie nur noch auf <a href="blah" class="cache_link">... überprüfen Drehen in <a href="blah" class="cache_result">... oder was auch immer.

Unterm Strich würde greppen spezifische Elemente mit regexp düster. Ein besserer Ansatz ist es, einen DOM wie Modell der Seite zu bauen und für ‚Anker‘ in Zeichendaten in dem Tags suchen.

oder E-Mail Bitte senden Sie auf der Website einen Fall für eine XML-API unter Angabe ... Sie könnten angeheuert!

Sie sagen nicht, welche Sprache Sie verwenden. In Java landen Sie tagsoup und XPath, um die Schmerzen minimieren können. Es ist ein Beispiel von diesem Blog (natürlich kann die XPath viel komplizierter als Ihre Bedürfnisse diktieren):

URL url = new URL("http://example.com");
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup
Document doc = builder.build(url);
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title");
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml");
String title = ((Element)titlePath.selectSingleNode(doc)).getText();
System.out.println("Title is "+title);

Ich würde empfehlen, die XPath-Ausdrücke Externalisierung, so dass Sie ein gewisses Maß an Schutz, wenn die Seite ändert.

Hier ist ein Beispiel XPath Ich benutze definitiv nicht diese Website zu screenscrape. No way, nicht ich:

"//h:div[contains(@class,'question-summary')]/h:div[@class='summary']//h:h3"

Sie haben nicht die Technologie-Stack Sie verwenden erwähnt. Wenn Sie HTML sind Parsen, würde ich eine Parsing-Bibliothek verwenden:

Es gibt auch einen Web Service, die genau das tun, was Sie sagen - kommerzielle und kostenlos. Sie kratzen Websites und bieten Webservice-Schnittstellen.

Und ein generisches webservice, dass einige Screen Scraping bietet, ist Yahoo Pipes. vorherige Frage Stackoverflow auf, dass

Leider ‚Schaben‘ ist die gängigste Lösung, wie Sie HTML von Websites zu analysieren, die versuchen. Sie könnten eine Warnung strukturelle Änderungen an der Seite und Flagge erkennen für Sie zu beheben, so dass eine Änderung an ihrem Ende führt nicht bum Daten. Bis das Semantic Web ist eine Realität, das ist so ziemlich der einzige Weg, eine große Datenmenge zu gewährleisten.

Alternativ können Sie auf kleine Datensätze stehen zu APIs zur Verfügung gestellt. Yahoo arbeiten sehr hart durchsuchbare Daten über APIs zur Verfügung zu stellen (siehe YDN), ich denke, die Amazon-API eine Menge Buchdaten eröffnet, etc etc.

Hope, die ein bisschen hilft!

EDIT: Und wenn Sie PHP verwenden Ich würde empfehlen, SimpleHTMLDOM

Haben Sie sich in eine HTML-Manipulation-Bibliothek? Ruby hat ein paar ziemlich Netten. zB hpricot

Mit einer guten Bibliothek Sie die Teile der Seite angeben, können Sie CSS-Selektoren oder XPath verwenden möchten. Dies wäre ein gutes Geschäft robuster als regexps verwendet wird.

Beispiel von hpricot wiki:

 doc = Hpricot(open("qwantz.html"))
 (doc/'div img[@src^="http://www.qwantz.com/comics/"]')
   #=> Elements[...]

Ich bin sicher, Sie könnten eine Bibliothek finden, die ähnliche Dinge in .NET oder Python tut, etc.

Versuchen Sie, für Screen Scraping googeln + die Sprache, die Sie bevorzugen. Ich kenne mehrere Optionen für Python, können Sie das Äquivalent für die gewünschte Sprache finden:

  • Schöne Suppe
  • mechanisieren: ähnlich WWW Perl: Mechanize. Gibt Ihnen einen Browser wie Objekt ineract mit Web-Seiten
  • lxml: Python-Bindung an libwww
  • scrapemark: verwendet Vorlagen Stücke von Seiten zu kratzen
  • pyquery: Damit können Sie jQuery-Abfragen in XML / XHTML-Dokumente
  • machen
  • scrapy: ein hohes Maß Schaben und Web-Crawling-Rahmen Spinnen für das Schreiben von Web-Seiten
  • zu kriechen und analysieren

auf der Website Je kratzen Sie ein verwenden müssen oder mehrere der Ansätze oben.

Wenn Sie so etwas wie Tag Suppe verwenden können, das wäre ein Ort zu starten. Dann könnten Sie die Seite wie ein XML-API behandeln, irgendwie.

Es ist eine Java und C ++ Implementierung funktionieren können!

Petersilie unter http://www.parselets.com sieht ziemlich glatt.

Damit können Sie ‚parslets‘ mit JSON definieren, was sind Sie definieren, was für auf der Seite zu sehen, und es analysiert dann die Daten für Sie aus.

Wie schon andere gesagt haben, können Sie einen HTML-Parser verwenden, die eine DOM-Darstellung erstellt und Abfrage mit XPath / XQuery. Ich fand einen sehr interessanten Artikel hier: Java Theorie und Praxis: mit XQuery Screen-Scraping -

Na gut, ich werde die Tag Suppe Methode verwenden, wie empfohlen.

Als Followup Frage - wie auf der Erde tun die großen Schaber-Typ Websites, oder? Ich habe eine Job-Suchmaschine (z indeed.com), die Tausende von Websites durchsucht gesehen! Ist das Tausende von regulären Ausdrücken? Seine fast unmöglich ...

scroll top