Продолжим тему парсинга и займемся теперь скачивание контента. Допустим мы спарсили ссылки на изображения , скажем обои на рабочий стол. Теперь нам бы хотелось их автоматически загрузить на компьютер. Тут нам опять в помощь библиотека requests и ее метод GET
который и получит нашу картинку с сайта. Для примера создадим список ссылок на картинки:
url = ['http://s1.oboiki.net/uploads/images/others/2015/10/2f76354ffdfe3130c3efd1366353df15/varkraft-anduin-lotar_1920x1080.jpg', 'http://s1.oboiki.net/uploads/images/others/2015/10/f566d6b2f6d1e13e3ef4b5b2f1d3e3fa/kotyara-morda-v-blizi_1920x1080.jpg', 'http://s1.oboiki.net/uploads/images/others/2015/06/c2258ec79a3fab83b18426cbbc813feb/minony_1920x1080.jpg']
Теперь напишем функцию которая будет получать изображение с сайта:
def get_file(url):
response = requests.get(url, stream=True)
return response
stream — (необязательно) если False , содержимое ответа будет немедленно загружено. Мы ставим stream=True
и будем загружать картинку частями(блоками) , вдруг она большая . А если это видео файл и т.д. Тут мы фактически получили только ответ от сервера, данные не загружаются. Соединение остается открытым.
Теперь сделаем функцию которая будет сохранять изображение на компьютер:
def save_data(name, file_data):
file = open(name, 'bw') #Бинарный режим, изображение передається байтами
for chunk in file_data.iter_content(4096)
: # Записываем в файл по блочно данные
file.write(chunk)
for chunk in file_data.iter_content(4096)
в цикле записываем блоки по 4096 байт( 4 килобайта) в файл. То есть метод iter_content() загружает данные сервера блоками и передает их в переменную chunk (перебирает блоки). Так как ссылка указывает на изображение , то мы будем получать байты изображения (Content-Type: image/jpeg) , а не текст например как код страницы (Content-Type: text/html) . Потоковая загрузка так же помогает экономить память. Так как мы загружаем блок, а не все данные сразу.
У нас не хватает одной вещи, имени файла.
Мы же не хотим придумывать заранее или давать какие то не понятные имена. Имена мы оставим родные и вытащим из ссылки на картинку. Напишем функцию которой передадим ссылку и разложи ее на составляющею с помощью текстового метода split(‘ разделитель’ )
def get_name(url):
name = url.split('/')[-1]
return name
Этот метод разделят строку на части разделителем. В нашем случае это /
и возвращает список. Нам нужен только последняя часть этого списка, -1
значит последний индекс списка.
Осталось совсем чучуть. Запустить все это и посмотреть результат:
for name in url: save_data(get_name(name),get_file(name))

не работает