Schneller Internet-Crawler

8

Ich möchte Data Mining in großem Umfang durchführen. Dafür brauche ich einen schnellen Crawler. Alles, was ich brauche, ist etwas, um eine Webseite herunterzuladen, Links zu extrahieren und ihnen rekursiv zu folgen, aber ohne die gleiche URL zweimal zu besuchen. Grundsätzlich möchte ich Schleifen vermeiden.

Ich habe bereits einen Crawler in Python geschrieben, aber es ist zu langsam. Ich bin nicht in der Lage, eine 100Mbit-Leitung damit zu sättigen. Höchstgeschwindigkeit ist ~ 40 Urls / sec. und aus irgendeinem Grund ist es schwierig, bessere Ergebnisse zu erzielen. Es scheint ein Problem mit Pythons Multithreading / Sockets zu sein. Ich habe auch Probleme mit Pythons Gargabe-Sammler gehabt, aber das war lösbar. CPU ist nicht der Flaschenhals, sondern auch.

Also, was sollte ich verwenden, um einen Crawler zu schreiben, der so schnell wie möglich ist, und was ist die beste Lösung, um Schleifen beim Crawlen zu vermeiden?

BEARBEITEN: Die Lösung bestand darin, multiprocessing und threading Module zu kombinieren. Erstellen Sie mehrere Prozesse mit mehreren Threads pro Prozess für den besten Effekt. Das Erstellen mehrerer Threads in einem einzelnen Prozess ist nicht effektiv und mehrere Prozesse mit nur einem Thread verbrauchen zu viel Arbeitsspeicher.

    
pbp 04.10.2011, 19:51
quelle

6 Antworten

1

Es klingt, als hätten Sie ein Designproblem mehr als ein Sprachproblem. Sehen Sie sich das Modul multiprocessing für den Zugriff auf mehrere Websites zur gleichen Zeit anstelle von Threads an. Denken Sie auch daran, eine Tabelle zu bekommen, um Ihre zuvor besuchten Seiten zu speichern (vielleicht eine Datenbank?).

    
TorelTwiddler 04.10.2011, 19:57
quelle
7

Warum nicht etwas verwenden, das bereits für Crawling getestet wurde, wie Scrapy ? Ich erreichte fast 100 Seiten pro Sekunde auf einem Low-End-VPS mit begrenztem RAM-Speicher (etwa 400 MB), während die Netzwerkgeschwindigkeit bei etwa 6-7 MB / s lag (d. H. Unter 100 MBit / s).

Eine weitere Verbesserung ist die Verwendung von urllib3 (besonders beim Crawlen von vielen Seiten einer einzelnen Domain). Hier ist ein kurzer Vergleich, den ich vor einiger Zeit gemacht habe:

UPDATE:

Scrapy verwendet die Requests-Bibliothek , die wiederum verwendet urllib3 . Das macht Scrapy zum absoluten Werkzeug beim Kratzen. Neuere Versionen unterstützen auch die Bereitstellung von Projekten, sodass es einfacher ist, von einem VPS zu scrappen.

    
Attila O. 04.10.2011 20:02
quelle
3

Vor ungefähr 2 Jahren habe ich einen Crawler entwickelt. Und es kann fast 250urls pro Sekunde herunterladen. Du könntest meine Schritte fließen lassen.

  1. Optimieren Sie die Verwendung Ihres Dateizeigers. Versuchen Sie, den minimalen Dateizeiger zu verwenden.
  2. Schreiben Sie nicht jedes Mal Ihre Daten. Versuchen Sie, Ihre Daten nachher zu löschen Speichern von ungefähr 5000 url oder 10000 url.
  3. Für Ihre Robustheit müssen Sie keine andere Konfiguration verwenden. Versuchen Sie, eine Protokolldatei zu verwenden, und wenn Sie fortfahren möchten, versuchen Sie es einfach Lesen Sie die Protokolldatei und setzen Sie Ihren Crawler fort.
  4. Alle Ihre Webcrawler-Aufgabe verteilt. Und es in einem Intervall verarbeiten weise.

    a. Downloader

    b. Link-Extraktor

    c. URLSeen

    d. InhaltSeen

Mohiul Alam Prince 18.07.2012 10:57
quelle
2

Ich habe einen einfachen Multithreading-Crawler geschrieben. Es ist auf GitHub als Discovering Web Resources verfügbar und ich habe einen verwandten Artikel geschrieben: Automatische Entdeckung von Blog-Feeds und Twitter, Facebook, LinkedIn Konten, die mit der Business-Website verbunden sind Sie können die Anzahl der Threads ändern, die in der Klassenvariablen NWORKERS verwendet werden. Zögern Sie nicht, weitere Fragen zu stellen, wenn Sie zusätzliche Hilfe benötigen.

    
sw. 25.10.2012 17:59
quelle
1

Es ist unmöglich zu sagen, was deine Grenzen sind. Ihr Problem ähnelt dem C10K-Problem - zuerst lesen, nicht sofort optimieren. Entscheiden Sie sich für die niedrig hängenden Früchte: Höchstwahrscheinlich erhalten Sie durch die Analyse Ihres Anwendungsdesigns erhebliche Leistungsverbesserungen. Beginnen Sie nicht massiv-multithreaded oder massiv-multiprocessed.

Ich würde Twisted verwenden, um den Netzwerk-Teil zu schreiben, dies kann sehr schnell gehen. Im Allgemeinen muss die E / A an der Maschine besser sein als der Durchschnitt. Entweder müssen Sie Ihre Daten schreiben auf Festplatte oder zu einem anderen Computer unterstützt nicht jedes Notebook 10 MByte / s anhaltende Datenbankschreibvorgänge. Schließlich, wenn Sie eine asynchrone Internetverbindung haben, könnte es einfach sein, dass Ihr Upstream gesättigt ist. ACK-Priorisierung hilft hier (OpenBSD-Beispiel).

    
knitti 04.10.2011 19:59
quelle
1

Ich persönlich habe meinen Webcrawler ohne alle Module (außer urllib) gemacht. Sie sagen, dass es sehr gut funktioniert etwa 1000 Links in 5 Sekunden

Ссылка

Ich denke, es ist möglich, es zu verbessern (wie jedes "x" mal schreiben) Ich empfehle Ihnen, das Schreiben atomarer Dateien hinzuzufügen, wenn Sie einen Web-Crawler erstellen, um das Schreiben von Fehlern zu vermeiden, die Sie bei großen Dateien bekommen könnten

Ich werde subprocress und andere Dinge nicht empfehlen, um die Website zu überfluten, ohne sie zu wollen: P

    
mou 14.10.2012 08:44
quelle