Wie unterscheiden sich Webspinnen von Wgets Spinne?

7

Der nächste Satz fiel mir in Wget's Manual auf.

%Vor%

Ich finde die folgenden Codezeilen für die Spider-Option in wget relevant.

%Vor%

Ich würde gerne die Unterschiede im Code sehen, nicht abstrakt. Ich liebe Codebeispiele.

Wie unterscheiden sich Webspider von Wgets Spinne im Code?

    
Léo Léopold Hertz 준영 17.04.2009, 21:14
quelle

4 Antworten

33

Eine echte Spinne ist eine Menge Arbeit

Eine Spinne für das ganze WWW zu schreiben, ist eine ziemliche Aufgabe - man muss sich um viele "kleine Details" kümmern, wie:

  • Jeder Spinnencomputer sollte Daten von einigen tausend Servern parallel empfangen, um die Verbindungsbandbreite effizient zu nutzen. (asynchroner Socket-E / A).
  • Sie benötigen mehrere Computer, die parallel spinnen, um die große Menge an Informationen über das WWW (Clustering; Partitionierung der Arbeit) zu erfassen
  • Sie müssen höflich zu den gespiderten Websites sein:
    • Respektieren Sie die robots.txt-Dateien.
    • Holen Sie nicht zu viele Informationen zu schnell: Dies überlastet die Server.
    • Holen Sie keine Dateien, die Sie wirklich nicht brauchen (z. B. iso-Disk-Images; tgz-Pakete für Software-Download ...).
  • Sie müssen mit Cookies / Sitzungs-IDs umgehen: Viele Websites fügen URLs zur Identifizierung von Clientsitzungen eindeutige Sitzungs-IDs bei. Jedes Mal, wenn Sie auf der Website ankommen, erhalten Sie eine neue Sitzungs-ID und eine neue virtuelle Welt von Seiten (mit demselben Inhalt). Wegen solcher Probleme ignorierten frühe Suchmaschinen dynamischen Inhalt. Moderne Suchmaschinen haben gelernt, was die Probleme sind und wie man damit umgeht.
  • Sie müssen störende Daten erkennen und ignorieren: Verbindungen, die scheinbar unendlich viele Daten oder Verbindungen bereitstellen, die zu langsam sind, um sie zu beenden.
  • Neben den folgenden Links können Sie Sitemaps analysieren, um URLs von Seiten zu erhalten.
  • Sie möchten möglicherweise herausfinden, welche Informationen für Sie wichtig sind und häufig geändert werden, damit sie häufiger aktualisiert werden als andere Seiten. Hinweis: Ein Spider für das gesamte WWW erhält viele Daten - Sie zahlen für diese Bandbreite. Sie können HTTP HEAD-Anforderungen verwenden, um zu erraten, ob eine Seite geändert wurde oder nicht.
  • Neben dem Empfangen möchten Sie die Informationen verarbeiten und speichern. Google erstellt Indizes, die für jedes Wort die Seiten auflisten, die es enthalten. Sie benötigen möglicherweise separate Speichercomputer und eine Infrastruktur, um sie zu verbinden. Herkömmliche relationale Datenbanken halten nicht mit den Datenvolumen und Leistungsanforderungen des Speicherns / Indexierens des gesamten WWW Schritt.

Das ist eine Menge Arbeit. Wenn Ihr Ziel jedoch bescheidener ist als das Lesen des gesamten WWW, können Sie einige Teile überspringen. Wenn Sie nur eine Kopie eines Wikis usw. herunterladen möchten, gehen Sie zu den Spezifikationen von wget.

Hinweis: Wenn Sie nicht glauben, dass es so viel Arbeit ist, sollten Sie sich darüber informieren, wie Google die meisten Computing-Räder neu erfunden hat (zusätzlich zum einfachen Linux-Kernel), um gute Spider zu erstellen. Selbst wenn Sie viele Ecken schneiden, ist es eine Menge Arbeit.

Lassen Sie mich noch einige technische Anmerkungen zu drei Punkten hinzufügen.

Parallele Verbindungen / asynchrone Socket-Kommunikation

Sie können mehrere Spider-Programme in parallelen Prozessen oder Threads ausführen. Sie benötigen jedoch ca. 5000-10000 parallele Verbindungen, um Ihre Netzwerkverbindung zu nutzen. Und diese Menge an parallelen Prozessen / Threads erzeugt zu viel Overhead.

