Эквивалент Python данной команды wget
Я пытаюсь создать функцию Python, которая делает то же самое, что и эта команда wget:
wget -c --read-timeout=5 --tries=0 "$URL"
-c
- Продолжайте движение с того места, где вы остановились, если загрузка прервана.
--read-timeout=5
- Если новые данные не поступают более 5 секунд, сдайте и повторите попытку. Учитывая -c
, это означает, что он попытается снова с того места, где он остановился.
--tries=0
- Повторите попытку навсегда.
Те три аргумента, которые используются в тандеме, приводят к загрузке, которая не может потерпеть неудачу.
Я хочу дублировать эти функции в моем Python script, но я не знаю, с чего начать...
Ответы
Ответ 1
urllib.request должен работать. Просто установите его в цикле while (not done), проверьте, существует ли уже локальный файл, отправляет ли он GET с заголовком RANGE, указывая, как далеко вы продвинулись при загрузке локального файла. Обязательно используйте read() для добавления в локальный файл, пока не произойдет ошибка.
Это также может быть дубликатом возобновленной загрузки Python urllib2, которая не работает при повторном подключении к сети.
Ответ 2
Существует также хороший модуль Python с именем wget
, который довольно прост в использовании. Найдено здесь.
Это демонстрирует простоту дизайна:
>>> import wget
>>> url = 'http://www.futurecrew.com/skaven/song_files/mp3/razorback.mp3'
>>> filename = wget.download(url)
100% [................................................] 3841532 / 3841532>
>> filename
'razorback.mp3'
Enjoy.
Однако, если wget
не работает (у меня были проблемы с некоторыми PDF файлами), попробуйте этого решения.
Изменить: Вы также можете использовать параметр out
для использования настраиваемого каталога вывода вместо текущего рабочего каталога.
>>> output_directory = <directory_name>
>>> filename = wget.download(url, out=output_directory)
>>> filename
'razorback.mp3'
Ответ 3
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)
Ответ 4
Мне нужно было сделать что-то подобное в версии Linux, у которой не было правильных параметров, скомпилированных в wget. Этот пример предназначен для загрузки инструмента анализа памяти "guppy". Я не уверен, важно это или нет, но я сохранил имя целевого файла так же, как имя целевого URL...
Вот что я придумал:
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)"
Что однострочный, вот он немного читаем:
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)
Это работало на загрузку tarball. Я смог извлечь пакет и загрузить его после загрузки.
EDIT:
Чтобы решить вопрос, вот реализация с индикатором выполнения, напечатанным в STDOUT. Вероятно, это более переносимый способ сделать это без пакета clint
, но это было проверено на моей машине и прекрасно работает:
#!/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()
Ответ 5
просто как 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
Ответ 6
Позвольте мне улучшить пример с потоками, если вы хотите загрузить много файлов.
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()
Ответ 7
Решение, которое я часто нахожу более простым и надежным, заключается в простом выполнении команды терминала в Python. В твоем случае:
import os
url = 'https://www.someurl.com'
os.system(f"""wget -c --read-timeout=5 --tries=0 "{url}"""")