Язык программирования Python

Курс IT-Академии Сухорукова

Апрель-июнь 2020

Этот курс закончился

Задание. Скрэппер для Flickr

Собрать изображения заданной тематики с сайта flickr.com.

Исходные данные

Flickr — это хранилище изображений. На этом сайте можно искать изображения по ключевым словам. Адрес страницы поиска вот такой:

https://www.flickr.com/search/?text=что-искать

Например, найдём фотографии кошек:

https://www.flickr.com/search/?text=cats

Пробелы в поисковом запросе следует заменять на символ +:

https://www.flickr.com/search/?text=fat+cats

На странице результатов поиска показываются первые несколько фотографий. Каждая такая фотография заключена в тег <div>, который можно отличить по наличию класса "photo-list-photo-view". При этом flickr использует хитрость: фотография задана как фоновое изображение элемента <div>, а не с помощью тега <img>. Однако это нам не должно помешать: ссылку на файл фотографии можно извлечь из значения атрибута style, который выглядит как-то так:

<div class="... photo-list-photo-view ..." ... style="transform: translate(0px, 0px); 
     -webkit-transform: translate(0px, 0px); -ms-transform: translate(0px, 0px); 
     width: 244px; height: 180px; 
     background-image: url(//c6.staticflickr.com/4/3677/13545844805_170ec3746b_n.jpg)">

Извлечь вот эту ссылку на изображение: //c6.staticflickr.com/4/3677/13545844805_170ec3746b_n.jpg не составит труда (можно воспользоваться методом find(), либо творчески использовать метод split(), а можно и регулярным выражением). Ссылка находится в атрибуте style в свойстве background-image после ключевого слова url в круглых скобках.

С помощью библиотеки requests можно получить файл изображения по этой ссылке, а затем сохранить файл на диск средствами Python.

Задача

С помощью библиотек requests и Beautiful Soup найти на сайте flickr набор изображений по некоторому поисковому запросу. Сохранить файлы этих изображений в текущий каталог. Поисковый запрос должен быть задан в начале программы в виде константы. Например, так:

QUERY="fat+cat"

Как вариант, можно запрашивать у пользователя запрос с помощью input(), но тогда не забудьте заменить во введённой строке пробелы на символ +.

Замечания

  1. Не забудьте добавить протокол "https:" к ссылке на изображение перед тем, как запрашивать его с помощью requests: https://c6.staticflickr.com/4/3677/13545844805_170ec3746b_n.jpg
  2. Чтобы скачать изображение, нужно создать новый запрос при помощи библиотеки requests и просто сохранить полученный ответ как двоичный файл (используя функции open и write). Содержимое файла в двоичном виде можно найти в response-объекте в атрибуте content.
  3. Сохранять файлы можно с произвольными именами (result1.jpg, result2.jpg и т.п.), но расширение файла должно быть таким же, как в ссылке на файл. То есть если ссылка на файл заканчивалась на .jpg, то и имя выходного файла должно заканчиваться на .jpg. Расширение файла теоретически может быть любым: .jpg, .png, .gif и т.д.
  4. Изображения — двоичные файлы, поэтому файл, в который мы будем сохранять изображение, нужно открывать в режиме "wb" (двоичный файл на запись): f = open(name, mode="wb").