Eine bessere Lösung ist die asynchrone Eingabe / Ausgabe: Verarbeiten Sie etwa 1000 parallele Verbindungen in einem einzelnen Thread, indem Sie die Sockets im nicht blockierenden Modus öffnen und epoll verwenden oder nur die Verbindungen auswählen, die Daten empfangen haben. Seit Linux Kernel 2.4 bietet Linux hervorragende Unterstützung für die Skalierbarkeit (ich empfehle auch, dass Sie Memory-Mapped-Dateien studieren), die in späteren Versionen kontinuierlich verbessert werden.

Hinweis: Die Verwendung von asynchronem E / A hilft viel mehr als die Verwendung einer "schnellen Sprache": Es ist besser, einen epollgesteuerten Prozess für 1000 in Perl geschriebene Verbindungen zu schreiben, als 1000 in C geschriebene Verbindungen auszuführen. Wenn Sie es richtig machen , können Sie eine 100Mb-Verbindung mit in Perl geschriebenen Prozessen sättigen.

Von der ursprünglichen Antwort: Der Nachteil dieses Ansatzes ist, dass Sie die HTTP-Spezifikation selbst in einer asynchronen Form implementieren müssen (mir ist keine wiederverwendbare Bibliothek bekannt, die dies tut). Es ist viel einfacher, dies mit dem einfacheren HTTP / 1.0-Protokoll als dem modernen HTTP / 1.1-Protokoll zu tun. Sie würden wahrscheinlich sowieso nicht von den Vorteilen von HTTP / 1.1 für normale Browser profitieren, also könnte dies ein guter Platz sein, um Entwicklungskosten zu sparen.

Fünf Jahre später bearbeiten: Heutzutage gibt es viele freie / Open-Source-Technologien, die Ihnen bei dieser Arbeit helfen können. Ich persönlich mag die asynchrone Ссылка von node.js --- es erspart Ihnen alle Arbeiten, die im obigen ursprünglichen Absatz erwähnt wurden. Natürlich gibt es heute auch viele Module für die anderen Komponenten, die Sie in Ihrem Spider benötigen. Beachten Sie jedoch, dass die Qualität der Module von Drittanbietern erheblich variieren kann. Sie müssen überprüfen, was Sie verwenden. [Ageing info:] Vor kurzem habe ich einen Spider mit node.js geschrieben und festgestellt, dass die Zuverlässigkeit von npm-Modulen für die HTML-Verarbeitung für die Link- und Datenextraktion unzureichend ist. Für diesen Job habe ich diese Verarbeitung in einen Prozess ausgelagert, der in einer anderen Programmiersprache geschrieben wurde. Aber die Dinge ändern sich schnell und zu dem Zeitpunkt, als Sie diesen Kommentar gelesen haben, könnte dieses Problem bereits der Vergangenheit angehören ...

Partitionierung der Arbeit über mehrere Server

Ein Computer kann nicht mit dem Spinnen des gesamten WWW Schritt halten. Sie müssen Ihre Arbeit über mehrere Server verteilen und Informationen zwischen ihnen austauschen. Ich schlage vor, jedem Server bestimmte "Bereiche von Domain-Namen" zuzuweisen: Verwalte eine zentrale Datenbank von Domain-Namen mit einem Verweis auf einen Spider-Computer.

URLs aus empfangenen Webseiten in Stapeln extrahieren: Sortieren Sie sie nach ihren Domain-Namen; Entferne Duplikate und sende sie an den zuständigen Spider-Computer. Verwalte auf diesem Computer einen Index der URLs, die bereits abgerufen wurden, und hole die verbleibenden URLs ab.

Wenn Sie eine Warteschlange mit URLs behalten, die darauf warten, auf jedem Spider-Computer abgerufen zu werden, haben Sie keine Leistungsengpässe. Aber es ist eine Menge Programmierung, um dies zu implementieren.

Lesen Sie die Standards

Ich habe mehrere Standards erwähnt (HTTP / 1.x, Robots.txt, Cookies). Nehmen Sie sich Zeit, um sie zu lesen und umzusetzen. Wenn Sie nur Beispiele von Websites folgen, die Sie kennen, werden Sie Fehler machen (Teile des Standards vergessen, die für Ihre Beispiele nicht relevant sind) und Probleme für die Websites verursachen, die diese zusätzlichen Funktionen verwenden.

