CoderCastrov logo
CoderCastrov
Node Red - Парсер

Автоматизация отслеживания товаров: Создание парсера товаров и системы уведомлений о скидках с помощью Node-RED и Telegram

Автоматизация отслеживания товаров: Создание парсера товаров и системы уведомлений о скидках с помощью Node-RED и Telegram
просмотров
11 мин чтение
#Node Red - Парсер
Table Of Content

Веб-интерфейс панели управления, сохранение товаров в базу данных, получение уведомлений о скидках через Telegram, проверка истории

Node-RED - отличный инструмент для создания парсера товаров, так как вы можете быстро, легко и надежно создать веб-интерфейс и подключение к базе данных.

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

Это также отлично подходит для получения push-уведомления или сообщения в Telegram, Messenger, WhatsApp или подобных сервисах, когда товар, который вы ищете, находится со скидкой. Проверьте мои статьи о чат-ботах с Node-RED.

Если у вас есть магазин, вы можете рассмотреть возможность использования этого инструмента для отслеживания изменений цен между различными конкурирующими магазинами.

Определение структуры данных продукта

Цель ясна: 🔍 спарсить информацию о названии продукта, цене, цене со скидкой и других соответствующих данных, таких как описание, изображение, новая, бывшая в употреблении и восстановленная цена.

Я возьму в качестве примера популярный восточноевропейский интернет-магазин, но не имеет значения, какой сайт вы хотите использовать в качестве цели, так как это универсальный подход, который будет работать для большинства онлайн-магазинов.

Определение структуры данных продукта и фокус

Как видите, я фокусируюсь на 🟨 названии продукта, 🟧 изображениях, 🟫 отзывах, 🟩 рекомендованной или исходной цене продукта и цене со скидкой, 🟦 цене восстановленного продукта, и, вероятно, самое важное, 🟪 коде продукта, так как возможно связать продукты в разных магазинах.

Идентификация HTML-тегов

Теперь, когда вы знаете, что вы хотите извлечь, давайте определим HTML-теги, которые можно использовать, чтобы получить нужную информацию о продукте.

Используя Chrome, Firefox или ваш браузер, щелкните правой кнопкой мыши на элементе, который вы хотите извлечь, и выберите "Инспектировать" или "Элемент инспектировать".

Создайте CSS-селектор для каждого из нижеперечисленных элементов. Откройте новый текстовый документ, чтобы сохранить их на потом.

Вы можете протестировать их в консоли инспектора браузера: $(‘селектор’).

🟨 Заголовок продукта

Заголовок продукта внутри HTML

Вы можете видеть, что заголовок продукта находится внутри тега <h1> с классом "page-title".

Селектор: h1.page-title

🟧 Изображения

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

Селектор: div.product-gallery-wrapper.product-gallery-www div.thumbnail-wrapper img

🟫 Отзывы

Селектор: div.feedback-rating-2 a.rating-text

🟩 Цены

Селектор (1): div.pricing-block p.pricing.rrp-lp30d

Селектор (2): div.pricing-block p.product-new-price

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

🟦 Цена после перепродажи

Селектор: div.alternative-panel-resealed-box p.product-new-price

🟪 Код продукта

Селектор: span.product-code-display

Установка необходимых узлов в Node-RED

Для этих потоков я буду использовать "node-red-contrib-cheerio-function", "node-red-dashboard", "node-red-contrib-chatbot", "node-red-node-sqlite", "sqlite-plugin-red".

Cheerio может помочь извлечь необходимые данные с целевого веб-сайта, как показано выше, а модуль панели инструментов позволяет создавать красивый интерфейс. Chatbot может подключаться к Telegram и другим платформам обмена сообщениями. Работа с базой данных SQLite для обеспечения простоты и быстрой настройки.

Установите их из "Меню" -> "Управление палитрой" (ALT + SHIFT + P).

Создание парсера

Самая важная часть этого проекта - создание парсера для получения информации о продукте, поэтому давайте начнем с использования библиотеки cheerio.

Сначала давайте протестируем его, извлекая содержимое каждого элемента DOM с использованием указанных селекторов и модуля "cheerio". Запустите извлечение, нажав кнопку слева от узла "Product URL inject". Узел "HTTP request" выполнит запрос GET для получения HTML-структуры, что является частью процесса.

Cheerio — initial content extraction

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

Давайте немного очистим это с помощью регулярных выражений, cheerio и функций string.

Cheerio — formatted product data

Самая часто используемая функция - "trim()", так как она удалит ненужные пробелы. "match()" ищет строки с регулярными выражениями в содержимом. Например, "d.+" соответствует цифрам. Вы можете использовать regexr для проверки. "contents()" помогает извлекать все дочерние элементы этого элемента DOM и используется для выбора только первого текстового дочернего элемента. "text()" - это, как следует из названия, функция для получения текста. Что касается изображения, ссылка на .jpg находится в атрибуте "src", "attr('src')".

