2010-06-29 16 views
7

Wir entwickeln ein großangelegtes Web Scraping/Parsing Projekt. Grundsätzlich muss das Skript eine Liste von Webseiten durchgehen, den Inhalt eines bestimmten Tags extrahieren und in einer Datenbank speichern. Welche Sprache würden Sie dafür in großem Umfang empfehlen (Dutzende von Millionen Seiten?). .Welche Technologie für Scrapping/Parsing im großen Maßstab?

Wir verwenden MongoDB für die Datenbank, also ist alles mit soliden MongoDB-Treibern ein Plus.

Bisher haben wir PHP (lacht nicht), curl und Simple HTML DOM Parser verwendet, aber ich glaube nicht, dass das auf Millionen von Seiten skalierbar ist, zumal PHP kein richtiges Multithreading hat.

Wir brauchen etwas, das leicht zu entwickeln ist, auf einem Linux-Server laufen kann, einen robusten HTML/DOM-Parser zum einfachen Extrahieren dieses Tags hat und problemlos Millionen von Webseiten in einer angemessenen Zeitspanne herunterladen kann. Wir suchen nicht wirklich nach einem Web-Crawler, weil wir den Links nicht folgen und keinen Inhalt indexieren müssen. Wir müssen nur ein Tag von jeder Seite einer Liste extrahieren.

Antwort

1

Ich mache etwas ähnliches mit Java mit der HttpClient Commons-Bibliothek. Obwohl ich den DOM-Parser vermeide, weil ich nach einem spezifischen Tag suche, das leicht von einer Regex gefunden werden kann.

Der langsamste Teil der Operation ist die HTTP-Anfragen.

7

Wenn Sie wirklich über große Skala sprechen, dann wollen Sie wahrscheinlich etwas, das Sie horizontal skalieren lässt, zum Beispiel ein Map-Reduce Framework wie Hadoop. Sie können Hadoop-Jobs in mehreren Sprachen schreiben, sodass Sie nicht an Java gebunden sind. Hier ist zum Beispiel ein Artikel über writing Hadoop jobs in Python. BTW, das ist wahrscheinlich die Sprache, die ich verwenden würde, dank libs wie httplib2 für die Anforderungen und lxml für das Parsen der Ergebnisse.

Wenn ein Map-Reduce-Framework übertrieben ist, können Sie es in Python behalten und multiprocessing verwenden.

UPDATE: Wenn Sie kein MapReduce-Framework möchten und eine andere Sprache bevorzugen, lesen Sie die ThreadPoolExecutor in Java. Ich würde jedoch definitiv die Apache Commons HTTP-Client-Sachen verwenden. Das Zeug im JDK ist viel weniger programmierfreundlich.

3

Sie sollten wahrscheinlich Tools zum Testen von Webanwendungen (WatiN oder Selen) verwenden.

Sie können dann Ihren Workflow getrennt von den Daten mit einem Werkzeug, das ich geschrieben habe, erstellen.

https://github.com/leblancmeneses/RobustHaven.IntegrationTests

Sie sollten keine manuelle Analyse zu tun haben, wenn WatiN oder Selen verwendet wird. Sie werden stattdessen einen css querySelector schreiben.

Mit TopShelf und NServiceBus können Sie die Anzahl der Arbeiter horizontal skalieren.

FYI: Mit mono können diese Tools unter Linux laufen. (Obwohl Meilen variieren können)

Wenn JavaScript nicht ausgewertet werden muss, um Daten dynamisch zu laden: Alles, was das Dokument in den Arbeitsspeicher geladen werden muss, wird Zeit verschwenden. Wenn Sie wissen, wo Ihr Tag ist, brauchen Sie nur einen Sax Parser.

+0

Übrigens bietet NServiceBus (Verteilung, Persistenz, Sicherheit, Transaktionen und Zuverlässigkeit der Arbeit in der Warteschlange) - Beispiel: https://github.com/leblancmeneses/NWebHooks –

0

Was ist mit C++? Es gibt viele große Bibliotheken, die Ihnen helfen können.

boost asio kann Ihnen helfen, das Netzwerk zu tun.

TinyXML kann XML-Dateien parsen.

Ich habe keine Ahnung von Datenbank, aber fast alle Datenbank haben Schnittstellen für C++, es ist kein Problem.

Verwandte Themen