Es ist ein Schmerz, das HTTP / 1.1-Standarddokument zu lesen. Aber all die kleinen Details wurden hinzugefügt, weil jemand wirklich dieses kleine Detail braucht und es jetzt benutzt.

    
Yaakov Belch 12.05.2009, 12:47
quelle
4

Ich bin mir nicht sicher, worauf sich der ursprüngliche Autor des Kommentars bezogen hat, aber ich kann schätzen, dass wget langsam wie eine Spinne ist, da es scheinbar nur einen einzigen Thread der Ausführung verwendet (zumindest nach dem, was Sie gezeigt haben) ).

"Echte" Spinnen wie heritrix verwenden eine Menge Parallelität und Tricks, um ihre Crawling-Geschwindigkeit zu optimieren und gleichzeitig nett zu sein Website, die sie kriechen. Dies bedeutet normalerweise, dass Treffer auf eine Website mit einer Rate von 1 pro Sekunde (oder so) begrenzt werden und mehrere Websites gleichzeitig gecrawlt werden.

Auch dies ist alles nur eine Vermutung, basierend auf dem, was ich über Spinnen allgemein weiß, und was Sie hier gepostet haben.

    
grieve 17.04.2009 21:34
quelle
2

Leider sind viele der bekannteren "echten" Webspider Closed-Source und tatsächlich Closed-Binary. Es gibt jedoch eine Reihe von grundlegenden Techniken wget fehlt:

  • Parallelität; Sie werden nie in der Lage sein, mit dem gesamten Web Schritt zu halten, ohne mehrere Seiten gleichzeitig abzurufen
  • Priorisierung; Einige Seiten sind für Spider wichtiger als andere
  • Ratenbegrenzung; Sie werden schnell gebannt, wenn Sie Seiten so schnell wie möglich herunterziehen
  • Speichern in etwas anderem als einem lokalen Dateisystem; Das Web ist groß genug, dass es nicht in eine einzelne Verzeichnisstruktur
  • passt
  • Erneutes periodisches Überprüfen der Seiten ohne Neustart des gesamten Prozesses; In der Praxis sollten Sie bei einer echten Spinne häufig 'wichtige' Seiten nach Aktualisierungen durchsuchen, während weniger interessante Seiten Monate dauern können.

Es gibt auch verschiedene andere Eingaben wie Sitemaps und Ähnliches. Punkt ist, wget ist nicht entworfen, um das gesamte Netz spidern, und es ist nicht wirklich eine Sache, die in einem kleinen Codebeispiel erfasst werden kann, da es ein Problem der gesamten verwendeten Technik ist, anstatt jedes einzelne kleine Unterprogramm, das falsch ist für die Aufgabe.

    
bdonlan 10.05.2009 17:06
quelle
1

Ich werde nicht auf Einzelheiten eingehen, wie man das Internet spinnen kann, ich denke, dass wget kommentiert ist, eine Website zu spidern, die noch eine ernste Herausforderung ist.

  • Als Spinne müssen Sie herausfinden, wann Sie aufhören müssen, und nicht in rekursive Crawls einsteigen, nur weil sich die URL wie date = 1/1/1900 zu 1/2/1900 und so geändert hat
  • Noch größere Herausforderung, um URL Rewrite zu sortieren (ich habe keine Ahnung, wie auch immer Google oder irgendjemand anderes damit umgeht). Es ist eine ziemlich große Herausforderung, genug zu kriegen, aber nicht zu viel. Und wie erkennt man URL-Rewrite automatisch mit zufälligen Parametern und zufälligen Änderungen im Inhalt?
  • Sie müssen Flash / Javascript mindestens bis zu einem gewissen Grad analysieren
  • Sie müssen einige verrückte HTTP-Probleme wie base -Tag berücksichtigen. Selbst das Parsen des HTML ist nicht einfach, wenn man bedenkt, dass die meisten Websites nicht XHTML sind und Browser in der Syntax so flexibel sind.

Ich weiß nicht, wie viel davon implementiert oder in wget berücksichtigt wurde, aber Sie sollten vielleicht einen Blick auf httrack werfen, um die Herausforderungen dieser Aufgabe zu verstehen.

Ich würde Ihnen gerne einige Codebeispiele geben, aber das sind große Aufgaben und eine anständige Spinne wird ungefähr 5000 loc ohne 3rd Party Libraries sein .

+ Einige von ihnen wurden bereits von @ yaakov-belch erklärt, damit ich sie nicht noch einmal eingeben werde

    
dr. evil 13.05.2009 20:09
quelle

Tags und Links