{"id":14276,"url":"\/distributions\/14276\/click?bit=1&hash=721b78297d313f451e61a17537482715c74771bae8c8ce438ed30c5ac3bb4196","title":"\u0418\u043d\u0432\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0432\u0430\u0440 \u0438\u043b\u0438 \u0443\u0441\u043b\u0443\u0433\u0443 \u0431\u0435\u0437 \u0431\u0438\u0440\u0436\u0438","buttonText":"","imageUuid":""}

Как самостоятельно спарсить данные с интернет-магазина при помощи Python

По рабочим задачам часто сталкиваюсь с задачами по парсингу. В этой короткой статье я покажу как сделать свой парсер, который будет получать данные с сайта Pleer.ru по ссылке из любой категории с листингом товаров — название, цену, заголовок страницы товара, id.

Статья написана в образовательных целях. Код сайта со временем изменится и скрипт не будет работать путём копипаста, нужно будет изменить XPath-выражения.

Инструментарий: Python 3 + библиотеки

Я буду использовать Python 3 и некоторые распространенные библиотеки Python.

Вот некоторые данные, которые этот парсер поможет вам извлечь в csv-таблицу:

  • Называние
  • Цена
  • Id
  • Title

В парсер легко добавить любые данные с сайта, помимо уже существующих — урл картинок или сами картинки, описания, отзывы и т.д.

Сохраню данные в виде электронной таблицы Excel (CSV), которая выглядит следующим образом:

Установка необходимых пакетов

Тут я не рассказываю про основы Python и как его установить, это тема отдельной статьи. Буду использовать следующие библиотеки:

  • requests
  • csv
  • time
  • lxml

Устанавливаю их с помощью pip3:

pip3 install requests, csv, time, lxml

Код проекта на Python

Все исходники загрузил на Github по адресу https://github.com/Megaduox/parser_pleer.ru.

Внутри три функции:

  • get_links() — принимает на вход url, берёт все ссылки с него на товары из листинга, проходит по всей пейдижнации и складывает ссылки в множество QUEUE_URL
  • get_data() — принимает на вход один урл товара, парсит данные. Сами данные никуда не записывает, а возвращает список данных в виде словаря.
  • main() — точка входа. Записывает получившиеся данные в файл csv, вызывая в своей работе get_links() для парсинга списка всех товаров и рекурсивно get_data() для парсинга конкретного урла.

Проблемы, с которыми вы можете столкнуться

  • Сайт при парсинге отдаёт код 204, страница рабочая, но без контента. Решается добавлением рандомных хедеров.
  • Для того, чтобы сайт не забанил при парсинге, нужно делать задержку между запросами рандомом в несколько секунд.
  • Пейджинация чуть хитрее, потому что несуществующие страницы отдают 200 код, а не 404 и поэтому их нельзя перебрать в цикле стандартным способом.
  • Чтобы парсить весь сайт нужно пилить либо через прокси, либо через Selenium.
  • Если товара нет в наличии на странице, то в csv-файле будет пустая ячейка, потому что меняется вёрстка.

Список выше только часть проблем, с которыми сталкиваешься при парсинге и у каждого сайта они могут быть индивидуальны, особенно, если проект крупный.

0
Комментарии
-3 комментариев
Раскрывать всегда