Сегодня мы научимся скачивать файлы из интернета двумя разными способами. Первый способ предполагает использование модуля под названием wget, и он достаточно хорош для больших файлов. Второй способ использует библиотеку requests, и применяется в основном для сохранения картинок с сайтов. Дело в том, что некоторые сайты ограничивают скачивание картинок с помощью библиотеки wget. Именно поэтому при сохранении html страниц с картинками, приходится использовать вместо wget библиотеку requests. Также понадобится модуль shutil который не нужно ставить, он входит в стандартную поставку модулей Python.
Давайте установим оба модуля:
pip install wget
pip install requests
Теперь давайте попробуем скачать какой-либо файл с помощью модуля wget. Пусть это будет например картинка с моего сайта.
Код программы (обратите внимание что в коде я заменил расширение картинки jpg на jbg - при копировании кода замените обратно):
import wget, os
s='http://pythono.ru/pic/20170413081151825.jbg'
filename = wget.download(s)
os.rename(filename, u''+os.getcwd()+'/'+filename)
Для начала мы поместили адрес скачиваемого файла в переменную s. Далее с помощью команды filename = wget.download(s) мы скачали файл и сохранили его под временным именем, которое поместилось в переменную filename. Теперь, чтобы сохранить в файл под тем именем, которое нам нужно, задействуем модуль os, и дадим команду os.rename(filename, u''+os.getcwd()+filename), которая переместит временный файл в папку, где лежит наш скрипт, сохранив при этом имя файла. Если такой файл там уже существует (например мы запустили скрипт два раза подряд), может возникнуть ошибка, связанная с попыткой перезаписи уже существующего файла, имейте это ввиду.
Теперь скачаем тот же самый файл с помощью библиотеки requests.
import requests, shutil, os
s='http://pythono.ru/pic/20170413081151825.jbg'
(dirname, filename) = os.path.split(s)
r = requests.get(s, stream=True)
if r.status_code == 200:
with open(filename, 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)
Разберем данный код. Сначала мы как обычно помещаем адрес файла, который нужно скачать в переменную s. Далее нам нужно выделить из этого адреса имя файла, под которым мы будем его сохранять. Для этого дадим команду (dirname, filename) = os.path.split(s), которая разделит адрес файла на путь к нему и собственно имя файла, которое нам и нужно. Теперь с помощью get запроса из модуля requests получим файл в переменную r, указав в параметрах запроса stream=true, что означает потоковое сохранение принимаемых данных в файл. Если сервер вернет нам статус 200, что свидетельствует об успешном соединении, с помощью функции open откроем на запись файл с именем filename в режиме записи байтов - 'wb'. И далее с помощью команды shutil.copyfileobj(r.raw, f) скопируем принимаемый поток собственно в файл. Как видим, такой способ немного сложнее чем вариант с wget, но зато он срабатывает в большинстве случаев.
Подписывайтесь на мой блог, будет еще много интересных уроков по Python.
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
t3ran13, xroni, archibald116, tymba, svetlanaaa, tristamoff, gapel, vika-teplo, kondratij, bombo, vealis, skiexpert, ksantoprotein, galinakim, vlad1m1r, verdon, vsebudethorosho, izbushka
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
@pythono Поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за количество голосов
Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
А можно ещё так скачать:
request.urlretrieve(down, url_file + name_file)
Это я из своего скрипта взял.
Такой способ я не пробовал. Спасибо
я знаю, что это прописывается в командной строке, но от куда оно скачивается автоматом? Этот вопрос я уже давно хотел спросить)))
отсюда
https://pypi.python.org/pypi
круто круто
и сразу вопрос, а можно так скачивать *.exe?
а то по пистону хочу подготовить установщик на винду, а некоторые файлы большие и неохота их в архив собирать
я не пробовал но по идее можно (если антивирь ругаться не будет)