Frage

Der nächste Satz fing mein Auge in Wget Anleitung

wget --spider --force-html -i bookmarks.html

This feature needs much more work for Wget to get close to the functionality of real web spiders.

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

src/ftp.c
780:      /* If we're in spider mode, don't really retrieve anything.  The
784:      if (opt.spider)
889:  if (!(cmd & (DO_LIST | DO_RETR)) || (opt.spider && !(cmd & DO_LIST)))
1227:      if (!opt.spider)
1239:      if (!opt.spider)
1268:      else if (!opt.spider)
1827:          if (opt.htmlify && !opt.spider)

src/http.c
64:#include "spider.h"
2405:  /* Skip preliminary HEAD request if we're not in spider mode AND
2407:  if (!opt.spider
2428:      if (opt.spider && !got_head)
2456:      /* Default document type is empty.  However, if spider mode is
2570:           * spider mode.  */
2571:          else if (opt.spider)
2661:              if (opt.spider)

src/res.c
543:  int saved_sp_val = opt.spider;
548:  opt.spider       = false;
551:  opt.spider       = saved_sp_val;  

src/spider.c
1:/* Keep track of visited URLs in spider mode.
37:#include "spider.h"
49:spider_cleanup (void)

src/spider.h
1:/* Declarations for spider.c

src/recur.c
52:#include "spider.h"
279:      if (opt.spider)
366:              || opt.spider /* opt.recursive is implicitely true */
370:             (otherwise unneeded because of --spider or rejected by -R) 
375:                   (opt.spider ? "--spider" : 
378:                     (opt.delete_after || opt.spider
440:      if (opt.spider) 

src/options.h
62:  bool spider;           /* Is Wget in spider mode? */

src/init.c
238:  { "spider",           &opt.spider,            cmd_boolean },

src/main.c
56:#include "spider.h"
238:    { "spider", 0, OPT_BOOLEAN, "spider", -1 },
435:       --spider                  don't download anything.\n"),
1045:  if (opt.recursive && opt.spider)

Ich möchte die Unterschiede in den Code sehen, nicht abstrakt. Ich liebe Code-Beispiele.

Wie Web-Spider unterscheiden sich von Wget Spinne in Code?

War es hilfreich?

Lösung

Eine echte Spinne ist eine Menge Arbeit,

eine Spinne für die ganze WWW Schreiben ist eine schwierige Aufgabe, --- Sie müssen darauf achten, über viele „kleine Details“ wie:

  • Jede Spinne Computer sollte Daten von einigen tausend Server parallel erhalten, um eine effiziente Nutzung der Verbindungsbandbreite zu machen. (Asynchron Buchse i / o).
  • Sie müssen mehrere Computer, die parallel um Spinne die große Menge an Informationen im WWW zu decken (Clustering; Aufteilung der Arbeit)
  • Sie müssen die gespidert Websites höflich sein:
    • Beachten Sie die robots.txt-Dateien.
    • Sie viele Informationen nicht zu schnell holen: dies die Server überlastet
    • .
    • Sie holen nicht Dateien, die Sie nicht wirklich brauchen. (Zum Beispiel ISO-Disk-Images; tgz-Pakete für Software-Download ...)
  • Sie haben mit Cookies / Session-IDs zu tun: Viele Websites anhängen eindeutige Sitzungs-IDs an URLs Client-Sitzungen zu identifizieren. Jedes Mal, wenn Sie an der Stelle ankommen, erhalten Sie eine neue Session-ID und eine neue virtuelle Welt von Seiten (mit dem gleichen Inhalt). Wegen solcher Probleme, ignoriert frühen Suchmaschinen dynamische Inhalte. Moderne Suchmaschinen haben gelernt, was die Probleme sind und wie man mit ihnen umgehen.
  • Sie haben zu erkennen und störende Daten zu ignorieren. Verbindungen, die eine scheinbar unendliche Menge an Daten oder Verbindungen bereitzustellen, die zu langsam sind zu beenden
  • Neben Links folgen, können Sie Sitemaps analysieren URLs von Seiten zu bekommen.
  • Möchten Sie folgendes beurteilen, welche Informationen für Sie und Änderungen wichtig ist, häufiger als andere Seiten aktualisiert häufiger werden. Hinweis: Eine Spinne für die ganze WWW erhält eine Menge Daten --- Sie zahlen für die Bandbreite. Möglicherweise möchten Sie HTTP HEAD-Anfragen verwenden, zu erraten, ob eine Seite geändert hat oder nicht.
  • Neben empfangen, möchten Sie die Informationen verarbeiten und zu speichern. Google baut Indizes, die die Seiten für jede Wortliste, die sie enthalten. Sie können separate Speicher Computer benötigen und eine Infrastruktur, um sie zu verbinden. Traditionelle relationale Datenbanken halten nicht mit den Datenvolumen und Leistungsanforderungen des Speicherns / Indizieren des gesamten WWW auf.

Das ist eine Menge Arbeit. Aber wenn Ihr Ziel bescheidener ist als die ganze WWW lesen, können Sie einige der Teile überspringen. Wenn Sie nur eine Kopie eines Wikis usw. herunterladen möchten erhalten Sie die Spezifikationen von wget nach unten.

Hinweis: Wenn Sie nicht glauben, dass es so viel Arbeit, möchten Sie vielleicht lesen, wie Google neu erfunden meisten der Rechenräder (auf der Oberseite des Grund Linux-Kernel) zu guten Spinnen zu bauen. Auch wenn Sie viele Ecken schneiden, es ist eine Menge Arbeit.

Lassen Sie mich noch ein paar technische Hinweise auf drei Punkte hinzufügen

Parallel-Verbindungen / Asynchron-Socket-Kommunikation

Sie können mehrere Spider-Programme in parallelen Prozessen oder Threads laufen. Aber Sie müssen über 5000-10000 parallele Verbindungen, um eine gute Nutzung Ihrer Netzwerkverbindung herzustellen. Und diese Menge paralleler Prozesse / Threads erzeugt zu viel Aufwand.

Eine bessere Lösung ist asynchrone Eingabe / Ausgabe: Prozess etwa 1000 parallel Verbindungen in einem einzigen Faden durch die Buchsen in nicht-blockierenden Modus zu öffnen und verwenden epoll oder wählen nur diese Verbindungen zu verarbeiten, die Daten empfangen. Da Linux-Kernel 2.4, hat Linux eine hervorragende Unterstützung für die Skalierbarkeit (I auch empfehlen, dass Sie Memory-Mapped-Dateien studieren) kontinuierlich verbessert in späteren Versionen.

Hinweis: Bei Verwendung des asynchronen I / O hilft viel mehr als eine „schnelle Sprache“ verwenden: Es ist besser, einen epoll gesteuerten Prozess für 1000 Verbindungen in Perl geschrieben zu schreiben, als in C geschrieben 1000 Prozesse zu laufen Wenn man es richtig macht Sie können 100Mb Verbindung mit Prozessen in perl geschrieben sättigen.

Von der ursprünglichen Antwort: Die Kehrseite dieses Ansatzes ist, dassmüssen Sie sich in einem asynchronen Form der HTTP-Spezifikation implementieren (ich bin nicht einer wiederverwendbaren Bibliothek bewusst, dass dies der Fall ist). Es ist viel einfacher, dies zu tun mit dem einfacheren HTTP / 1.0-Protokoll als das moderne HTTP / 1.1-Protokoll. Sie würden wahrscheinlich nicht von den Vorteilen von HTTP / 1.1 für die normalen Browser profitieren sowieso, so kann dies ein guter Ort, um einige Entwicklungskosten zu sparen.

Bearbeiten fünf Jahre später: Heute gibt es eine Menge freier / Open-Source-Technologie zur Verfügung um Ihnen bei dieser Arbeit zu helfen. Ich persönlich mag die asynchrone http Implementierung von node.js --- es erspart Ihnen die ganze Arbeit in dem obigen ursprünglichen Absatz erwähnt. Natürlich gibt es heute auch viele Module für die anderen Komponenten, die Sie in Ihrer Spinne leicht verfügbar benötigen. Beachten Sie jedoch, dass die Qualität der Module von Drittanbietern erheblich variieren. Sie haben zu prüfen, was auch immer Sie verwenden. [Aging Info:] Vor kurzem schrieb ich eine Spinne mit node.js und ich fand die Zuverlässigkeit der NPM-Module für HTML-Bearbeitung für Link und Datenextraktion unzureichend. Für diesen Job I „ausgelagert“ diese Verarbeitung zu einem Prozess in einer anderen Programmiersprache geschrieben. Aber die Dinge ändern sich schnell und durch die Zeit, lesen Sie diesen Kommentar, kann dieses Problem schon eine Sache der Vergangenheit ...

Partitionierung der Arbeit über mehrere Server

Ein Computer kann nicht mit Spidern das ganze WWW halten. Sie müssen Ihre Arbeit über mehrere Server und den Austausch von Informationen zwischen ihnen verteilen. Ich schlage vor, bestimmten „im Bereich von Domain-Namen“ auf jeden Server zuweisen: eine zentrale Datenbank von Domainnamen halten mit einem Verweise auf eine Spinne Computer.

Extrahieren Sie URLs aus empfangenen Web-Seiten in den Reihen: sortieren sie nach ihrem Domain-Namen; Duplikate entfernen und sie an den zuständigen Spinne Computer senden. Auf diesem Computer, einen Index von URLs halten, die bereits abgerufen werden und die restlichen URLs holen.

Wenn Sie eine Warteschlange von URLs halten warten auf jeder Spinne Computer geholt werden, werden Sie keine Performance-Engpässe haben. Aber es ist ziemlich viel Programmierung, dies umzusetzen.

Lesen Sie die Standards

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

Es ist ein Schmerz den HTTP / 1.1-Standard-Dokument zu lesen. Aber all die kleinen Details wurde ihm hinzugefügt, weil jemand wirklich braucht, dass kleine Detail und jetzt nutzt.

Andere Tipps

Ich bin nicht sicher genau das, was der ursprüngliche Autor des Kommentars bezog, aber ich kann mir denken, dass wget als Spinne langsam ist, da es nur scheint ein einziges Thread der Ausführung zu verwenden (zumindest von dem, was Sie haben gezeigt, ).

„Real“ Spinnen wie Heritrix viel Parallelität verwenden und Tricks, um ihre Kriechgang zu optimieren, während gleichzeitig schön auf der Website sind sie kriechen. Diese Regel bedeutet Treffern zu einem Standort mit einer Rate von 1 pro Sekunde (oder so) zu begrenzen, und mehrere Websites gleichzeitig kriecht.

Auch dies ist alles nur eine Vermutung auf, was ich von Spinnen im Allgemeinen wissen, und das, was Sie hier gepostet.

Leider sind viele der bekannteren ‚echten‘ Web-Spider Closed-Source, und in der Tat geschlossen binär. Allerdings gibt es eine Reihe von grundlegenden Techniken wget ist fehlt:

  • Parallelismus; Sie gehen zu können, nie mit dem gesamten Web halten, ohne dass mehrere Seiten gleichzeitig abrufen
  • Priorisierungs; einige Seiten sind wichtiger als andere Spinne
  • Rate zu begrenzen; Sie werden schnell verboten werden, wenn Sie Seiten nach unten ziehen halten, so schnell wie möglich
  • Speichern auf etwas anderes als ein lokales Dateisystem; das Web ist groß genug, dass es einen einzigen Verzeichnisbaum
  • passen wird nicht
  • Nachkontrolle Seiten in regelmäßigen Abständen ohne den gesamten Prozess neu zu starten; in der Praxis mit einer echten Spinne sollten Sie ‚wichtige‘ Seiten auf Updates häufig noch einmal zu überprüfen, während weniger interessanten Seiten für Monate gehen können.

Es gibt auch verschiedene andere Eingänge, die wie Sitemaps und dergleichen verwendet werden kann. Punkt ist, wird wget nicht das gesamte Web Spinne entwickelt, und es ist nicht wirklich eine Sache, die in einem kleinen Codebeispiel erfasst werden kann, da es sich um ein Problem der gesamten Gesamt-Technik ist verwendet werden, anstatt jede einzelne kleine Unterprogramm ist falsch für die Aufgabe.

Ich werde nicht ins Detail gehen, wie das Internet Spinne, denke ich, dass wget Kommentar ist in Bezug auf eine Website Spidern, die nach wie vor eine große Herausforderung ist.

  • Wie eine Spinne braucht, wenn herauszufinden, zu stoppen, nicht in rekursiven gehen kriecht, nur weil die URL wie Datum geändert = 1/1/1900 bis 1900.01.02 und so
  • noch größere Herausforderung URL Rewrite auszusortieren (ich keine Ahnung, was so überhaupt, wie Google oder andere Griffe diesen). Es ist ziemlich große Herausforderung zu kriechen genug, aber nicht zu viel. Und wie man automatisch URL Rewrite mit einigen zufälligen Parametern und zufälligen Veränderungen in dem Inhalt erkennen kann?
  • Sie benötigen Flash / Javascript zumindest bis zu einem gewissen Grad
  • analysieren
  • Sie müssen einige verrückt HTTP Themen wie Basis -Tag berücksichtigen. Auch die HTML-Parsing ist nicht einfach, wenn man bedenkt meisten Websites sind nicht XHTML und Browser sind so flexibel in der Syntax.

Ich weiß nicht, wie viel davon in wget umgesetzt oder in Betracht gezogen, aber Sie vielleicht einen Blick auf httrack nehmen wollen, die Herausforderungen dieser Aufgabe zu verstehen.

Ich würde gerne einige Code-Beispiele geben, aber das ist große Aufgaben und eine anständige Spinne etwa 5000 loc ohne 3rd-Party-Bibliotheken sein.

+ Einige von ihnen bereits von @ yaakov-Rülpser erklärt, so werde ihnen, dass ich nicht wieder geben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top