2016-08-15 5 views
0

Ich versuche 500k kleine csv-Dateien (5kb-1mb) aus einer Liste von URLs herunterladen, aber es dauert zu lange, um dies zu tun. Mit dem folgenden Code bin ich glücklich, wenn ich 10k Dateien pro Tag bekomme.Herunterladen von Tausenden von Dateien mit Python

Ich habe versucht, mit dem Multiprocessing-Paket und einem Pool mehrere Dateien gleichzeitig herunterladen. Dies scheint für die ersten paar tausend Downloads effektiv zu sein, aber schließlich sinkt die Gesamtgeschwindigkeit. Ich bin kein Experte, aber ich nehme an, dass die abnehmende Geschwindigkeit anzeigt, dass der Server, den ich herunterladen möchte, nicht mit dieser Anzahl von Anforderungen Schritt halten kann. Macht das Sinn?

Um ehrlich zu sein, bin ich ziemlich verloren hier und habe mich gefragt, ob es einen Ratschlag gibt, wie man das beschleunigen kann.

import urllib2 
import pandas as pd 
import csv 
from multiprocessing import Pool 

#import url file 
df = pd.read_csv("url_list.csv") 

#select only part of the total list to download 
list=pd.Series(df[0:10000]) 


#define a job and set file name as the id string under urls 
def job(url): 
    file_name = str("test/"+url[46:61])+".csv" 
    u = urllib2.urlopen(url) 
    f = open(file_name, 'wb') 
    f.write(u.read()) 
    f.close() 

#run job 
pool = Pool() 
url = [ "http://" + str(file_path) for file_path in list] 
pool.map(job, url) 
+0

können Sie alle URLs in eine Textdatei schreiben, dann verwenden Sie einen Download-Manager wie 'Aria2', um sie herunterzuladen :-) – aliva

+0

danke für den Vorschlag, ich denke, es könnte gut funktionieren. Ich habe die Dokumentation von aria2 gelesen und kann die Namen der Dateien nicht finden. Weißt du, ob es möglich ist, die heruntergeladenen Dateien mit der URL (oder einem Teilstring davon) zu benennen? – tan

+0

'aria2c -i file.txt' – aliva

Antwort

-1

Sie ändern das Rad neu!

Wie wäre das:

parallel -a urls.file axel 

Natürlich werden Sie parallel und axel für Ihre Distribution installieren.

axel ist ein Multi-Thread-Pendant zu wget

parrallel Sie Aufgaben mit Multithreading laufen zu lassen.

+0

danke für den Kommentar. es funktioniert auch gut, aber ich kämpfe immer noch, um die Dateien richtig zu benennen. Dies ist von größter Bedeutung, da die CSV keine Informationen bezüglich ihrer ursprünglichen URL enthält. – tan

Verwandte Themen