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.
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?).
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:
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.
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.
Alle Ihre Webcrawler-Aufgabe verteilt. Und es in einem Intervall verarbeiten weise.
a. Downloader
b. Link-Extraktor
c. URLSeen
d. InhaltSeen
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.
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).
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
Tags und Links python multithreading web-crawler web-mining