Парсинг сайтов при помощи Node.js: краткое руководство с примерами
71К открытий72К показов
В этой статье мы познакомимся с парсингом сайтов (web scraping), который можно использовать, например, для пополнения базы email-адресов, создания сводки новостных лент, сравнения цен на один продукт среди нескольких коммерческих ресурсов или извлечения данных из поисковых машин.
Мы рассмотрим парсинг через API сайтов — такой подход достаточно прост и не требует парсинга всей страницы. Он может не работать, если владельцами ресурса установлены специальные настройки, но в большинстве случаев является неплохим решением.
Как это работает?
Примерно так: парсер посылает странице get-запрос, получает данные в виде HTML / XML и извлекает их в желаемом формате. Для загрузки файлов через консоль подходит утилита WGET, но можно выбрать и любой другой подходящий инструмент на просторах Сети.
Мы будем использовать написанный для Node.js программный пакет osmosis, включающий селектор css3/xpath и небольшой http-обработчик. Есть и другие фреймворки вроде Webdriver и CasperJS, но в данном случае они нам не понадобятся.
Настраиваем проект
- Устанавливаем Node.js, поставляемый с менеджером пакетов npm.
- Создаём новую папку, например,
webscrap
. - Переходим в неё:
cd webscrap
. - Запускаем из консоли
npm init
для создания файлаpackage.json
. - Запускаем
npm i osmosis --save
, чтобы установить пакет для парсинга. Дополнительных зависимостей, кроме как от обработчика и селектора, у него не будет. - Открываем
package.json
и создаём новый стартовый скрипт для последующего запуска командыnpm start
.
Итоговый package.json
будет выглядеть примерно так:
Создаём файл index.js
, в нём будем делать всю работу.
Парсим информативный заголовок в Google
Это самый базовый пример, с помощью которого мы познакомимся с пакетом и запустим первый Node-скрипт. Помещаем код ниже в файл index.js
и запускаем из консоли команду npm start
. Она выведет заголовок веб-страницы:
Разберём, что делают методы. Первый метод get
получает веб-страницу в сжатом формате. Следующий метод set
выберет элемент заголовка, представленный в виде css3-селектора. Наконец, метод data
с console.log
обеспечивают вывод. Метод set
также принимает строки в качестве аргумента.
Получаем релевантные результаты в Google
Допустим, мы хотим получить результаты по ключевому слову analytics. Делаем следующее:
Вот и всё. Этот код извлечёт все соответствующие ключевые слова с первой страницы результатов поиска, поместит их в массив и запишет в лог в консоли. Логика, стоящая за этим, такова: мы сначала анализируем веб-страницу через инструменты разработчика, проверяем блок, в котором находится слово (в данном случае это div #botstuff
), и сохраняем его в массив через селектор .card-section .brs_col p a
, который найдёт все соответствующие ключевые слова на странице.
Увеличиваем количество страниц при релевантном поиске
Для этого нужно добавить цепочку вызовов (chaining method), вычислив атрибут href
у тега anchor (<a>
). Мы ограничимся пятью страницами, чтобы Google не посчитал нас за бот. Если необходимо выставить время между парсингом соседних страниц, добавляем метод .delay(ms)
после каждого .paginate()
.
Парсим адреса электронной почты с сайта Shopify
В данном случае мы будем собирать email-адреса и названия всех приложений, последовательно перемещаясь с помощью метода .follow
, и потом помечать необходимые селекторы в консоли разработчика:
Код выше можно скомбинировать с методом .paginate
, чтобы собрать полностью весь контент (но при этом нас могут и заблокировать).
Теперь нужно сохранить данные в файле, сделать это можно так (пример модификации кода выше, сохранение в формате json
):
Вот мы и закончили с основами, продолжайте экспериментировать. Но, пожалуйста, не используйте полученные знания во вред другим пользователям Сети.
71К открытий72К показов