Как самостоятельно спарсить данные с интернет-магазина при помощи Python
По рабочим задачам часто сталкиваюсь с задачами по парсингу. В этой короткой статье я покажу как сделать свой парсер, который будет получать данные с сайта Pleer.ru по ссылке из любой категории с листингом товаров — название, цену, заголовок страницы товара, id.
Статья написана в образовательных целях. Код сайта со временем изменится и скрипт не будет работать путём копипаста, нужно будет изменить XPath-выражения.
Инструментарий: Python 3 + библиотеки
Я буду использовать Python 3 и некоторые распространенные библиотеки Python.
Вот некоторые данные, которые этот парсер поможет вам извлечь в csv-таблицу:
- Называние
- Цена
- Id
- Title
В парсер легко добавить любые данные с сайта, помимо уже существующих — урл картинок или сами картинки, описания, отзывы и т.д.
Сохраню данные в виде электронной таблицы Excel (CSV), которая выглядит следующим образом:
Установка необходимых пакетов
Тут я не рассказываю про основы Python и как его установить, это тема отдельной статьи. Буду использовать следующие библиотеки:
- requests
- csv
- time
- lxml
Устанавливаю их с помощью pip3:
Код проекта на 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-файле будет пустая ячейка, потому что меняется вёрстка.
Список выше только часть проблем, с которыми сталкиваешься при парсинге и у каждого сайта они могут быть индивидуальны, особенно, если проект крупный.