Парсинг веб-страниц с использованием Node.js
Table Of Content
В этой статье рассматривается парсинг данных с различных веб-страниц, также известный как веб-скрапинг. Вместо извлечения данных из API (интерфейса прикладного программирования) мы будем извлекать данные непосредственно с веб-страницы в виде HTML-тегов.
В этой статье будет приведен пример извлечения информации о фондовых инвестициях с веб-сайта https://codequiz.azurewebsites.net/.
Для парсинга данных мы будем использовать два пакета: cheerio и zombie.
Cheerio - это пакет, который позволяет работать с HTML с помощью jQuery.
Zombie - это пакет, который позволяет открывать браузер и выполнять различные действия в браузере.
Прежде чем начать использовать пакеты, необходимо установить их с помощью следующих команд:
npm install zombie --save-dev
npm install cheerio
Далее мы объявляем require для пакетов, которые будем использовать:
const Zombie = require('zombie');
const cheerio = require('cheerio');
Далее приведен пример использования:
const browser = new Zombie();
browser.visit('https://codequiz.azurewebsites.net/', () => {
console.log(browser.html());
});
Из вывода консоли видно, что мы можем получить доступ к веб-странице, но пока не получили нужные данные. Чтобы получить данные, нам нужно нажать кнопку Accept, чтобы получить доступ к данным о фондовых инвестициях. Для этого мы используем метод click() браузера:
browser.click("input[type='button'][value='Accept']");
Затем мы можем вывести HTML-код с помощью console.log(browser.html()). Мы увидим, что данные о фондовых инвестициях теперь доступны в виде HTML:
const $ = cheerio.load(browser.html());
const listItem = $("body > table > tbody > tr");
В переменной listItem у нас будет список всех элементов tr. На веб-сайте есть 5 строк. Затем мы можем использовать цикл each() для обхода каждого элемента и найти все элементы td в каждой строке:
listItem.each((idx, el) => {
const tds = $(el).find("td");
});
Теперь мы можем получить доступ к каждому td по индексу и сохранить данные в виде объекта, а затем добавить его в массив для удобства использования:
const scrapedData = [];
listItem.each((idx, el) => {
const tds = $(el).find("td");
const data = {
name: $(tds[0]).text(),
nav: $(tds[1]).text(),
bid: $(tds[2]).text(),
offer: $(tds[3]).text(),
change: $(tds[4]).text(),
};
scrapedData.push(data);
});
Теперь мы можем использовать полученные данные по своему усмотрению. Дополнительный код доступен на https://github.com/chalermchai-wp/nodejs-scraper.
Если у вас возникнут вопросы, не стесняйтесь задавать их.