2014-06-21 5 views
18

Ich versuche, eine Python-Funktion zu erstellen, die die gleiche Sache wie dieser wget Befehl tut:Python Äquivalent eines gegebenen wget Befehl

wget -c --read-timeout=5 --tries=0 "$URL" 

-c - Fahren Sie von dort links ab, wenn der Download unterbrochen wird.

--read-timeout=5 - Wenn für mehr als 5 Sekunden keine neuen Daten eintreffen, geben Sie auf und versuchen Sie es erneut. Angesichts -c bedeutet dies, es wird wieder versuchen, wo es aufgehört hat.

--tries=0 - Versuchen Sie es für immer.

Diese drei Argumente, die hintereinander verwendet werden, führen zu einem Download, der nicht fehlschlagen kann.

Ich mag diese Funktionen in meinem Python-Skript kopieren, aber ich weiß nicht, wo ...

+2

Nun, nein, kann der Download * * aus vielen Gründen scheitern aber ja. Haben Sie sich das Modul [requests] (http://docs.python-requests.org/en/latest/) angesehen? – Iguananaut

Antwort

14

urllib.request sollte beginnen arbeiten. Richten Sie es in einer while (not done) -Schleife, überprüfen Sie, ob eine lokale Datei bereits vorhanden ist, wenn es eine GET mit einem RANGE-Header sendet, geben Sie an, wie weit Sie beim Herunterladen der lokalen Datei bekommen haben. Stellen Sie sicher, dass Sie read() verwenden, um an die lokale Datei anzuhängen, bis ein Fehler auftritt.

Dies ist möglicherweise auch ein Duplikat Python urllib2 resume download doesn't work when network reconnects

+0

Wenn ich "urllib.request.urlopen" oder "urllib.request.Request" mit einer Zeichenfolge, die die URL als URL-Argument enthält, versuche, bekomme ich 'ValueError: unbekannter URL-Typ' –

+1

@XamuelDvorak Geben Sie tatsächlich eine URL ein? Eine URL benötigt den Typ, z. 'http: //', 'ftp: //'. –

+0

Ich benutzte 'stackoverflow.com', was in meinem Browser nichts davon hat. –

11
import urllib2 

attempts = 0 

while attempts < 3: 
    try: 
     response = urllib2.urlopen("http://example.com", timeout = 5) 
     content = response.read() 
     f = open("local/index.html", 'w') 
     f.write(content) 
     f.close() 
     break 
    except urllib2.URLError as e: 
     attempts += 1 
     print type(e) 
42

Es gibt auch einen schönen Python-Modul namens wget, die ziemlich einfach zu bedienen ist. Gefunden here.

Dies zeigt die Einfachheit des Designs:

>>> import wget 
>>> url = 'http://www.futurecrew.com/skaven/song_files/mp3/razorback.mp3' 
>>> filename = wget.download(url) 
100% [................................................] 3841532/3841532> 
>> filename 
'razorback.mp3' 

Genießen.

Wenn jedoch wget nicht funktioniert (ich hatte Probleme mit bestimmten PDF-Dateien), versuchen Sie this solution.

Bearbeiten: Sie können auch den Parameter out verwenden, um ein benutzerdefiniertes Ausgabeverzeichnis anstelle des aktuellen Arbeitsverzeichnisses zu verwenden.

>>> output_directory = <directory_name> 
>>> filename = wget.download(url, out=output_directory) 
>>> filename 
'razorback.mp3' 
+0

Ich bekomme Fehler dort kein Modul wget? –

+0

Es ist so viel falsch mit dem, was Sie kommentiert haben, ich weiß nicht, wo ich anfangen soll. Sende eine neue Frage. – Blairg23

+0

ja ich habe hier gepostet https://StackOverflow.com/questions/45747913/Facing-issue-with-wget-in-Python?noredirect=1#comment78456827_45747913 –

5

Ich musste so etwas auf einer Version von Linux tun, die nicht die richtigen Optionen in wget kompiliert hatte. In diesem Beispiel wird das Speicheranalyse-Tool 'guppy' heruntergeladen. Ich bin mir nicht sicher, ob es wichtig ist oder nicht, aber ich hielt die Namen der Zieldatei das gleiche wie der URL-Zielname ...

Hier ist, was ich kam mit:

python -c "import requests; r = requests.get('https://pypi.python.org/packages/source/g/guppy/guppy-0.1.10.tar.gz') ; open('guppy-0.1.10.tar.gz' , 'wb').write(r.content)" 

Das ist die Ein- Liner, hier ist es ein wenig mehr lesbar:

import requests 
fname = 'guppy-0.1.10.tar.gz' 
url = 'https://pypi.python.org/packages/source/g/guppy/' + fname 
r = requests.get(url) 
open(fname , 'wb').write(r.content) 

Dies funktionierte zum Herunterladen eines Tarball. Ich konnte das Paket extrahieren und nach dem Download herunterladen.

EDIT:

eine Frage zu adressieren, hier ist eine Implementierung mit einem Fortschrittsbalken zu STDOUT gedruckt. Es ist wahrscheinlich ein tragbarer Weg, dies zu tun, ohne das clint Paket, aber das war auf meiner Maschine getestet und funktioniert einwandfrei:

#!/usr/bin/env python 

from clint.textui import progress 
import requests 

fname = 'guppy-0.1.10.tar.gz' 
url = 'https://pypi.python.org/packages/source/g/guppy/' + fname 

r = requests.get(url, stream=True) 
with open(fname, 'wb') as f: 
    total_length = int(r.headers.get('content-length')) 
    for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1): 
     if chunk: 
      f.write(chunk) 
      f.flush() 
