Веб-парсинг с использованием Node.js
6 апреля 2022 г.Веб-скрапинг:
Web Scraping — это способ сбора всех видов общедоступных данных, таких как цены, текст, изображения, контактная информация и многое другое из всемирной паутины. Это может быть полезно при попытке собрать данные, сбор и систематизация которых вручную может занять у человека много времени.
Некоторые из наиболее полезных вариантов использования веб-скрейпинга включают:
- Сбор цен на товары с сайтов электронной коммерции, таких как Amazon, eBay или Alibaba.
- Скрапинг постов в социальных сетях, лайков, комментариев, подписчиков или биографий.
- Удаление контактов с таких сайтов, как Yellowpages или Linkedin.
Кукольник
Хотя существует несколько различных библиотек для парсинга веб-страниц с помощью Node.js, в этом руководстве я буду использовать библиотеку puppeteer.
Puppeteer — это популярный и простой в использовании пакет npm, используемый для веб-автоматизации и очистки веб-страниц.
К наиболее полезным функциям Puppeteer относятся:
- Возможность извлечь текстовое содержимое очищенного элемента.
- Возможность взаимодействовать с веб-страницей, заполняя формы, нажимая кнопки или выполняя поиск внутри панели поиска.
- Возможность очищать и загружать изображения из Интернета.
- Возможность видеть, как выполняется парсинг в Интернете, используя безголовый режим.
Вы можете прочитать больше о кукловоде [здесь] (https://github.com/puppeteer/puppeteer)
Установка
Для этого руководства я предполагаю, что у вас уже установлены npm и node_modules, а также файлы package.json и package-lock.json.
Если нет, вот отличное руководство о том, как это сделать: Настройка
Чтобы установить puppeteer, выполните одну из следующих команд в терминале вашего проекта:
нпм я кукловод
Или
пряжа добавить кукольника
Как только puppeteer будет установлен, он появится в виде каталога внутри вашего node_modules.
Создадим простой скрипт веб-скрейпинга на Node.js
Сценарий веб-скрейпинга получит первый синоним слова «умный» из веб-тезауруса следующим образом:
- Получение HTML-содержимого веб-страницы веб-тезауруса.
- Находим элемент, который мы хотим очистить через его селектор.
- Отображение текстового содержимого извлеченного элемента.
Давайте начнем!
Перед очисткой, а затем извлечением текста этого элемента с помощью его селектора в Node.js, нам нужно сначала настроить несколько вещей:
Создайте или откройте пустой файл javascript, вы можете назвать его как хотите, но для этого урока я назову свой «index.js». Затем потребуйте puppeteer в первой строке и создайте асинхронную функцию, внутри которой мы будем писать наш код парсинга веб-страниц:
index.js
```javascript
const puppeteer = требовать('кукловод')
асинхронная функция очистки () {
очистить ()
Затем запустите новый экземпляр браузера и определите переменную «page», которая будет использоваться для навигации по веб-страницам и извлечения элементов из HTML-содержимого веб-страницы:
index.js
```javascript
const puppeteer = требовать('кукловод')
асинхронная функция очистки () {
const browser = await puppeteer.launch({})
константная страница = ожидание browser.newPage()
очистить ()
Скрапинг первого синонима слова «умный»
Чтобы найти и скопировать селектор первого синонима «умный», который мы собираемся использовать для поиска синонима на веб-странице веб-тезауруса, сначала перейдите к [синонимы веб-тезауруса «умный»] (https://www.thesaurus.com/browse/smart), щелкните правой кнопкой мыши первый синоним и выберите «проверить». Это сделает всплывающее окно DOM этой веб-страницы в правой части экрана:
Затем щелкните правой кнопкой мыши выделенный элемент HTML, содержащий первый синоним, и нажмите «селектор копирования»:
Наконец, чтобы перейти к веб-тезаурусу, соскребите и отобразите первый синоним слова «умный» с помощью селектора, который мы скопировали ранее:
- Во-первых, сделайте так, чтобы переменная page переместилась на https://www.thesaurus.com/browse/smart внутри только что созданного экземпляра браузера.
- Затем мы определяем переменную «элемент», заставляя страницу ожидать появления селектора желаемого элемента в DOM веб-страницы.
- Затем текстовое содержимое элемента извлекается с помощью функции Assessment() и отображается внутри переменной text.
- Наконец, мы закрываем экземпляр браузера.
index.js
```javascript
const puppeteer = требовать('кукловод')
асинхронная функция очистки () {
const browser = await puppeteer.launch({})
константная страница = ожидание browser.newPage()
ожидайте page.goto('https://www.thesaurus.com/browse/smart')
var element = await page.waitFor("#meanings > div.css-ixatld.e15rdun50 > ul > li:nth-child(1) > a")
var text = await page.evaluate(element => element.textContent, element)
console.log(текст)
браузер.закрыть()
очистить ()
Время проверить
Теперь, если вы запустите свой скрипт index.js, используя «node index.js», вы увидите, что он отобразил первый синоним слова «умный»:
5 лучших синонимов слова умный
Мы можем реализовать тот же код для очистки 5 лучших синонимов слова smart вместо 1:
index.js
```javascript
const puppeteer = требовать('кукловод')
асинхронная функция очистки () {
const browser = await puppeteer.launch({})
константная страница = ожидание browser.newPage()
ожидайте page.goto('https://www.thesaurus.com/browse/smart')
для (я = 1; я < 6; я ++) {
var element = await page.waitFor("#meanings > div.css-ixatld.e15rdun50 > ul > li:nth-child(" + i + ") > a")
var text = await page.evaluate(element => element.textContent, element)
console.log(текст)
браузер.закрыть()
очистить ()
Переменная "element" будет иметь вид: "#meanings > div.css-ixatld.e15rdun50 > ul > li:nth-child(1) > a" на первой итерации, "# значения > div.css-ixatld.e15rdun50 > ul > li:nth-child(2) > a" на втором, и так далее, пока не будет достигнута последняя итерация, где переменная "element" будет "#meanings > div.css-ixatld.e15rdun50 > ul > li:nth-child(5) > a".
Как видите, единственное, что меняется в переменной «element» на протяжении итераций, — это значение «li:nth-child()».
Это связано с тем, что в нашем случае все элементы, которые мы пытаемся очистить, являются элементами «li» внутри элемента «ul»,
поэтому мы можем легко очистить их по порядку, увеличив значение внутри "li:nth-child()":
- li:nth-child(1) для первого синонима.
- li:nth-child(2) для второго синонима.
- li:nth-child(3) для третьего синонима.
- li:nth-child(4) для четвертого синонима.
- И li:nth-child(5) для пятого синонима.
Заключительные замечания
В то время как веб-скрапинг имеет много преимуществ, таких как:
- Экономия времени на ручном сборе данных.
- Возможность программно объединять фрагменты данных, извлеченных из Интернета.
- Создание набора данных, который может быть полезен для машинного обучения, визуализации данных или анализа данных.
Также у него есть 2 недостатка:
- Некоторые веб-сайты не позволяют очищать свои данные, например, Craigslist.
- Некоторые люди считают, что это серая зона, поскольку в некоторых случаях использования парсинга веб-страниц практикуется сбор и хранение данных о пользователях или объектах.
Надеюсь, эта статья дала вам некоторое представление о парсинге веб-страниц в Node.js, его практическом применении, плюсах и минусах, а также о том, как извлекать определенные элементы и их текстовое содержимое с веб-страниц с помощью библиотеки puppeteer.
Также опубликовано [Здесь] (https://dev.to/code_jedi/web-scraping-in-nodejs-2lkf)
Оригинал