2016-01-19 9 views
7

Ich möchte den Inhalt einer Seite erhalten und die spezifischen Teile davon extrahieren. Soweit ich weiß, gibt es für diese Aufgabe mindestens zwei Lösungen: Crawler4j und Jsoup.Crawler4j vs Jsoup für die Seiten Crawlen und Parsen in Java

Beide von ihnen sind in der Lage, den Inhalt einer Seite abzurufen und Unterabschnitte daraus zu extrahieren. Das einzige, was ich nicht verstehe, was ist der Unterschied zwischen ihnen? Es gibt eine similar question, die als beantwortet markiert:

Crawler4j ein Crawler ist, Jsoup ein Parser ist.

Aber ich gerade überprüft, Jsoup 1.8.3 ist auch in der Lage, eine Seite neben einer Parsing-Funktionalität kriechen, während Crawler4j nicht nur in der Lage ist, die Seite Crawling aber ihr Inhalt Parsen.

Können Sie also bitte den Unterschied zwischen Crawler4j und Jsoup klären?

Antwort

20

Crawling ist etwas, das größer ist als nur den Inhalt eines einzelnen URIs abzurufen. Wenn Sie nur den Inhalt einiger Seiten abrufen möchten, gibt es keinen wirklichen Vorteil, wenn Sie etwas wie Crawler4J verwenden.

Schauen wir uns ein Beispiel an. Angenommen, Sie möchten eine Website crawlen. Die Anforderungen wären:

  1. Give Basis-URI (Startseite)
  2. alle URIs von jeder Seite nehmen und den Inhalt dieser auch abrufen.
  3. Verschieben rekursiv für jeden URI, den Sie abrufen.
  4. Rufen Sie nur den Inhalt von URIs ab, die sich auf dieser Website befinden (es könnte externe URIs geben, die auf eine andere Website verweisen, wir benötigen diese nicht).
  5. Vermeiden Sie kreisförmiges Crawling. Seite A hat URI für Seite B (derselben Site). Seite B hat URI für Seite A, aber wir haben bereits den Inhalt von Seite A abgerufen (die About Seite hat einen Link für die Home Seite, aber wir haben bereits den Inhalt von Home Seite, also besuchen Sie es nicht erneut).
  6. Die Crawling-Operation muss Multithread sein
  7. Die Website ist riesig. Es enthält viele Seiten. Wir wollen nur 50 URIs ab Home Seite abrufen.

Dies ist ein einfaches Szenario. Versuchen Sie, das Problem mit Jsoup zu lösen. All diese Funktionalität muss von Ihnen implementiert werden. Crawler4J oder irgendein Crawler-Mikro-Framework für diese Angelegenheit würde oder sollte eine Implementierung für die obigen Aktionen haben. Jsoup 's starke Qualitäten leuchten, wenn Sie entscheiden, was mit dem Inhalt zu tun ist.

Werfen wir einen Blick auf einige Anforderungen für das Parsing.

  1. Erhalten Sie alle Absätze einer Seite
  2. alle Bilder Get
  3. ungültige Tags (Tags, die zu den HTML Spezifikationen nicht entsprechen) entfernen
  4. Remove Script-Tags

Hier Jsoup kommt zum spielen. Natürlich gibt es hier einige Überschneidungen. Einige Dinge sind möglicherweise mit Crawler4J oder Jsoup möglich, aber das macht sie nicht gleichwertig. Sie könnten den Mechanismus zum Abrufen von Inhalten aus Jsoup entfernen und trotzdem ein erstaunliches Werkzeug sein. Wenn Crawler4J den Abruf entfernen würde, würde es die Hälfte seiner Funktionalität verlieren.

Ich habe beide in einem realen Szenario in einem Projekt verwendet. Ich krabbelte eine Website und nutzte die Stärken von Crawler4J für alle im ersten Beispiel erwähnten Probleme. Dann übergab ich den Inhalt jeder Seite, die ich abgerufen habe, an Jsoup, um die benötigten Informationen zu extrahieren. Könnte ich das eine oder das andere nicht benutzt haben? Ja, könnte ich, aber ich hätte alle fehlenden Funktionen implementieren müssen. Der Unterschied, Crawler4J ist also ein Crawler mit einigen einfachen Operationen zum Parsen (Sie könnten die Bilder in einer Zeile extrahieren), aber es gibt keine Implementierung für komplexe CSS Abfragen.

Jsoup ist ein Parser, der Ihnen eine einfache API für HTTP Anfragen gibt. Für etwas Komplexeres gibt es keine Implementierung.