Парсинг сайтов на Python. Загружаем изображение. Часть 2

Продолжим тему парсинга и займемся теперь скачивание контента. Допустим мы спарсили ссылки на изображения , скажем обои на рабочий стол. Теперь нам бы хотелось их автоматически загрузить на компьютер. Тут нам опять в помощь библиотека 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']

Теперь напишем функцию которая будет получать изображение с сайта:

ef 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))