Ich habe eine Aufgabe, Gbs von Daten von einer Website herunterzuladen. Die Daten haben die Form von .gz-Dateien, wobei jede Datei 45mb groß ist.
Der einfachste Weg, um die Dateien zu bekommen, ist "wget -r -np -A files url". Dies wird Daten in einem rekursiven Format herunterladen und spiegelt die Website. Die Donwload Rate ist sehr hoch 4mb / sec.
Aber, um herumzuspielen, habe ich auch Python verwendet, um meinen URL-Parser zu erstellen.
Das Herunterladen über Pythons URL ist langsam, viermal so langsam wie wget. Die Downloadrate beträgt 500 KB / Sek. Ich benutze HTMLParser zum Parsen der href-Tags.
Ich bin mir nicht sicher, warum das passiert. Gibt es irgendwelche Einstellungen dafür?
Danke
Wahrscheinlich eine Einheitsfehlerrechnung von Ihrer Seite.
Beachten Sie, dass 500 KB / s (Kilobyte) ist gleich 4 MB / s (Megabit) .
Was das HTML-Parsing anbelangt, ist es wahrscheinlich am schnellsten / einfachsten, lxml zu verwenden Was die http-Anfragen selbst betrifft: Ссылка ist sehr einfach zu verwenden und könnte möglicherweise Downloads beschleunigen, da es http 1.1 unterstützt Keep-Alive-Verbindungen und Gzip-Komprimierung. Es gibt auch pycURL , das behauptet, sehr schnell zu sein (aber schwieriger zu benutzen), und ist auf curllib aufgebaut, aber ich habe es nie getan benutzt das.
Sie können auch versuchen, verschiedene Dateien gleichzeitig herunterzuladen, aber denken Sie auch daran, dass das Versuchen, Ihre Download-Zeiten zu weit zu optimieren, gegenüber der fraglichen Website nicht sehr höflich ist.
Sorry für das Fehlen von Hyperlinks, aber SO sagt mir "Entschuldigung, neue Benutzer können maximal einen Hyperlink veröffentlichen"
Übertragungsgeschwindigkeiten können leicht irreführend sein. Könnten Sie mit dem folgenden Skript versuchen, das einfach die gleiche URL mit wget
und urllib.urlretrieve
herunterlädt - führen Sie es ein paar Mal aus, wenn Sie hinter einem Proxy sind, der die URL beim zweiten Versuch.
Bei kleinen Dateien dauert wget wegen der Startzeit des externen Prozesses ein wenig länger, bei größeren Dateien sollte es jedoch irrelevant sein.
%Vor%Vielleicht können Sie wget und dann die Daten in Python überprüfen?
Da Python vorschlägt, urllib2
anstelle von urllib
zu verwenden, mache ich einen Test zwischen urllib2.urlopen
und wget
.
Das Ergebnis ist, dass es fast die gleiche Zeit für beide dauert, dieselbe Datei herunterzuladen. Manchmal macht urllib2
sogar noch besser.
Der Vorteil von wget
liegt in einem dynamischen Fortschrittsbalken, um den Prozentsatz der fertiggestellten Dateien und die aktuelle Downloadgeschwindigkeit beim Übertragen anzuzeigen.
Die Dateigröße in meinem Test ist 5MB
. Ich habe kein Cache-Modul in Python verwendet und mir ist nicht bekannt, wie wget
beim Herunterladen großer Dateigrößen funktioniert.
Es sollte wirklich keinen Unterschied geben. Alle urlretrieve macht eine einfache HTTP-GET-Anfrage. Haben Sie Ihren Datenverarbeitungscode herausgenommen und einen direkten Durchsatzvergleich von wget vs. pure python durchgeführt?