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?
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:
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.
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.
Leider sind viele der bekannteren "echten" Webspider Closed-Source und tatsächlich Closed-Binary. Es gibt jedoch eine Reihe von grundlegenden Techniken wget fehlt:
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.
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.
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
Tags und Links web-crawler open-source wget