+4

Gibt es eine Möglichkeit, den Fortschritt der Datei herunterladen anzuzeigen? – mrgloom

0

mir ein Beispiel mit einem Gewinde für den Fall verbessern Lassen Sie viele Dateien herunterladen möchten.

import math 
import random 
import threading 

import requests 
from clint.textui import progress 

# You must define a proxy list 
# I suggests https://free-proxy-list.net/ 
proxies = { 
    0: {'http': 'http://34.208.47.183:80'}, 
    1: {'http': 'http://40.69.191.149:3128'}, 
    2: {'http': 'http://104.154.205.214:1080'}, 
    3: {'http': 'http://52.11.190.64:3128'} 
} 


# you must define the list for files do you want download 
videos = [ 
    "https://i.stack.imgur.com/g2BHi.jpg", 
    "https://i.stack.imgur.com/NURaP.jpg" 
] 

downloaderses = list() 


def downloaders(video, selected_proxy): 
    print("Downloading file named {} by proxy {}...".format(video, selected_proxy)) 
    r = requests.get(video, stream=True, proxies=selected_proxy) 
    nombre_video = video.split("/")[3] 
    with open(nombre_video, 'wb') as f: 
     total_length = int(r.headers.get('content-length')) 
     for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1): 
      if chunk: 
       f.write(chunk) 
       f.flush() 


for video in videos: 
    selected_proxy = proxies[math.floor(random.random() * len(proxies))] 
    t = threading.Thread(target=downloaders, args=(video, selected_proxy)) 
    downloaderses.append(t) 

for _downloaders in downloaderses: 
    _downloaders.start() 
+0

Das macht nichts von dem, was OP verlangt (und einige Dinge, nach denen sie nicht gefragt haben). – melpomene

+0

Das Beispiel versuchen, wget Multi-Download-Funktion –

+0

Niemand fragte darum. OP fragt nach dem Äquivalent von '-c',' --read-timeout = 5' und --tries = 0' (mit einer einzigen URL). – melpomene

0

einfach wie py:

class Downloder(): 
    def download_manager(self, url, destination='Files/DownloderApp/', try_number="10", time_out="60"): 
     #threading.Thread(target=self._wget_dl, args=(url, destination, try_number, time_out, log_file)).start() 
     if self._wget_dl(url, destination, try_number, time_out, log_file) == 0: 
      return True 
     else: 
      return False 


    def _wget_dl(self,url, destination, try_number, time_out): 
     import subprocess 
     command=["wget", "-c", "-P", destination, "-t", try_number, "-T", time_out , url] 
     try: 
      download_state=subprocess.call(command) 
     except Exception as e: 
      print(e) 
     #if download_state==0 => successfull download 
     return download_state 
Verwandte Themen