Прежде чем мы начнем, вам необходимо соблюдать местные законы и правила и не собирать данные, которые раскрываются без разрешения.
Вот некоторые вещи, которые вам понадобятся для этого руководства:
Cheerio — инструмент для анализа HTML и XML в Node.js. Он очень популярен на GitHub и имеет более 23 тысяч звезд.
Он быстрый, гибкий и простой в использовании. Поскольку он реализует подмножество JQuery, начать работу с Cheerio легко, если вы уже знакомы с JQuery.
Основное различие между Cheerio и веб-браузером заключается в том, что Cheerio не генерирует визуальный рендеринг, не загружает CSS, не загружает внешние ресурсы и не выполняет JavaScript. Он просто анализирует разметку и предоставляет API для управления полученными структурами данных. Это объясняет, почему это еще и очень быстро — документация Cheerio.
Если вы хотите использовать Cheerio для получения веб-страниц, вам нужно сначала использовать такой пакет, как axios или node-fetch, для получения тегов.
В этом примере мы будем сканировать коды ISO 3166-1 альфа-3 для всех стран и других юрисдикций, перечисленных на этой странице Википедии. Он расположен в текущем разделе кода страницы ISO 3166-1 альфа-3.
Вот как выглядит список стран/юрисдикций и соответствующие им коды:
На этом этапе вы создадите каталог для своего проекта, выполнив следующую команду на терминале. Эта команда создаст файл с именем learn-cheerio
. При желании вы можете дать ему другое имя.
mkdir Learn-cheerio
learn-cheerio
После успешного выполнения приведенной выше команды вы сможете увидеть папку с именем «созданная».
На следующем шаге вы откроете только что созданный каталог в своем любимом текстовом редакторе и инициализируете проект.
На этом этапе вы перейдете в каталог проекта и инициализируете проект. Откройте каталог, созданный на предыдущем шаге, в вашем любимом текстовом редакторе и инициализируйте проект, выполнив следующую команду.
npm init -y
Успешный запуск приведенной выше команды создаст файл package.json
в корне каталога проекта.
На следующем шаге вы установите зависимости проекта.
На этом этапе вы установите зависимости проекта, выполнив следующую команду. Это займет несколько минут, поэтому наберитесь терпения.
npm i axioscheerio довольно
Успешное выполнение приведенной выше команды зарегистрирует три зависимости в файле в поле package.json
. dependencies
зависимость — это axios
, вторая — cheerio
, а третья — pretty
.
axios — очень популярный http-клиент, который может работать на узлах и в браузерах. Нам это нужно, потому что Cheerio — это анализатор токенов.
Чтобы Cheerio мог анализировать теги и сканировать нужные вам данные, нам нужны axios
для получения тегов с веб-сайта. При желании вы можете использовать другой HTTP-клиент для получения токена. Это не обязательно должен быть axios
.
Pretty — это пакет npm для украшения разметки, чтобы ее можно было прочитать при печати на терминале.
В следующем разделе вы изучите теги, из которых будут извлекаться данные.
Прежде чем очищать данные с веб-страницы, важно понять ее HTML-структуру.
На этом этапе вы исследуете структуру HTML веб-страницы, с которой вы хотите извлечь данные.
Перейдите на страницу кодов ISO 3166-1 альфа-3 в Википедии. В разделе «Текущие коды» находится список стран и соответствующие им коды. CTRL + SHIFT + I
Вы можете открыть DevTools, нажав комбинацию клавиш на Chrome или щелкнув правой кнопкой мыши и выбрав опцию «Проверить».
Это мой список в Chrome DevTools:
В следующем разделе вы напишете код для сканирования Интернета.
В этом разделе вы напишете код для очистки интересующих нас данных. Сначала запустите следующую команду, которая создаст файл app.js
touch app.js.
Успешное выполнение приведенной выше команды приведет к созданию файла app.js
в корневом каталоге каталога проекта.
Как и любой другой пакет Node, вам необходимо сначала потребовать axios
, cheerio
и axios , прежде чем начинать их использовать. Вы можете сделать это, добавив следующий код в начало файла, который вы только что pretty
. app.js
const axios = require("axios"); const Cheerio = require("Cheerio"); const Pretty = require("pretty");
Прежде чем писать код для очистки данных, нам нужно изучить cheerio
. Мы проанализируем разметку ниже и попытаемся манипулировать полученной структурой данных. Это поможет нам изучить синтаксис Cheerio и его наиболее часто используемые методы.
Разметка ниже — это элемент ul
li
, содержащий наш элемент.
константная разметка = ` <ul class="фрукты"> <li class="fruits__mango"> Манго </li> <li class="fruits__apple"> Яблоко </li> </ul> `;
Добавьте приведенное выше объявление переменной в файл app.js
cheerio
можете загружать теги с помощью cheerio.load
. Этот метод принимает маркер в качестве параметра. Также требуются два дополнительных необязательных параметра. Если вам интересно, вы можете прочитать о них больше в документации.
Ниже мы передаем первый и единственный обязательный параметр и сохраняем возвращаемое значение в переменной $
. Мы используем эту переменную из-за сходства Cheerio с Jquery $
. Если хотите, вы можете использовать разные имена переменных.
Добавьте следующий код в файл app.js
:
const $ = Cheerio.load(markup); console.log(pretty($.html()));
Если вы теперь выполните код в node app.js
, выполнив команду app.js
на терминале, вы сможете увидеть разметку на терминале. Вот что я вижу на терминале:
Cheerio поддерживает большинство распространенных селекторов CSS, таких как селекторы class
, id
и element
. В приведенном ниже коде мы выбираем элемент с классом fruits__mango
, а затем регистрируем выбранный элемент на консоли. Добавьте следующий код в файл app.js
const mango = $(".fruits__mango"); console.log(mango.html()); // Mango
Если вы используете выполнение команды, приведенная выше строка кода запишет текст Mango
на терминал. app.js``node app.js
Вы также можете выбрать элемент и получить определенные атрибуты, такие как class
, id
или все атрибуты и соответствующие им значения.
Добавьте следующий код в файл app.js
:
const apple = $(".fruits__apple"); console.log(apple.attr("class")); //
Код вышеfruit__apple выполнит вход в терминал fruits__apple
. fruits__apple
— класс выбранного элемента.
Cheerio предоставляет метод .each
для перебора нескольких выбранных элементов.
Ниже мы выбираем все элементы и перебираем их, используя метод li
. .each
мы записываем текстовое содержимое каждого элемента списка на терминал.
Добавьте следующий код в файл app.js
const listItems = $("li"); console.log(listItems.length); // 2 listItems.each(function (idx, el) { console.log($(el).text()); }); //Манго //
Приведенный выше код Apple запишет 2
— длину элемента списка. После выполнения кода на терминале отобразится текст Mango
. Apple``app.js
Cheerio предоставляет возможность добавлять или добавлять элементы в разметку.
Метод append
добавит элемент, переданный в качестве параметра, после последнего дочернего элемента выбранного элемента. С другой стороны, prepend
добавит переданный элемент перед первым дочерним элементом выбранного элемента.
Добавьте следующий код в файл app.js
:
const ul = $("ul"); ul.append("<li>Банан</li>"); ul.prepend("<li>Ананас</li>"); console.log(pretty($.html()));
После добавления элементов в разметку вот что я вижу при входе в терминал $.html()
:
Это основы Cheerio, которые помогут вам начать парсинг веб-страниц. Чтобы спарсить данные из Википедии, которые мы описали в начале этой статьи, скопируйте и вставьте следующий код в файл app.js
:
// Загрузка зависимостей нам не нужна. // потому что мы не будем логировать html на терминал const axios = require("аксиос"); const Cheerio = require("Cheerio"); const fs = require("fs"); // URL страницы, которую мы хотим парсить const url = "https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3"; // Асинхронная функция, очищающая данные асинхронная функция ScrapeData() { пытаться { // Получаем HTML страницы, которую хотим очистить const {данные} = ждут axios.get(url); // Загружаем HTML, который мы получили в предыдущей строке const $ = Cheerio.load(данные); // Выбираем все элементы списка в классе простого списка const listItems = $(".plainlist ul li"); // Хранит данные для всех стран константные страны = []; // Используем метод .each для перебора выбранного нами li listItems.each((idx, el) => { // Объект, содержащий данные для каждой страны/юрисдикции const Country = { name: "", iso3: "" }; // Выбираем текстовое содержимое элементов a и span // Сохраняем текстовое содержимое в указанном выше объекте страна.имя = $(эль).дети("а").текст(); Country.iso3 = $(el).children("span").text(); // Заполняем массив стран данными о стране страны.push(страна); }); // Записываем массив стран в консоль console.dir(страны); // Записываем массив стран в файл Country.json fs.writeFile("coutries.json", JSON.stringify(countries, null, 2), (err) => { если (ошибка) { console.error(ошибка); возвращаться; } console.log("Данные в файл успешно записаны"); }); } поймать (ошибиться) { console.error(ошибка); } } //Вызов указанной выше функции ScrapeData();
Прочитав код, вы понимаете, что происходит? Если нет, то сейчас расскажу подробно. Я также прокомментировал каждую строку кода, чтобы вам было легче понять.
В приведенном выше коде нам нужны все зависимости в верхней части файла app.js
, а затем мы объявляем функцию scrapeData
. Внутри функции полученный HTML-код страницы, которую нам нужно очистить, затем загружается в cheerio
с помощью axios
.
Список стран и соответствующие им коды iso3
вложены в элемент div
с классом plainlist
. Элементы li
выбираются, а затем мы перебираем их, используя метод .each
. Данные по каждой стране собираются и сохраняются в массиве.
После запуска приведенного выше кода с помощью команды node app.js
собранные данные записываются в файл countries.json
и распечатываются на терминале. Это часть того, что я вижу на терминале:
Спасибо, что прочитали эту статью! Мы уже рассмотрели использование cheerio
. Если вы хотите углубиться и полностью понять, как это работает, вы можете обратиться к документации Cheerio.