О парсинге фотостоков

Продолжим, тему парсинга изображений с различных сайтов. Сегодня у нас простой скрипт для парсинга pexels.com. Работает скрипт так:

# ./downloader.pexels.com.sh green 1

green — ключевое слово, по которому мы будем парсить сайт.
1 — страница выдачи с которой мы начнём парсинг.

Скачать скрипт можно здесь.

Результатом работы скрипта будет файл *.url.list со списком ссылок на изображения. Этот список ссылок можно использовать для скачивания wget’ом, например, либо для постинга в канал по описанной ранее схеме.

Немного теории.

Несколько слов о том, как можно парсить сайты с изображениями без постраничной навигации (когда изображения подгружаются при прокрутке). Что бы распарсить такой сайт, нам нужно сделать три важных вещи:

  • Понять каким скриптом производится подгрузка, какой делается запрос.
  • Определить последнюю страницу (последний экран) выдачи, что бы на нём остановить парсинг.
  • Получить нужные URL со страниц сайта.

Находим скрипт.

Для того что бы понять как именно выполняется загрузка делаем следующее:

1. Идём на сайт pexels.com, например, из браузера Сhromium (ну или просто из Google Chrome).
2. Жмём Ctrl+SHift+I, открывая тем самым инструменты для разработчиков и переходим на вкладку Network.
3. В строку поиска на сайте вводим наш ключевик, например clock. Получаем примерно такой результат:

4. В правой части, мы видим список подгружаемых на страницу элементов. Когда мы начнём листать страницу вниз, при загрузке новых изображений запустятся соответствующие скрипты, они-то и будут нужны нам для парсинга. Прокручиваем страницу, получаем очередной список элементов, смотрим на них и находим нужный:

5. Кликаем на элемент, и получаем его подробности, в них нас должен заинтересовать Request URL — это тот самый адрес, который мы будем использовать в скрипте. Отбросим всё лишнее, оставим нужное и получим вот такой URL:

https://www.pexels.com/search/clock/?page=2&format=js

Теперь, перебирая page= мы получаем страницы (а в данном случае код) со ссылками на изображения. Остаётся только автоматизировать перебор страниц и получение прямых ссылок на изображения.

Перебор страниц.

Тут универсального рецепта нет, для каждого сайта нужно находить свой алгоритм.

Для pexels.com я пошёл вот по какому пути… Каждая страница выдачи изображений, содержит ссылку на следующую. На page=1 мы можем найти ссылку на page=2, там на page=3 и так далее. При этом, последняя страница такой ссылки содержать уже не будет. А значит мы берём нужную нам страницу выдачи, проверяем есть ли страница после неё, если есть — переходим, если нет — заканчиваем работу цикла.

Для stocksnap.io, о котором я писал ранее, я применил похожую схему. Там страница содержит параметр .nextPage, мы проверяем наличие этого параметра, и если он есть, на следующую страницу переходим, если нет, завершаем цикл.

Получение URL.

У нас есть всё для автоматизации перебора страниц, всё что нам остаётся — получить адреса изображений со страниц сайта.

В случае со stocksnap.io всё оказалось просто — там я забираю скриптом JSON и просто выдёргиваю нужную переменную, содержащую URL.

C pexels.com дела обстоят сложнее — там весь код написан в одну строку, так что для получения ссылок я сначала выделяю их отдельной строкой, выбираю только нужные мне URL и избавляюсь от дублей. Не исключаю, что это не самый удачный подход, но он показал себя хорошо в моём случае.

Имея алгоритм разбора, всё что остаётся — написать скрипт, который всё это будет делать за нас. Пример такого скрипта для pexels.com можно найти в начале поста, а для stocksnap.io в одной из предыдущих заметок.

@SysadminNotes | https://sysadmin.pm

2 thoughts on “О парсинге фотостоков

  1. Только что проверил, скрин работает, но не наполняет файл *.url.list

  2. [root@cwp download]# ./downloader.pexels.com.sh food 1
    —2021-01-01 20:56:37— https://www.pexels.com/search/food/?page=1&format=js
    Визначення назви http://www.pexels.com (www.pexels.com)… 104.17.209.102, 104.17.208.102, 2606:4700::6811:d066, …
    Встановлення з’єднання з http://www.pexels.com (www.pexels.com)|104.17.209.102|:443… з’єднано.
    HTTP-запит надіслано, очікуємо на відповідь… 403 Forbidden
    2021-01-01 20:56:38 ПОМИЛКА 403: Forbidden.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *