2010-01-25 15 views
5

Ich möchte Webseiten in einer Site herunterladen. In meiner 'urls.txt' Datei befinden sich 5000000 URL Links. Es ist ungefähr 300 Millionen. Wie kann man diese URLs mit einem Multithread verlinken und diese Webseiten herunterladen? oder Wie können diese Webseiten heruntergeladen werden?Python, Multithreads, Webseiten abrufen, Webseiten herunterladen

meine Ideen:

with open('urls.txt','r') as f: 
    for el in f: 
     ##fetch these urls 

oder verdreht?

Gibt es eine gute Lösung dafür?

+2

suchen Wollen Sie es selbst programmieren? Sie können dies leicht mit 'wget' machen. – notnoop

Antwort

1

Auf jeden Fall 5M Webseiten auf einmal herunterzuladen, ist keine gute Idee, weil Sie eine Menge Dinge, einschließlich Ihrer Netzwerkbandbreite und der Dateideskriptoren Ihres Betriebssystems, ausschöpfen können. Ich würde in Chargen von 100-1000 gehen. Sie können urllib.urlopen verwenden, um einen Socket zu erhalten, und dann einfach() über mehrere Threads lesen. Sie können möglicherweise select.select verwenden. Wenn ja, dann gehen Sie voran und laden Sie alle 1000 gleichzeitig herunter und verteilen Sie jedes Datei-Handle, das ausgewählt wird, um 10 Worker-Threads zu sagen. Wenn select nicht funktioniert, beschränken Sie Ihre Stapel auf 100 Downloads und verwenden Sie einen Thread pro Download. Sicherlich solltest du nicht mehr als 100 Threads starten, da dein OS explodieren oder zumindest etwas langsam werden könnte.

3

Wenn dies nicht Teil eines größeren Programms ist, dann ist die Idee von notnoop, ein existierendes Werkzeug zu benutzen, ein ziemlich gutes. Wenn eine Shell-Schleife, die wget aufruft, Ihr Problem löst, ist das viel einfacher als alles, was eine benutzerdefinierte Software-Entwicklung betrifft.

Wenn Sie diese Ressourcen jedoch als Teil eines größeren Programms abrufen müssen, ist dies möglicherweise nicht ideal. In diesem Fall empfehle ich Ihnen dringend Twisted, wodurch Sie viele Anfragen parallel erledigen können.

Vor ein paar Jahren habe ich ein Beispiel geschrieben, wie man genau das macht. Werfen Sie einen Blick auf http://jcalderone.livejournal.com/24285.html.

+0

danke :) Es ist großartig! – bell007

1

Parsen Sie zuerst Ihre Datei und schieben Sie die URLs in eine Warteschlange, dann erstellen Sie 5-10 Worker-Threads, um URLs aus der Warteschlange zu ziehen und herunterzuladen. Warteschlangen sind dein Freund damit.

+0

danke! "Warteschlangen sind dein Freund damit." :) – bell007

0

Ein wget Skript ist wahrscheinlich einfachste, aber wenn Sie sich für eine Python-twisted Crawling Lösung Besuche scrapy