CoderCastrov logo
CoderCastrov
Парсер

Парсинг данных о продуктах с использованием Clojure

Парсинг данных о продуктах с использованием Clojure
просмотров
3 мин чтение
#Парсер

Карта сайта, драйверы браузера и хранение информации о продуктах в Mongo.

Введение

Мне понадобилось получить каталог продуктов компании и я решил попробовать парсинг веб-страниц. Оказалось, что это легко, кратко и быстро реализуется на Clojure! В этой статье мы рассмотрим, как получить информацию о всех продуктах с веб-сайта Bellroy. Обратите внимание, что все парсеры должны соблюдать правила файла robots.txt на веб-серверах, поэтому давайте посмотрим на файл robots.txt Bellroy:

User-agent: Googlebot
Sitemap: https://bellroy.com/sitemap.xml
Sitemap: https://bellroy.com/sitemap-hreflang.xml

User-agent: *
Sitemap: https://bellroy.com/sitemap.xml
Sitemap: https://bellroy.com/sitemap-hreflang.xml

Мы видим, что все агенты пользователей могут просматривать карты сайта, которые должны содержать ссылки на все отдельные страницы на веб-сайте. Просмотрев bellroy.com/sitemap.xml, мы можем увидеть ссылки на продукты (среди прочего):

Выше мы замечаем журнал и две ссылки на продукты. Мы хотим пройти по этому набору URL-адресов и добавить все ссылки на продукты в список в Redis. Обратите внимание, что нам не нужен Redis здесь, это просто личное предпочтение для использования кэша. Затем мы можем пройти по этому списку позже и получить информацию о продукте из URL-адресов с помощью библиотеки веб-драйвера Etaoin. Причина использования веб-драйвера заключается в том, что иногда скрипты загружаются асинхронно, и драйвер учитывает это.

ld+json

Если мы проанализируем страницу продукта Bellroy и выполним поиск html-кода для ld+json, мы увидим несколько совпадающих тегов script. Если мы найдем один из них внутри <div class="ProductDetail">, то увидим следующее (изображения опущены для краткости):

Массив offers показывает варианты продукта; различные стили или цвета с разными ценами и т.д. Мы также видим изображения, артикул, бренд и название. Итак, из приведенного выше json мы хотим извлечь два предложения о продукте.


Настройка окружения

Redis и Mongo:

Библиотечные зависимости:

Получение списка продуктов

Мы можем использовать clojure.xml для разбора XML-карты сайта:

[Сокращенный] вывод представляет собой карту следующего вида:

Информация, которая нас интересует, содержится во множестве вложенных массивов :content. Мы можем извлечь вложенные содержимое и объединить разбор в функцию find-products:

Мы хотим поместить эти ссылки на продукты в наш кэш Redis, чтобы позже мы могли взять время и извлечь URL-адреса из кэша и получить данные о продукте. Давайте настроим некоторые утилиты для работы с кэшем Redis:

Теперь мы можем вызвать find-products с нашей утилитой product->cache. После выполнения этого кода мы можем подсчитать и проверить некоторые продукты, извлекая их из кэша:

Отлично, затем мы можем написать код, который использует драйвер etaoin в сочетании с двоичным файлом драйвера Firefox geckodriver (любой драйвер работает) для загрузки URL-адреса продукта, а затем для парсинга содержимого тега script ld+json!

ld-json-ids - это уникальные идентификаторы тегов script, которые соответствуют нашему запросу ld+json. Мы видим, что у нас есть два тега script; первый будет содержать данные о навигационной цепочке, а второй - данные о продукте.

Мы берем данные о продукте и удаляем все символы @, затем преобразуем их в карту. После получения этой карты мы можем сохранить предложения json в коллекцию Mongo. Используя congomongo, мы подключаемся и массово вставляем документы в коллекцию "bellroy" следующим образом:

Теперь мы можем проверить, что у нас есть продукты в нашей коллекции Mongo "bellroy"!

Конечно, это только для первого URL-адреса продукта в кэше... но проход через остальные URL-адреса и повторение вышеуказанного для вставки всех предложений в Mongo может быть оставлено читателям - или, возможно, в моем репозитории scraper.clj на Github есть код, который может помочь. 😉

Спасибо за чтение!

~ Duane