В последнее время я добавил несколько проверок для случаев, когда нет данных о цене или отзыве, в этом случае будет возвращено значение -1.

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

Сохранение данных в базу данных

Сначала перейдите на вкладку SQLite и создайте новую базу данных. Поскольку я использую Node-RED, настроенный через Docker, я сохраняю базу данных в папку "/data", чтобы иметь доступ к базе данных на своем компьютере и чтобы убедиться, что она будет сохраняться. Вы можете выбрать любой другой путь. "/data/product-scraper.sql"

Затем добавьте таблицу с именем "products" в базу данных с такой структурой, которая включает все данные, которые вы извлекаете из продукта, идентификатор и временную метку, чтобы знать точное время.

Создайте базу данных SQLite и таблицу «products» и протестируйте ее внутри потока

Используя узел SQLite, выберите только что созданную базу данных. Теперь вы должны иметь возможность добавлять данные в базу данных.

Вы можете открыть базу данных с помощью DB Browser for SQLite. Закройте после изучения данных, так как Node-RED не может записывать что-либо, пока база данных открыта.

Просмотр базы данных SQLite с помощью исследователя баз данных

Поток для записи в базу данных довольно прост. С помощью функции INSERT данные добавляются в таблицу products. Если вы хотите изучать продукты с нескольких веб-сайтов, вам может потребоваться добавить запись в таблицу для URL-адреса или домена.

Установите «msg.params» и используйте SQL-запрос для подготовленного выражения в узле SQLite

В базе данных должна быть таблица для списка продуктов, которые будут извлекаться, поэтому давайте создадим ее 💪. Вернитесь на вкладку SQLite справа и добавьте таблицу с именем "to_scrape". Она должна содержать только URL-адресы продуктов, которые наблюдаются.

Создайте новую таблицу - «to_scrape»

Добавьте значения в эту таблицу, как показано выше.

Изменение SQL-запроса для таблицы «to_scrape», вставка URL-адреса

Теперь давайте посмотрим, как мы можем извлечь сохраненную информацию из базы данных для каждой таблицы.

Использование команды "SELECT" в "Fixed Statement" должно быть достаточно, чтобы получить все данные из базы данных. Однако должна быть возможность добавить "WHERE" в SQL-запрос, чтобы выбрать только соответствующий продукт при необходимости создания графика или просмотра истории. Это можно сделать, отправив запрос с использованием параметра "msg.topic", но я реализую это в соответствующих узлах, таких как узлы для панели инструментов 🫡.

Использование узла «SQLite» с запросом «SELECT» для получения продуктов из базы данных

Создание веб-интерфейса

Все собранные данные не будут полезными без красивого интерфейса. К счастью, плагин Node-RED dashboard предоставляет необходимые инструменты для создания живого веб-интерфейса.

Node-RED dashboard, веб-интерфейс для парсера продуктов

Вы можете получить доступ к панели управления, добавив "/ui" в конце URL.

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

Вы можете вручную запустить парсер для всех продуктов в базе данных URL-адресов "to_scrape", нажав кнопку "Парсить все продукты". В противном случае он будет автоматически запускаться каждый час. Кнопка "Получить продукты из базы данных" заполнит список продуктов текущими продуктами.

Интерфейс для парсера продуктов Узлы для парсинга продуктов из базы данных 'to_scrape' и отображения списка базы данных 'products'

Слева вы можете добавить новый URL продукта в базу данных. Если вы планируете использовать это серьезно, убедитесь, что вы добавляете проверку URL перед вставкой его в базу данных, например, проверку совместимости с веб-сайтом и проверку валидности URL. В настоящее время проверяется только наличие дублированных URL-адресов с использованием базы данных "to_scrape".

Вы можете настроить ссылку "Telegram shortcut" в соответствии с вашими потребностями и платформой.

Наконец, внизу интерфейса есть график с историей цен продукта, к которому вы можете получить доступ, нажав кнопку "История" на продукте.

Настройка уведомлений

Вероятно, вам понадобится парсер, подобный этому, чтобы получать уведомления о снижении цены на товар в вашей интересующей области.

Для того чтобы иметь доступ к кросс-платформенному и легкому в настройке решению, я использую Telegram через Red Bot.

Для сохранения подписчиков на уведомления о скидках должна быть создана таблица, содержащая список идентификаторов чатов Telegram, на которые подписаны пользователи. Создайте таблицу "subscribers" внутри базы данных. "discount" представляет собой процентное снижение цены, установленное подписчиком, при котором должно быть отправлено уведомление.

Database table for the “Telegram” subscribers

Узлы, которые обрабатывают уведомления Telegram, находятся внутри потока "Product scraper: notification" и позволяют пользователю получить таблицу с текущими товарами из базы данных и ценами, подписаться на уведомления о товарах со сниженной ценой при определенном пороге и отписаться.

Flows for Telegram notification Flows for Telegram notification

Не забудьте настроить конфигурацию Telegram Red-Bot, как здесь.

