Python, парсинг сайта интернет-магазина

В предыдущих двух сериалах я разбирался с ffmpeg (и генерил видео из картинок и текста) и погружался в YouTube API чтобы загружать те самые сгенеренные ролики на YouTube в полуавтоматическом режиме с заголовками, описаниями и тегами. Все это может быть полезно для создания видео из карточек товаров интернет-магазинов.

Зачем? Варианта два:

  • вы собственник такого магазина (или работаете в нем) и видео ещё один канал привлечения аудитории и покупателей
  • вы зарабатываете на партнерских программах магазинов, например в Адмитаде или ePN и видосики источник супернизкочастотки, при объеме и/или творческом подходе такие видео могут давать нормально трафика

Как бы то ни было вам нужны исходники — картинки и текст. Возможно цены, скидки и отзывы. Если вы работает в магазине, то что-то можно получить изнутри (но порой это сложно). А если вы генерите видео под партнерку, то нет никаких других вариантов кроме как Парсить Интернет-Магазин.

Описание работы кода в видео

Парсинг сайта магазина на Python

Я не буду глубоко погружаться в тему парсинга на данном этапе. Подходов к парсингу много. Не мало сложностей и способов решения этих сложностей.

Моя цель — создать приложение которое парсит картинки и текст, генерит видео и описания к видео и загружает все это на YouTube. Поэтому я НЕ буду парсить сложные магазины в этом сериале (такие как Алиэкспресс, например). Возьму попроще, в сегодняшнем примере Акушерство Ру и Технопарк Ру, оба они есть в Адмитаде.

Инструменты для парсинга магазина на Python

Я использую:

  • библиотеку requests для получения страниц магазина
  • lxml + xpath для разбора html содержимого страниц
  • pillow для скачивания и обработки картинок
  • также удобно использовать Developer Tools в Chrome для отладки xpath выражений

Как происходит парсинг

С помощью библиотеки requests я получаю страницу магазина. Если на этапе получения будут ошибки, то скрипт выбросит исключение. Затем ответ я передаю в библиотеку lxml для разбора дерева DOM (иерархия html тегов). Затем с помощью xpath я выделяю в html коде странице нужные мне элементы:

  • название товара,
  • цену
  • картинку
  • описание
  • могут быть дополнительно — отзывы, скидки, характеристики, но в моем скриптк пока обойдемся без них

Картинку скачиваю с помощью связки библиотек requests + io + pillow и складываю в папку data, а текстовки возвращаю — их я буду использовать и при генерации видео и для описания видео при загрузке его на YouTube.

Исходный код скрипта

Весь исходный код скрипта будет доступен на гитхабе . По мере работы над проектом код будет дополняться, а функционал расширяться (см. соотв. ветки репозитория).

Часть кода ниже, пояснения в комментариях в коде.

Родительский класс ко всем классам магазинов. В нем все общее, не зависящее от верстки и особенностей каждого из магазинов. Функции http запросов, парсинга и обработки dom и т.д.


В этом коде пример класса для парсинга одного из магазинов. В данной версии парсинг только карточки товара.


 

Проблемы Парсинга

При парсинге я привязываюсь к аттрибутам тегов, соотв. если в магазине поменяют верстку, то парсинг сломается. Иногда бывает достаточно добавить в верстку дополнительный элемент чтобы все пошло не так. Для упрощения я в проекте выделил модули парсинга магазина каждый в отдельный класс. Так я могу править парсинг одного конкретного магазина не трогая другие магазины (а их может быть много).

Картинки бывают разных форматов и размеров. Особенно проблемны webp. А форматы и размеры нам будут важны при генерации видосиков. Поэтому я подключил Pillow — с ним будет проще разбираться с картинками дальше.

Все больше и больше магазинов используют js фреймворки или просто динамический фронтенд, а всю логику отдают в json. Способ в сегодняшнем примере не подойдет для парсинга такого магазина. Впрочем, если магазин не настроен серьезно защищаться от парсеров, разобраться с таким парсингом не сложно.