У меня есть небольшая утилита, которую я использую для загрузки файла MP3 с веб-сайта по расписанию, а затем для создания / обновления файла XML подкаста, который я добавил в iTunes.
Обработка текста, который создает / обновляет файл XML, написана на Python. Тем не менее, я использую wget внутри .bat
файла Windows для загрузки самого файла MP3. Я бы предпочел, чтобы вся утилита была написана на Python.
Я изо всех сил пытался найти способ действительно загрузить файл в Python, поэтому я прибег к использованию wget
.
Итак, как мне загрузить файл с помощью Python?
wget
. Помимо прочего,wget
(1) сохраняет метки времени (2) автоматически определяет имя файла по URL, добавляя.1
(и т. Д.), Если файл уже существует (3), имеет много других опций, некоторые из которых вы, возможно, добавили в свой.wgetrc
. Если вы хотите что-то из этого, вы должны сами реализовать их в Python, но проще просто вызватьwget
из Python.import urllib.request; s = urllib.request.urlopen('http://example.com/').read().decode()
Ответы:
В Python 2 используйте urllib2, который поставляется со стандартной библиотекой.
Это самый простой способ использования библиотеки, за исключением обработки ошибок. Вы также можете делать более сложные вещи, такие как смена заголовков. Документацию можно найти здесь.
источник
urllib2.quote
Еще один, используя
urlretrieve
:(для Python 3+ используйте
import urllib.request
иurllib.request.urlretrieve
)Еще один, с "прогрессбаром"
источник
if not os.path.isfile(file_name):
чтобы избежать перезаписи подкастов! полезно, когда запускается как cronjob с URL-адресами, найденными в файле .htmlВ 2012 году используйте библиотеку запросов Python
Вы можете бежать,
pip install requests
чтобы получить это.Запросы имеют много преимуществ по сравнению с альтернативами, потому что API намного проще. Это особенно верно, если вам нужно сделать аутентификацию. urllib и urllib2 довольно неинтуитивны и болезненны в этом случае.
2015-12-30
Люди выразили восхищение прогресс-баром. Это круто, конечно. В настоящее время существует несколько готовых решений, в том числе
tqdm
:По сути, это реализация @kvance, описанная 30 месяцев назад.
источник
r.text
для текстового или юникодного контента. Возвращено как Unicode.r.content
: Для двоичного содержимого. Возвращается в байтах. Прочитайте об этом здесь: docs.python-requests.org/en/latest/user/quickstartwb
Вopen('test.mp3','wb')
открывает файл (и удаляет любой существующий файл) в двоичном режиме , так что вы можете сохранить данные с него , а не просто текст.источник
file.read
, равный количеству байтов для чтения. Смотрите: gist.github.com/hughdbrown/c145b8385a2afa6570e2shutil.copyfileobj(mp3file, output)
вместо этого.Python 3
urllib.request.urlopen
urllib.request.urlretrieve
Примечание: согласно документации,
urllib.request.urlretrieve
это «устаревший интерфейс» и «может устареть в будущем» (спасибо, геррит )Python 2
urllib2.urlopen
(спасибо Кори )urllib.urlretrieve
(спасибо, ПаблоГ )источник
urllib.request.urlretrieve
выше, это приведет вас к этой точной ссылке. Ура!urllib.request.urlretrieve
задокументировано как «устаревший интерфейс» и «может устареть в будущем».используйте модуль wget:
источник
Улучшенная версия кода PabloG для Python 2/3:
источник
Простой, но
Python 2 & Python 3
совместимый способ поставляется сsix
библиотекой:источник
источник
Написал библиотеку wget на чистом Python как раз для этого. Он накачивается
urlretrieve
с этими функциями , начиная с версии 2.0.источник
-o
на,-O
чтобы избежать путаницы, как в GNU wget. Или, по крайней мере, оба варианта должны быть действительными.wget.py
замену на месте по-настоящемуwget
.-o
Уже ведет себя по- разному - это совместимо сcurl
этим способом. Поможет ли примечание в документации решить проблему? Или для утилиты с таким именем важно совместимость с командной строкой?Ниже приведены наиболее часто используемые вызовы для загрузки файлов в Python:
urllib.urlretrieve ('url_to_file', file_name)
urllib2.urlopen('url_to_file')
requests.get(url)
wget.download('url', file_name)
Примечание:
urlopen
иurlretrieve
обнаружено, что он работает относительно плохо при загрузке больших файлов (размер> 500 МБ).requests.get
сохраняет файл в памяти до завершения загрузки.источник
Я согласен с Кори, urllib2 является более полным, чем urllib, и, вероятно, должен использоваться как модуль, если вы хотите делать более сложные вещи, но чтобы сделать ответы более полными, urllib - более простой модуль, если вам нужны только основы:
Будет работать нормально. Или, если вы не хотите иметь дело с объектом «response», вы можете вызвать read () напрямую:
источник
В python3 вы можете использовать библиотеки urllib3 и shutil. Загрузите их, используя pip или pip3 (в зависимости от того, используется ли python3 по умолчанию)
Затем запустите этот код
Обратите внимание, что вы загружаете,
urllib3
но используетеurllib
в кодеисточник
Вы также можете получить отзыв о прогрессе с помощью urlretrieve:
источник
Если у вас установлен wget, вы можете использовать parallel_sync.
pip install parallel_sync
Документ: https://pythonhosted.org/parallel_sync/pages/examples.html.
Это довольно мощно. Он может загружать файлы параллельно, повторять попытки при сбое и даже загружать файлы на удаленном компьютере.
источник
Если скорость имеет значение для вас, я сделал небольшой тест производительности для модулей
urllib
иwget
, и относительноwget
я попробовал один раз с строкой состояния и один раз без. Я взял три разных файла размером 500 МБ для тестирования (разные файлы - чтобы исключить вероятность того, что под капотом происходит какое-то кэширование). Протестировано на машине Debian, с python2.Во-первых, это результаты (они похожи в разных прогонах):
Я выполнил тест с использованием декоратора профиля. Это полный код:
urllib
кажется самым быстрымисточник
Для полноты картины можно также вызвать любую программу для получения файлов с помощью
subprocess
пакета. Программы, предназначенные для извлечения файлов, более мощные, чем функции Pythonurlretrieve
. Например,wget
может загружать каталоги рекурсивно (-R
), может иметь дело с FTP, перенаправлениями, HTTP-прокси, может избежать повторной загрузки существующих файлов (-nc
) иaria2
может выполнять загрузку с несколькими подключениями, что потенциально может ускорить загрузку.В Jupyter Notebook можно также вызывать программы напрямую с помощью
!
синтаксиса:источник
Исходный код может быть:
источник
Вы можете использовать PycURL на Python 2 и 3.
источник
Я написал следующее, которое работает в ванильном Python 2 или Python 3.
Ноты:
источник
Это может быть немного поздно, но я видел код pabloG и не мог не добавить os.system ('cls'), чтобы он выглядел УДИВИТЕЛЬНО! Проверьте это:
Если вы работаете в среде, отличной от Windows, вам придется использовать что-то другое, чем «cls». В MAC OS X и Linux это должно быть «ясно».
источник
cls
ничего не делает ни на моей OS X, ни на моем сервере Ubuntu. Некоторые разъяснения могут быть хорошими.clear
для Linux, или даже лучше заменить строку печати вместо очистки всего вывода командной строки.os.system()
), которая запускает подпроцесс, чтобы очистить экран с помощью специальной команды платформы (cls
). Как это имеет какие-либо голоса ?? Совершенно бесполезный "ответ" ИМХО.urlretrieve иquesses.get просты, однако реальность нет. Я получил данные для пары сайтов, включая текст и изображения, два из которых, вероятно, решают большинство задач. но для более универсального решения я предлагаю использовать урлопен. Поскольку он включен в стандартную библиотеку Python 3, ваш код может работать на любом компьютере, на котором запущен Python 3 без предварительной установки site-package.
Этот ответ обеспечивает решение HTTP 403 Запрещено при загрузке файла через http с использованием Python. Я пробовал только запросы и модули urllib, другой модуль может обеспечить что-то лучшее, но именно этот я использовал для решения большинства проблем.
источник
Поздний ответ, но для
python>=3.6
вас можно использовать:Установить
dload
с помощью:источник
Я хотел скачать все файлы с веб-страницы. Я пытался,
wget
но это не удавалось, поэтому я выбрал маршрут Python и нашел эту ветку.Прочитав его, я сделал небольшое приложение для командной строки, подробно остановившись
soupget
на превосходных ответах PabloG и Stan и добавив несколько полезных опций.Он использует BeatifulSoup, чтобы собрать все URL-адреса страницы, а затем загрузить те с нужным расширением (ями). Наконец он может загружать несколько файлов параллельно.
Вот:
Пример его использования:
И реальный пример, если вы хотите увидеть это в действии:
источник