Парсинг сайта с помощью n8n: Полное руководство
Парсинг (веб-скрапинг) — это процесс автоматизированного сбора и структурирования данных с веб-сайтов. n8n — это инструмент с открытым исходным кодом для оркестрации рабочих процессов (workflow automation), который предоставляет мощные возможности для создания гибких, надежных и сложных парсеров. В отличие от специализированных библиотек, таких как Scrapy или Beautiful Soup, n8n позволяет визуально проектировать весь процесс: от запроса к странице и извлечения данных до их очистки, преобразования и сохранения в различные системы (базы данных, Google Sheets, CRM, API и т.д.).
Архитектура парсера в n8n
Типичный рабочий процесс парсинга в n8n состоит из нескольких логических блоков, соединенных между собой. Каждый блок представлен нодой (узлом).
- Триггерная нода: Запускает рабочий процесс. Это может быть расписание (Schedule Trigger), вебхук, запуск вручную или событие из другой системы.
- Нода HTTP-запроса: Ключевая нода для загрузки веб-страницы. Она отправляет GET или POST запросы к целевому URL. Важно правильно настроить заголовки (User-Agent, Accept), чтобы имитировать поведение браузера и избежать блокировки.
- Ноды обработки HTML: Ноды для извлечения данных из полученного HTML. Основные из них: HTML Extract и HTML. Они используют селекторы (CSS или XPath) для нахождения нужных элементов на странице.
- Ноды обработки данных: Ноды для преобразования, фильтрации и очистки извлеченных данных (Set, Item Lists, Filter, Code).
- Ноды цикла: Нода SplitInBatches или Iterator для обработки пагинации или списка ссылок, полученных с основной страницы.
- Ноды сохранения данных: Ноды для записи результатов в конечную точку: база данных (PostgreSQL, MySQL), Google Sheets, файл (CSV, JSON), или отправка в другой API.
- Method: Обычно GET. Для POST-запросов с передачей данных формы используется POST.
- URL: Адрес целевой страницы. Может быть динамическим, используя выражения из предыдущих нод.
- Headers:
- User-Agent: Установите значение, имитирующее реальный браузер (например, ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36’).
- Accept: ‘text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8′
- Accept-Language: ‘en-US,en;q=0.9’
- Query Parameters: Для передачи параметров в URL (например, ?page=1&sort=price).
- Authentication: Настройки базовой или токенной аутентификации, если сайт требует авторизации.
- Response Format: Убедитесь, что установлено значение ‘String’, чтобы получить HTML в виде текста для последующего парсинга.
- Key: title, Selector: h1.product-title, Return Value: Text
- Key: price, Selector: span.price, Return Value: Text
- Key: image_url, Selector: img.product-image, Return Value: Attribute (attr: src)
- Key: product_link, Selector: a.product-link, Return Value: Attribute (attr: href)
- С помощью ноды HTTP Request загружается первая страница списка.
- Нода HTML Extract извлекает ссылки на детальные страницы (если нужно) и, возможно, ссылку на следующую страницу пагинации.
- Нода SplitInBatches или Iterator принимает массив ссылок на детальные страницы и последовательно отправляет их на обработку.
- Для каждой детальной страницы выполняется новый HTTP-запрос и извлечение данных.
- Если нужно пройти по страницам пагинации, можно использовать ноду Loop (While). Алгоритм:
- Установить переменную `pageNumber = 1` и `hasNextPage = true`.
- В цикле While, пока `hasNextPage` равно true, выполнять:
- Формировать URL с параметром `page={{ pageNumber }}`.
- Загружать и парсить страницу.
- Сохранять данные.
- Проверять (через селектор) наличие кнопки «Далее». Если ее нет, установить `hasNextPage = false`.
- Увеличить `pageNumber` на 1.
- Поиск скрытого API: Используйте инструменты разработчика в браузере (вкладка Network) для поиска XHR/Fetch запросов, которые возвращают данные в формате JSON. Часто это более эффективный и чистый способ получения данных.
- Нода Browser Automation (например, Puppeteer или Playwright): Позволяет управлять реальным браузером, что гарантирует полную загрузку и рендеринг страницы. Однако этот способ требует значительно больше ресурсов и времени.
- Использование внешних сервисов: Интеграция со специализированными сервисами парсинга (например, ScrapingBee, ScraperAPI) через их API, которые сами обрабатывают JS.
- Файлы: Write to File (локально) или Google Drive, Dropbox.
- Таблицы: Google Sheets, Airtable.
- Базы данных: PostgreSQL, MySQL, SQLite, MongoDB.
- Очереди и сообщения: RabbitMQ, Redis.
- Другие системы: Отправка по email, в Telegram, запись в CRM (HubSpot, Salesforce).
- Использовать ноду Wait для добавления задержек между запросами, чтобы не перегружать сервер и избежать блокировки.
- Настраивать Retry на ноде HTTP Request для автоматических повторных попыток при сетевых сбоях.
- Использовать ноду Error Trigger или обработку ошибок на отдельных ветках для логирования и уведомления об ошибках (например, через Telegram или email).
- Регулярно (например, раз в неделю) запускать тестовый workflow для проверки актуальности селекторов.
- Всегда настраивайте реалистичные заголовки HTTP-запросов, особенно User-Agent.
- Добавляйте паузы между запросами с помощью ноды Wait. Используйте случайные интервалы.
- По возможности используйте ротацию User-Agent и прокси-серверов. Для работы с прокси можно настроить параметры в ноде HTTP Request или использовать промежуточную ноду Function для динамического изменения конфигурации.
- Соблюдайте правила, указанные в файле robots.txt целевого сайта.
- Найти скрытый API, который сайт использует для подгрузки контента (чаще всего это GET или POST запрос с параметрами offset/limit).
- Использовать ноду Browser Automation (Puppeteer/Playwright) для имитации прокрутки страницы и загрузки всего контента.
- Создайте отдельный workflow или ветку для логина.
- Используйте ноду HTTP Request с методом POST для отправки учетных данных на endpoint входа (например, /login).
- Из ответа извлеките токен или session cookie.
- Передайте этот токен или cookie в последующие запросы через заголовки (например, Authorization: Bearer {token}) или настройки Authentication в нодах HTTP Request.
- Используйте функцию Execute Node для пошагового запуска workflow с конкретной ноды.
- Внимательно изучайте входные и выходные данные каждой ноды во встроенном редакторе.
- Для проверки селекторов используйте ноду Code с console.log, чтобы вывести полученный HTML фрагмент, или временно сохраняйте сырой HTML в файл.
- Включайте ноду Debug для подробного логирования.
- Используйте ноду SplitInBatches для обработки больших списков порциями (например, по 50 элементов).
- Настройте паузы между пакетами.
- Сохраняйте промежуточные результаты в базу данных или файл, чтобы не потерять данные при сбое.
- Рассмотрите возможность запуска n8n на более производительном сервере для ресурсоемких задач.
Детальный разбор ключевых нод для парсинга
HTTP Request Node
Эта нода является точкой входа для получения HTML-контента. Необходимо настроить следующие параметры:
HTML Extract Node
Это основная нода для извлечения данных. Она работает на основе CSS-селекторов.
| Параметр | Описание | Пример значения |
|---|---|---|
| Source Data | Поле, содержащее HTML-код. Обычно это выходные данные ноды HTTP Request. | {{ $json.body }} |
| Extraction Values | Список правил для извлечения. Каждое правило имеет ключ и селектор. | Массив объектов |
| Key | Имя поля, под которым данные будут сохранены в выходном JSON. | product_title |
| CSS Selector | CSS-селектор для нахождения элемента. | .product-card h2 |
| Return Value | Определяет, что извлекать: текст, атрибут, HTML. | Text (по умолчанию), Attribute (href, src), HTML |
| Return Array | Если селектор находит несколько элементов, эта опция возвращает все значения в виде массива. | Включено для списков |
Пример настройки Extraction Values для карточки товара:
HTML Node
Эта нода предоставляет более низкоуровневые операции с HTML, включая поддержку XPath. Она полезна для сложных случаев, когда CSS-селекторов недостаточно.
Обработка пагинации и навигации по страницам
Для сбора данных с нескольких страниц (каталога товаров, списка статей) необходимо реализовать цикл. Стандартный подход:
Обработка динамического контента (JavaScript)
Многие современные сайты загружают контент динамически с помощью JavaScript. Стандартная нода HTTP Request получит только исходный HTML без исполнения JS. Для парсинга таких сайтов в n8n есть несколько стратегий:
Очистка и преобразование данных
Сырые данные, извлеченные с сайта, часто требуют обработки. Для этого используются следующие ноды:
| Нода | Назначение | Пример использования |
|---|---|---|
| Set | Создание, модификация и удаление полей в JSON-объекте. | Преобразование строки «1 299 руб.» в число 1299. |
| Item Lists | Агрегация, сортировка, ограничение количества элементов. | Выбор топ-10 самых дорогих товаров. |
| Filter | Отсеивание записей по условию. | Оставить только товары, у которых цена ниже 1000. |
| Code (JavaScript/ Python) | Выполнение произвольной логики для сложных преобразований. | Регулярные выражения для извлечения артикула из текста, нормализация дат. |
Сохранение результатов
После обработки данные необходимо сохранить. n8n поддерживает десятки нод для интеграции:
Обработка ошибок и надежность
При парсинге часто возникают ошибки: изменение структуры сайта, таймауты, капчи. Для повышения надежности рабочего процесса в n8n следует:
Часто задаваемые вопросы (FAQ)
Как избежать блокировки при парсинге в n8n?
Можно ли парсить сайты с бесконечной прокруткой (infinite scroll)?
Да, но стандартные HTTP-запросы не подойдут. Необходимо либо:
Как обрабатывать данные, требующие авторизации?
В чем разница между HTML Extract и HTML нодами?
Нода HTML Extract более проста и ориентирована на быструю настройку извлечения данных по CSS-селекторам. Она возвращает аккуратный JSON. Нода HTML предоставляет больше операций (получение HTML, текста, атрибутов, поддержка XPath) и может работать с каждым найденным элементом по отдельности, что полезно для сложных структур. Для большинства задач парсинга достаточно HTML Extract.
Как дебажить workflow парсера в n8n?
Можно ли запускать парсинг по расписанию?
Да, это одна из ключевых возможностей n8n. Используйте триггерную ноду Schedule Trigger. В ее настройках можно указать cron-выражение (например, «0 8 *» для ежедневного запуска в 8 утра) или простой интервал (каждые 30 минут). Это позволяет создавать регулярно обновляемые датасеты.
Комментарии