Для скачивания файлов в python есть очень мощная библиотека — requests. Почти все свои программки для работы с сайтами я пишу с использованием этого модуля. Он удобный, быстрый и многофункционален. Позволяет изменять headers, body, скачивать и заливать файлы. В этом посте я хочу рассказать вам как с легкостью качать файлы на питоне.
Простой запрос страницы через requests
Запросить код сайта можно обычным запросом requests.post(«http://bdseo.ru»).
Как вывести содержимое страницы после запроса
Чтобы обрабатывать результаты, нужно запросу присвоить переменную:
1 2 | r = requests.post("http://bdseo.ru") print(r.text) |
Теперь можно вывести результат запросом r.text (или print(r.text)).
Как сохранить страницу html через requests
1. Делаем запрос.
2. Записываем данные в файл.
На примере (полный код программы):
1 2 3 4 5 | import requests #импортируем модуль send=requests.post('http://bdseo.ru') #делаем запрос file = open('D://bdseo.html','w') #создаем файл для записи результатов file.write(send.text) #записываем результат file.close() #закрываем файл |
После этого на диске Д появился файл с содержимым главной страницы моего блога. Иногда может потребоваться сменить кодировку текста (питон буде подсказывать, выдавать ошибки).
Примеры запросов requests на python 3
Скачивать файлы можно посредством POST или GET запросов. Сам код запроса почти одинаковый:
1 2 3 | send_request = requests.post(url, headers=my_head, data=params) или GET-запрос send_request = requests.get(url, headers=my_head, data=params) |
Где:
send_request — моя переменная, сам запрос. Нужна для дальнейшего обращения к результатам (например, send_request.text — выведет весь код страницы; send_request.url — ссылка страница, если был редирект — то ссылка-редиректа; send_request.headers — код-хедерс страницы);
my_head — если я менял headers, то передаю свои параметры (например, подменил User-agent);
params — параметры запроса; например, логин/пароль.
Как сохранить файл через python (модуль requests)
Логика скачивания файла следующая:
1) делаем запрос на ссылку файла;
2) записываем данные в файл на ПК.
Выглядит все этого следующим образом (полный код программы):
1 2 3 4 5 | import requests #импортируем модуль f=open(r'D:\file_bdseo.zip',"wb") #открываем файл для записи, в режиме wb ufr = requests.get("http://site.ru/file.zip") #делаем запрос f.write(ufr.content) #записываем содержимое в файл; как видите - content запроса f.close() |
Данный код скачает файл на диск Вашего компьютера. Обратите внимание на комментарии — режим записи ‘wb’, сохраняем ‘content’. Закрывайте файл после запроса.
Как скачать файл через прокси в python
Модуль requests имеет подробную документацию (на английском) — http://docs.python-requests.org/en/master/. Работать с сайтами можно и через прокси, для этого достаточно добавить в запрос данные по прокси.
Пример кода:
1 2 3 | proxy='alogin:parol@10.1.1.1:3128' #данные прокси; логин, пароль и айпи адрес с портом proxy = {'http': 'http://' + proxy, 'https': 'https://' + proxy} #делаем прокси доступным в http, https bb3 = requests.get(url, proxies=proxy) #делаем запрос уже с прокси |
Обратите внимание, что некоторые сайты могут блокировать публичные прокси, а также дополнительно запрашивать капчу (редко, но бывает).
Как скачать много файлов с сайта
Чтобы скачать много файлов — пользуйтесь циклами. Чтобы получить ссылки с сайта, если вы хотите скачать много файлов — «просканируйте» сайт на эти ссылки, а потом делайте запросы. Это можно делать также модулем requests в python 3, но это уже совсем другая тема.
А как сделать вывод загрузки?
То есть, вот я уже давно пользуюсь модулем requests. Скачиваю по одной серии сериал, он как бы автоматически скачивает одну серию, уведомляет меня и если я этого хочу, скачивает следующую.
И как сделать вывод, вот например, «56% завершено». Посылая запросы на сайт, можно ли отследить загрузку?
Вариантов много, можно в tkinter, если просто через консоль (или IDLE) тоже можно.
Гуглится просто: «progressbar download requests«; первые примеры на stackoverflow очень простые и полезные
Огромное спасибо! Статья супер!
спасибо за комментарий, мне приятно.