Загрузка файлов из различных онлайн-ресурсов – это одна из наиболее важных и общих программистских задач, которые решаются в сети. Важность загрузки файлов можно отметить тем фактом, что огромное количество успешных приложений позволяет пользователям загружать файлы. Вот лишь немногие функции сетевых приложений, требующие загрузку файлов:
- Обмен файлами
- Сбор данных
- Отображение кода интернет-сайта (CSS, JS и так далее)
- Социальные медиа
Это лишь те из примеров, которые пришли в голову, но я уверен, что вы можете придумать их гораздо больше. В этой статье мы взглянем на некоторые наиболее популярные способы загрузить файлы в Python.
Использование модуля urllib.request
Модуль urllib.request предназначен для того, чтобы открывать или загружать файлы через HTTP. В частности, метод urlretrieve из этого модуля поможет нам найти файл.
Чтобы применить этот метод, вам нужно передать ему два аргумента. Первый из них – это URL адрес ресурса, до которого вы хотите добраться, а второй – локальный путь, по которому вы хотите загрузить сохраняемый файл.
Давайте посмотрим на следующий пример:
import urllib.request
print('Beginning file download with urllib2...')
url = 'http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg'
urllib.request.urlretrieve(url, '/Users/scott/Downloads/cat.jpg')В коде, указанном выше, мы сперва импортируем модуль urllib.request. Затем мы создаём переменную url, которая содержит путь к загружаемому файлу. Наконец, мы вызываем метод urlretrieve и передаём ему переменную url в качестве первого аргумента, '/Users/scott/Downloads/cat.jpg' как второй параметр – место назначения файла. Имейте в виду, что можно передать любое имя файла, и он будет находиться по этому пути, если у вас есть права доступа.
Запустите скрипт выше и перейдите в свою директорию ‘Downloads’. Там должен лежать файл ‘cat.jpg’. (вместо ‘scott’ следует указать имя своего домашнего каталога)
Примечание: этот модуль urllib.request.urlretrieve объявлен устаревшим в Python3 и может быть исключён в будущем. Поэтому я рекомендовал бы использовать вместо него один из способов, о которых расскажу далее. Мы упомянули его из-за популярности в версии Python 2.
Использование модуля urllib2
Другой способ загрузить файлы в Python – через модуль urllib2. Метод urlopen этого модуля возвращает объект, содержащий файловые данные. Прочесть содержимое
Заметьте, что в Python urllib2 объединён с urllib в виде методов urllib.request и urllib.error. Так что следующий код будет работать только в Python 2:
import urllib2
filedata = urllib2.urlopen('http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg')
datatowrite = filedata.read()
with open('/Users/scott/Downloads/cat2.jpg', 'wb') as f:
f.write(datatowrite)Метод open принимает два параметра: путь к локальному файлу и режим, в котором будут записаны данные. Здесь 'wb' означает, что методу open нужно разрешение, чтобы записывать двоичные данные в указанный файл.
Запустите скрипт выше и перейдите в директорию ‘Downloads’. Вам нужно увидеть там файл ‘cat2.jpg’.
Использование модуля request
Вы также можете загружать файлы, применяя модуль requests. Входящий в него метод getпредназначен, чтобы скопировать содержимое файла в двоичном формате. Вы можете применить метод open, чтобы открыть файл в вашей системе, как мы это делали в предыдущем методе urllib2.urlopen.
Посмотрите на следующий скрипт:
import requests
print('Beginning file download with requests')
url = 'http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg'
r = requests.get(url)
with open('/Users/scott/Downloads/cat3.jpg', 'wb') as f:
f.write(r.content)
# Retrieve HTTP meta-data
print(r.status_code)
print(r.headers['content-type'])
print(r.encoding)В скрипте выше метод open вновь используется, чтобы записать двоичные данные в локальный файл. Если вы запустите этот скрипт и войдёте в каталог ‘Downloads’, то обнаружите там недавно загруженный файл ‘cat3.jpg’.
С помощью модуля requests вы также можете легко получить соответствующие метаданные о вашем запросе, включая код статуса, заголовки и многое другое. В скрипте вы можете видеть, как мы получаем доступ к этим метаданным.
То же самое происходит с дополнительными параметрами, которые требуются в HTTP запросе GET. Если вам нужно добавить отдельные заголовки, к примеру, то надо лишь создать словарь dict с этими заголовками и передать их запросу get:
headers = {'user-agent': 'test-app/0.0.1'}
r = requests.get(url, headers=headers)Есть тьма других опций и возможностей к этой библиотеке, так что проверьте их большой user guide, чтобы узнать больше о том, как её использовать.
Использование модуля wget
Один из простейших способов загрузить файлы в Python – через модуль wget, с которым вам не нужно открывать конечный файл. Метод download модуля wget загружает файлы в одну строчку. Метод принимает два параметра: URL путь к загружаемому файлу и локальный путь, где следует сохранить файл.
import wget
print('Beginning file download with wget module')
url = 'http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg'
wget.download(url, '/Users/scott/Downloads/cat4.jpg')Запустить скрипт выше и опять зайдите в ‘Downloads’. Здесь вы снова увидите свежезагруженный файл ‘cat4.jpg’.
Заключение
В этой статье мы представили четыре наиболее употребительных метода для загрузки файлов в Python. Лично я предпочитаю модуль request из-за сочетания его простоты и силы. Хотя ваш проект может иметь ограничения, мешающие вам использовать сторонние библиотеки, в таком случае я бы воспользовался модулем urllib2 (для Python 2) или urllib.request (для Python 3).
Какую библиотеку вы предпочитаете и почему? Расскажите об этом в комментариях!