Telegram — получение уведомления, когда цена товара снижается

Проверка настройки

Я определил несколько тестовых случаев в потоке "Парсер товаров: тестирование", чтобы убедиться, что все работает как ожидается. Вы можете скопировать и вставить HTML-контент веб-страницы, которую вы хотите парсить, в поле "Ввод страницы товара" и настроить узел "cheerio" по своим потребностям, затем скопировать и заменить узел "cheerio" в потоке "Парсер товаров: парсинг".

Как импортировать этот проект в Node-RED

Сначала убедитесь, что у вас установлены все установленные плагины, упомянутые здесь.

Затем импортируйте эти потоки в ваш Node-RED:

Кнопка «Импорт» потоков Node-RED

Вы должны создать базу данных, как описано в статье: (1), (2), и убедиться, что все узлы, которые требуют базу данных, настроены для ее использования. Узлы Telegram также нужно настроить с правильной конфигурацией бота.

Настройте узлы базы данных 🟦 и Telegram🟧 для использования правильной конфигурации.

Теперь вам нужно только адаптировать узел "cheerio" для веб-сайта, который вы хотите парсить в потоке "Парсер товаров: тестирование" и, когда вы уверены, что все работает, скопируйте и замените узел "cheerio" в потоке "Парсер товаров: парсинг".

Будущая работа

В этой версии я не интегрировал некоторые функции, такие как проверка формы URL, парсинг нескольких веб-сайтов, оповещения о выходе новых продуктов и так далее.

То, что вам действительно может понадобиться, это подделка и рандомизация User-Agent (см. справку по узлу "http request"), а затем использование случайного прокси из списка, чтобы убедиться, что вас не заблокировали, если вы делаете много запросов к одному веб-сайту.

Ознакомьтесь с "node-red-contrib-http-request-proxy".

Наслаждайтесь предложениями

Надеюсь, вы найдете предложения для продуктов, которые вам нужны 🤑.

👋 Если вам это полезно, пожалуйста, нажмите кнопку 👏 ниже несколько раз, чтобы выразить поддержку автору 👇

🚀Присоединяйтесь к сообществу разработчиков FAUN и получайте похожие истории в свою почту каждую неделю


Парсинг Markdown кода с использованием Python

Markdown - это простой язык разметки, который позволяет легко форматировать текст, добавлять изображения и создавать ссылки. Веб-страницы, блоги и многие другие платформы поддерживают Markdown для создания контента.

В этой статье мы рассмотрим, как использовать Python для парсинга Markdown кода. Мы будем использовать библиотеку markdown, которая позволяет нам преобразовывать Markdown в HTML и наоборот.

Установка библиотеки Markdown

Перед тем, как начать парсить Markdown код, нам нужно установить библиотеку markdown. Мы можем сделать это, используя pip, командой:

pip install markdown

Преобразование Markdown в HTML

Для преобразования Markdown в HTML мы будем использовать функцию markdown.markdown(). Вот пример кода:

import markdown

markdown_text = '''
# Заголовок первого уровня

Это абзац текста.

## Заголовок второго уровня

Это другой абзац текста.

* Элемент списка 1
* Элемент списка 2
* Элемент списка 3
'''

html_text = markdown.markdown(markdown_text)
print(html_text)

В этом примере мы преобразуем Markdown код в HTML и выводим результат в консоль. Результат будет выглядеть следующим образом:

<h1>Заголовок первого уровня</h1>

<p>Это абзац текста.</p>

<h2>Заголовок второго уровня</h2>

<p>Это другой абзац текста.</p>

<ul>
<li>Элемент списка 1</li>
<li>Элемент списка 2</li>
<li>Элемент списка 3</li>
</ul>

Преобразование HTML в Markdown

Для преобразования HTML в Markdown мы будем использовать функцию markdown.markdown(), указав параметр output_format='md'. Вот пример кода:

import markdown

html_text = '''
<h1>Заголовок первого уровня</h1>

<p>Это абзац текста.</p>

<h2>Заголовок второго уровня</h2>

<p>Это другой абзац текста.</p>

<ul>
<li>Элемент списка 1</li>
<li>Элемент списка 2</li>
<li>Элемент списка 3</li>
</ul>
'''

markdown_text = markdown.markdown(html_text, output_format='md')
print(markdown_text)

В этом примере мы преобразуем HTML в Markdown и выводим результат в консоль. Результат будет выглядеть следующим образом:

# Заголовок первого уровня

Это абзац текста.

## Заголовок второго уровня

Это другой абзац текста.

* Элемент списка 1
* Элемент списка 2
* Элемент списка 3

Заключение

В этой статье мы рассмотрели, как использовать Python для парсинга Markdown кода. Мы узнали, как преобразовывать Markdown в HTML и наоборот с помощью библиотеки markdown. Это может быть полезно, если вам нужно автоматически преобразовывать Markdown код или создавать собственные инструменты для работы с Markdown.