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 .
Während alle hier bereits vorgeschlagen haben, wie Sie Ihren Webcrawler erstellen, ordnet Google die Seiten wie folgt ein.
Google gibt jeder Seite einen Rang basierend auf der Anzahl der Rückruf-Links (wie viele Links auf anderen Websites auf eine bestimmte Website / Seite verweisen). Dies wird als Relevanzbewertung bezeichnet. Dies basiert auf der Tatsache, dass eine Seite, auf die viele andere Seiten verlinkt sind, wahrscheinlich eine wichtige Seite ist.
Jede Site / Seite wird als Knoten in einem Diagramm angezeigt. Links zu anderen Seiten sind gerichtete Kanten. Ein Grad eines Scheitelpunkts ist definiert als die Anzahl der eingehenden Kanten. Knoten mit einer höheren Anzahl eingehender Kanten werden höher eingestuft.
So wird der PageRank ermittelt. Angenommen, diese Seite Pj hat Lj-Links. Wenn einer dieser Links zur Seite Pi führt, gibt Pj 1 / Lj seiner Bedeutung an Pi weiter. Das Wichtigkeitsranking von Pi ist dann die Summe aller Beiträge von Seiten, die darauf verlinken. Wenn wir also die Menge der Seiten bezeichnen, die durch Bi mit Pi verknüpft sind, dann haben wir diese Formel:
Die Ränge werden in eine Matrix gestellt, die als Hyperlink-Matrix bezeichnet wird: H [i, j]
Eine Zeile in dieser Matrix ist entweder 0 oder 1 / Lj, wenn eine Verbindung von Pi zu Bi besteht. Eine weitere Eigenschaft dieser Matrix ist, dass wir 1 erhalten, wenn wir alle Zeilen in einer Spalte summieren.
Jetzt müssen wir diese Matrix mit einem Eigenvektor namens I (mit dem Eigenwert 1) multiplizieren, so dass:
Jetzt beginnen wir zu iterieren: I H, I I H, I I I H .... I ^ k * H, bis die Lösung konvergiert. dh wir erhalten in Schritt k und k + 1 so ziemlich die gleichen Zahlen in der Matrix.
Was jetzt im I-Vektor übrig bleibt, ist die Wichtigkeit jeder Seite.
Ein einfaches Beispiel für Hausaufgaben finden Sie unter http://www.math.cornell.edu/~mec/Winter2009/RalucaRemus/Lecture3/lecture3.html
quelle
hyperlink matrix
was die abmessungenevery-webpage-on-the-internet
x hatevery-webpage-on-the-internet
. Einfach?!? Wie macht man das genau (angesichts seiner sehr spärlichen Matrix)?Kommt darauf an, wie tief ihre Frage sein sollte. Wenn sie nur versuchen wollten, nicht denselben Links hin und her zu folgen, wäre es ausreichend, die URLs zu hashen.
Was ist mit Inhalten, die buchstäblich Tausende von URLs enthalten, die zu demselben Inhalt führen? Wie ein QueryString-Parameter, der nichts beeinflusst, aber unendlich viele Iterationen haben kann. Ich nehme an, Sie könnten auch den Inhalt der Seite hashen und URLs vergleichen, um festzustellen, ob sie dem Abfangen von Inhalten ähneln, die durch mehrere URLs identifiziert werden. Siehe zum Beispiel Bot-Fallen, die in @ Liriks Beitrag erwähnt wurden.
quelle
Sie müssten eine Art Hash-Tabelle haben, in der die Ergebnisse gespeichert werden. Sie müssten sie nur vor jedem Laden der Seite überprüfen.
quelle
Das Problem hierbei ist nicht, doppelte URLs zu crawlen, die durch einen Index unter Verwendung eines aus URLs erhaltenen Hashs behoben werden. Das Problem besteht darin, DUPLICATED CONTENT zu crawlen. Jede URL einer "Crawler-Falle" ist anders (Jahr, Tag, Sitzungs-ID ...).
Es gibt keine "perfekte" Lösung ... aber Sie können einige dieser Strategien anwenden:
• Behalten Sie ein Feld bei, in dem sich die URL auf der Website befindet. Erhöhen Sie für jeden Artikel, in dem URLs von einer Seite abgerufen werden, die Stufe. Es wird wie ein Baum sein. Sie können aufhören, auf einer bestimmten Ebene wie 10 zu crawlen (ich denke, Google verwendet dies).
• Sie können versuchen, eine Art HASH zu erstellen, die verglichen werden kann, um ähnliche Dokumente zu finden, da Sie nicht mit jedem Dokument in Ihrer Datenbank vergleichen können. Es gibt SimHash von Google, aber ich konnte keine Implementierung finden, die ich verwenden könnte. Dann habe ich meine eigenen erstellt. Mein Hash zählt nieder- und hochfrequente Zeichen im HTML-Code und generiert einen 20-Byte-Hash, der mit einem kleinen Cache der zuletzt gecrawlten Seiten in einem AVLTree mit einer NearNeighbors-Suche mit einer gewissen Toleranz (ca. 2) verglichen wird. Sie können keinen Verweis auf Zeichenpositionen in diesem Hash verwenden. Nachdem Sie die Falle "erkannt" haben, können Sie das URL-Muster des doppelten Inhalts aufzeichnen und damit auch Seiten ignorieren.
• Wie bei Google können Sie für jede Website ein Ranking erstellen und mehr als einer anderen "vertrauen".
quelle
Der Crawler verwaltet einen URL-Pool, der alle zu crawlenden URLs enthält. Um eine „Endlosschleife“ zu vermeiden, sollten Sie vor dem Hinzufügen zum Pool die Existenz jeder URL überprüfen.
Dies ist jedoch nicht einfach zu implementieren, wenn das System auf ein bestimmtes Niveau skaliert wurde. Der naive Ansatz besteht darin, alle URLs in einem Hashset zu halten und die Existenz jeder neuen URL zu überprüfen. Dies funktioniert nicht, wenn zu viele URLs vorhanden sind, um in den Speicher zu passen.
Hier gibt es einige Lösungen. Anstatt beispielsweise alle URLs im Speicher zu speichern, sollten wir sie auf der Festplatte behalten. Um Platz zu sparen, sollte anstelle der unformatierten URL ein URL-Hash verwendet werden. Es ist auch erwähnenswert, dass wir die kanonische Form der URL anstelle der ursprünglichen beibehalten sollten. Wenn die URL also durch Dienste wie bit.ly gekürzt wird, ist es besser, die endgültige URL zu erhalten. Um den Überprüfungsprozess zu beschleunigen, kann eine Cache-Schicht erstellt werden. Oder Sie können es als verteiltes Cache-System betrachten, das ein separates Thema ist.
Der Beitrag Build a Web Crawler enthält eine detaillierte Analyse dieses Problems.
quelle
Ich musste auch Crawler verwenden und kann keinen geeigneten für meine Anforderung finden. Danach habe ich eine grundlegende Crawler-Bibliothek entwickelt, um einfache Anforderungen zu implementieren. Aber es ermöglicht, fast alle Prinzipien des Crawlers zu erfüllen. Sie können das DotnetCrawler-Github-Repo überprüfen, das Downloader-Processor-Pipeline-Module mit Standardimplementierung mithilfe von Entity Framework Core selbst implementiert, um Daten in SQL Server zu speichern.
https://github.com/mehmetozkaya/DotnetCrawler
quelle
Der Webcrawler ist ein Computerprogramm, mit dem folgende Schlüsselwerte (HREF-Links, Bildlinks, Metadaten usw.) von der angegebenen Website-URL erfasst / gecrawlt werden. Es ist wie intelligent gestaltet, um verschiedenen HREF-Links zu folgen, die bereits von der vorherigen URL abgerufen wurden. Auf diese Weise kann Crawler von einer Website zu anderen Websites springen. Normalerweise wird es als Webspinne oder Webbot bezeichnet. Dieser Mechanismus fungiert immer als Rückgrat der Websuchmaschine.
Den Quellcode finden Sie in meinem Tech-Blog - http://www.algonuts.info/how-to-built-a-simple-web-crawler-in-php.html
quelle
Nun, das Web ist im Grunde ein gerichtetes Diagramm. Sie können also ein Diagramm aus den URLs erstellen und dann eine BFS- oder DFS-Durchquerung durchführen, während Sie die besuchten Knoten markieren, damit Sie nicht zweimal dieselbe Seite besuchen.
quelle
Dies ist ein Webcrawler-Beispiel. Hiermit können Mac-Adressen für Mac-Spoofing gesammelt werden.
Ändern Sie die URL, um weitere Websites zu crawlen. Viel Glück
quelle