Python: How to download-Datei mit Reihe von bytes?
Ich möchte die download-Datei in multi-thread-Modus und ich habe folgenden code hier:
#!/usr/bin/env python
import httplib
def main():
url_opt = '/film/0d46e21795209bc18e9530133226cfc3/7f_Naruto.Uragannie.Hroniki.001.seriya.a1.20.06.13.mp4'
headers = {}
headers['Accept-Language'] = 'en-GB,en-US,en'
headers['Accept-Encoding'] = 'gzip,deflate,sdch'
headers['Accept-Charset'] = 'max-age=0'
headers['Cache-Control'] = 'ISO-8859-1,utf-8,*'
headers['Cache-Control'] = 'max-age=0'
headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 5.1)'
headers['Connection'] = 'keep-alive'
headers['Accept'] = 'text/html,application/xhtml+xml,application/xml,*/*'
headers['Range'] = ''
conn = httplib.HTTPConnection('data09-cdn.datalock.ru:80')
conn.request("GET", url_opt, '', headers)
print "Request sent"
resp = conn.getresponse()
print resp.status
print resp.reason
print resp.getheaders()
file_for_wirte = open('cartoon.mp4', 'w')
file_for_wirte.write(resp.read())
print resp.read()
conn.close()
if __name__ == "__main__":
main()
Hier ist die Ausgabe:
Request sent
200
OK
[('content-length', '62515220'), ('accept-ranges', 'bytes'), ('server', 'nginx/1.2.7'), ('last-modified', 'Thu, 20 Jun 2013 12:10:43 GMT'), ('connection', 'keep-alive'), ('date', 'Fri, 14 Feb 2014 07:53:30 GMT'), ('content-type', 'video/mp4')]
Dieser code funktionieren perfekt, aber ich verstehe nicht, durch die Dokumentation, wie download-Datei mit reicht. Wenn Sie sehen, dass die Ausgabe der Antwort, der server bietet:
('content-length', '62515220'), ('accept-ranges', 'bytes')
Unterstützt range in 'Byte' Einheit, in der Größe des Inhalts ist 62515220
Jedoch in dieser Anfrage ganze Datei heruntergeladen. Aber, was ich tun soll zunächst ein server-Informationen wie kann das unterstützt werden kann, mithilfe von http-range-Anfragen und die Größe des Inhalts der Datei mit dem aus dem Download? Und wie kann ich http-Abfrage mit Auswahl (z.B.: 0~25000)?
- Dies könnte helfen: stackoverflow.com/q/8293687/2319400
- Siehe hier: stackoverflow.com/questions/1798879/... Andere Bibliothek, aber sollte Sie auf der richtigen Spur.
- Vielen Dank für Ihren Kommentar. Ich sah schon die Antwort. Außerdem habe ich die capture-Pakete mit wireshark. Es ist jedoch nicht klar, wie zu erkennen, hat server-support-Auswahl. Ich meine, gibt es Methode zu überprüfen, bedeutet Datei heruntergeladen werden kann mit range-Auswahl oder nicht? Es gibt Anwendungen, die Unterstützung für multi-thread-downloads mit Auswahl jedoch, wenn der server Sie nicht unterstützt, noch versucht, die download-Dateien in anderen threads (d.h., flashgot, reget und etc.). Jedoch, wie ich erreichen kann server-oder Datei-Informationen, wo ich kann-lookup-Bereich support-Informationen?
- Vielen Dank für Ihren Kommentar. Wenn Funktionen, die nicht von
httplib
wird nicht genug sein, werde ich trotzig in die Bibliothek, die Sie unterstützt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Pass
Bereich
header mitbytes=start_offset-end_offset
als range specifier.Beispielsweise folgenden code abrufen, die ersten 300 bytes. (
0-299
):HINWEIS Beide
start_offset
,end_offset
sind inklusive.UPDATE
Wenn der server nicht verstehen
Range
Kopf, er reagiert mit dem status-code 200 (httplib.OK
) statt 206 (httplib.PARTIAL_CONTENT
), und es sendet den ganzen Inhalt. Sicherstellen, dass der server reagiert teilweise Inhalte, überprüfen Sie den status-code.Range
Kopf, er reagiert mit 200 (httplib.OK
) status-code anstelle von 206 (httplib.PARTIAL_CONTENT
). So überprüfen Sie den status-code, wie im Beispiel gezeigt-code:resp.status == httplib.PARTIAL_CONTENT
>>> resp.status == httplib.PARTIAL_CONTENT
in der Antwort genug war. Ich aktualisierte die Antwort mit Erklärung, wie Sie vorgeschlagen. Danke für den Kommentar.