{"id":14275,"url":"\/distributions\/14275\/click?bit=1&hash=bccbaeb320d3784aa2d1badbee38ca8d11406e8938daaca7e74be177682eb28b","title":"\u041d\u0430 \u0447\u0451\u043c \u0437\u0430\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u044b \u0430\u0432\u0442\u043e?","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"f72066c6-8459-501b-aea6-770cd3ac60a6"}

Как самостоятельно спарсить данные с интернет-магазина при помощи 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 комментариев
Раскрывать всегда