Wenn Sie eine detaillierte Antwort erhalten möchten, lesen Sie Abschnitt 3.8 dieses Dokuments , in dem der URL-Test eines modernen Schabers beschrieben wird:
Beim Extrahieren von Links stößt jeder Webcrawler auf mehrere Links zu demselben Dokument. Um zu vermeiden, dass ein Dokument mehrmals heruntergeladen und verarbeitet wird, muss für jeden extrahierten Link ein URL-Test durchgeführt werden, bevor er zur URL-Grenze hinzugefügt wird. (Ein alternatives Design wäre, stattdessen den URL-gesehenen Test durchzuführen, wenn die URL von der Grenze entfernt wird, aber dieser Ansatz würde zu einer viel größeren Grenze führen.)
Um den URL-gesehenen Test durchzuführen, speichern wir alle von Mercator gesehenen URLs in kanonischer Form in einer großen Tabelle, die als URL-Satz bezeichnet wird. Auch hier gibt es zu viele Einträge, als dass sie alle in den Speicher passen könnten. Daher wird der URL-Satz wie der Fingerabdrucksatz des Dokuments größtenteils auf der Festplatte gespeichert.
Um Platz zu sparen, speichern wir nicht die Textdarstellung jeder URL im URL-Satz, sondern eine Prüfsumme mit fester Größe. Im Gegensatz zu den Fingerabdrücken, die im Dokumentfingerabdrucksatz des inhaltlichen Tests angezeigt werden, weist der gegen den URL-Satz getestete URL-Stream eine nicht triviale Lokalität auf. Um die Anzahl der Vorgänge für die Sicherungsdatenträgerdatei zu verringern, wird daher ein speicherinterner Cache mit gängigen URLs gespeichert. Die Intuition für diesen Cache ist, dass Links zu einigen URLs häufig vorkommen. Das Zwischenspeichern der beliebten URLs im Speicher führt daher zu einer hohen Trefferquote im Speicher.
Tatsächlich erreichen wir mit einem In-Memory-Cache von 2 ^ 18 Einträgen und der LRU-ähnlichen Taktersatzrichtlinie eine Gesamttrefferquote im In-Memory-Cache von 66,2% und eine Trefferquote von 9,5% in der Tabelle von kürzlich hinzugefügte URLs für eine Netto-Trefferquote von 75,7%. Von den 24,3% der Anfragen, die sowohl im Cache beliebter URLs als auch in der Tabelle der kürzlich hinzugefügten URLs fehlen, führen etwa 1 = 3 zu Treffern im Puffer unserer Dateiimplementierung mit wahlfreiem Zugriff, die sich ebenfalls im Benutzerbereich befindet. Das Nettoergebnis all dieser Pufferung ist, dass jeder Mitgliedschaftstest, den wir für den URL-Satz durchführen, zu durchschnittlich 0,16 Such- und 0,17 Lesekernelaufrufen führt (von denen ein Teil aus den Dateisystempuffern des Kernels bereitgestellt wird). Daher führt jeder Mitgliedschaftstest für URL-Sätze zu einem Sechstel so vieler Kernelaufrufe wie ein Mitgliedschaftstest für den Dokumentfingerabdrucksatz.
Grundsätzlich hashen sie alle URLs mit einer Hashing-Funktion, die eindeutige Hashes für jede URL garantiert. Aufgrund der Lokalität der URLs ist es sehr einfach, URLs zu finden. Google hat sogar seine Hashing-Funktion als Open-Source- Version bereitgestellt : CityHash
WARNUNG!
Sie könnten auch über Bot-Fallen sprechen !!! Ein Bot-Trap ist ein Abschnitt einer Seite, der ständig neue Links mit eindeutigen URLs generiert. Wenn Sie den Links folgen, die von dieser Seite bereitgestellt werden, werden Sie im Wesentlichen in einer "Endlosschleife" gefangen. Dies ist nicht gerade eine Schleife, da eine Schleife das Ergebnis des Besuchs derselben URL wäre, aber es ist eine unendliche Kette von URLs, die Sie nicht crawlen sollten.
Update 13.12.2012 - der Tag nach dem Ende der Welt :)
Per Fr0zenFyrs Kommentar: Wenn man den AOPIC- Algorithmus zur Auswahl von Seiten verwendet, ist es ziemlich einfach, Bot-Fallen der Endlosschleifenart zu vermeiden. Hier ist eine Zusammenfassung der Funktionsweise von AOPIC:
- Holen Sie sich einen Satz von N Startseiten.
- Weisen Sie jeder Seite X Guthaben zu, sodass jede Seite X / N-Guthaben (dh das gleiche Guthaben) hat, bevor das Crawlen gestartet wird.
- Wählen Sie eine Seite P aus, auf der das P den höchsten Kreditbetrag aufweist (oder wenn alle Seiten den gleichen Kreditbetrag haben, crawlen Sie eine zufällige Seite).
- Crawl-Seite P (Nehmen wir an, P hatte beim Crawlen 100 Credits).
- Extrahieren Sie alle Links von Seite P (sagen wir, es gibt 10 davon).
- Setzen Sie die Credits von P auf 0.
- Nehmen Sie eine 10% ige "Steuer" und ordnen Sie sie einer Lambda-Seite zu.
- Weisen Sie jedem auf Seite P gefundenen Link aus dem ursprünglichen Guthaben von P die gleiche Anzahl an Gutschriften zu - die Steuer: also (100 (P-Gutschriften) - 10 (10% Steuer)) / 10 (Links) = 9 Gutschriften pro Link.
- Wiederholen Sie ab Schritt 3.
Da die Lambda-Seite kontinuierlich Steuern erhebt, wird sie letztendlich die Seite mit dem größten Guthaben sein und wir müssen sie "crawlen". Ich sage "crawlen" in Anführungszeichen, da wir keine HTTP-Anfrage für die Lambda-Seite stellen, sondern nur die Credits nehmen und sie gleichmäßig auf alle Seiten in unserer Datenbank verteilen .
Da Bot-Traps nur interne Links gutschreiben und selten von außen gutgeschrieben werden, werden sie kontinuierlich Gutschriften (aus Steuern) an die Lambda-Seite weiterleiten. Die Lambda-Seite verteilt diese Credits gleichmäßig auf alle Seiten in der Datenbank, und bei jedem Zyklus verliert die Bot-Trap-Seite immer mehr Credits, bis sie so wenig Credits hat, dass sie fast nie wieder gecrawlt wird. Dies ist bei guten Seiten nicht der Fall, da sie häufig Credits von Backlinks erhalten, die auf anderen Seiten gefunden wurden. Dies führt auch zu einem dynamischen Seitenrang. Sie werden feststellen, dass die Seiten jedes Mal, wenn Sie einen Schnappschuss Ihrer Datenbank erstellen, nach der Anzahl der Credits sortieren, die sie haben, höchstwahrscheinlich grob nach ihrem tatsächlichen Seitenrang sortiert werden .
Dies vermeidet nur Bot-Fallen der Endlosschleife, aber es gibt viele andere Bot-Fallen, auf die Sie achten sollten, und es gibt auch Möglichkeiten, sie zu umgehen .