
Введение:
Очистка веб-страниц – это метод, используемый для извлечения данных или информации с веб-сайтов. Это простой способ получить большой объем данных с веб-сайтов. Большинство данных организовано не в структурированном формате, а в формате HTML, поэтому вам необходимо преобразовать их в структурированные данные, чтобы их можно было используется в нескольких приложениях.
Если вы хотите получить данные с любого веб-сайта, вам просто нужно использовать любой веб-инструмент очистки и некоторую обработку страницы после этого, вам нужно сохранить эти данные в своем приложении. . вы можете использовать node.js для создания мощного веб-парсера, чрезвычайно универсального и совершенно бесплатного.
Мы удалим данные с веб-сайта espncricinfo.com. На этом веб-сайте есть различные турниры по крикету. Мы собираемся отменить матч IPL. Мы извлекаем различную статистику из определенного матча.
Инструменты для просмотра веб-страниц в node.js:
- Черио
- Кукольник
- Драматург
- джсдом
Вы можете использовать любой инструмент для веб-скрейпинга. Для парсинга мы будем использовать модуль Cheerio npm.
Первоначальная настройка:
Прежде чем начать, убедитесь, что в вашей системе установлены node.js и npm или yarn. Посетите nodejs.org, чтобы загрузить последнюю версию Node, если в вашей системе нет >node.js.
Установите зависимости:
У нас есть три зависимости, которые нужно установить для веб-скрейпинга.
- express: это известная и гибкая платформа Node.js для разработки веб-приложений. Он предлагает надежные функции для создания веб-приложений и мобильных приложений.
- запрос:модуль запроса используется для выполнения HTTP-вызовов. Это самый простой способ выполнения HTTP-вызовов в node. js, используя этот модуль запроса.
- cheerio. Cheerio — это эффективная библиотека, позволяющая использовать богатый и мощный API jQuery на стороне сервера. Он использует ядро jQuery. Вы можете узнать больше, посетив модуль npm cheerio.
Запустите эту команду, чтобы установить все зависимости, упомянутые выше.
npm install express request cheerio
Мы рассмотрим ниже упомянутые пункты:
- Сбор требований к данным
- Получение веб-страницы по URL-адресу
- Извлечение данных с веб-страницы
- Храните данные в формате JSON
Сбор необходимых данных:
Прежде чем приступить к парсингу, убедитесь, что вы четко представляете, какие данные вам нужны.
Вот список данных, которые мы хотим получить с веб-страницы.
- Соответствие: номер совпадения
- Место проведения: название крикетного стадиона.
- Дата: дата совпадения
- Команды: названия команд
- Жеребьевка: какая команда выигрывает жеребьевку и ее решение.
- Счет: подробная информация об окончательном счете обеих команд и итоговом результате матча.
- Игрок матча: сведения об имени игрока, счете и команде для лучшего игрока матча.
- Лучший результат: показывает самый высокий результат в матче.
- Лучший результат в боулинге: сведения о игроке, набравшем наибольшее количество калиток.
В этом примере мы должны сохранить все данные в формате JSON и отправить ответ в формате JSON. .
Получение веб-страницы по URL-адресу:
Создайте matchStats.js в корневом каталоге вашего приложения и добавьте приведенный ниже фрагмент кода.
matchStats.js
const request = require(‘request’);
const cheerio = require(‘cheerio’);
const url = ‘https://www.espncricinfo.com/series/ipl-2021-1249214/royal-challengers-bangalore-vs-punjab-kings-48th-match-1254090/full-scorecard';
const matchStats = async (req, response) => {
// Get HTML of request
request(url, async (err, res, html) => {
if (err) {
console.log(err);
} else {
const data = await extractHtml(html);
return response.status(200).json(data)
}
})
Прежде всего, вам необходимо импортировать модуль request для вызовов HTTP и cheerio для парсинга веб-страниц. Создайте переменную url для посещения определенного матча. Внутри функции matchStats() создайте функцию request() и извлеките HTML веб-страницы. Он принимает три аргумента: err, res и html. мы должны использовать html и передать в функцию extractHtml().
Извлечение данных с веб-страницы:
Прежде чем чистить данные с веб-страницы, очень важно понять структуру HTML страницы.
Вы должны добавить приведенный ниже фрагмент кода рядом с функцией request().
const extractHtml = async (html) => {
// load HTMl into cheerio module
let $ = cheerio.load(html);
// Get the particular details from class attribute
let venue = $(".match-venue").text();
let match = $(".header-info .description").text().split(' ').slice(0, 2).join(' ');
let teamNames = $(".match-info.match-info-MATCH .team .name-detail");
let teamScores = $(".match-info.match-info-MATCH .team .score-detail .score");
let matchDetails = $(".card.content-block.match-scorecard-table>.table-responsive").find('tr');
let playerOfMatch = $(".playerofthematch-player-detail").text().split(', ');
let playerOfMatchScore = $(".playerofthematch-score-text").text();
let matchResult = $(".match-info.match-info-MATCH .status-text").text();
let innings = $(".card.content-block.match-scorecard-table>.Collapsible");
Внутри функции extractHtml() мы должны загрузить html с помощью load() в модуль cheerio и >сохранить каждый элемент в переменной.
Извлеките место проведения:
Извлеките место проведения матча, которое нам нужно, просто щелкнув правой кнопкой мыши рядом с местом проведения матча (вы можете найти его в таблице сведений о матче) в браузере и нажмите при проверке.

Вы можете найти класс match-venue (как показано на рисунке выше) и выполнить поиск для уникального результата. Это всего лишь один результат, поэтому вы можете используйте этот класс и метод text(), используемый для извлечения текста из элемента.
Извлеките номер совпадения:
Чтобы извлечь номер совпадения, мы должны проверить элемент непосредственно перед тем, как мы это сделали, и мы нашли .header-info .descriptionдва класса для достижения совпадения Детали. Но нам нужен только номер совпадения, поэтому мы должны разделить текст, сохранить первые два элемента массива и присоединить к одной строке, а значение сохранить в переменной match.
Извлеките названия команд:
Проверьте веб-страницу рядом с названием команды, потому что нам нужны названия команд.

Нам нужно найти уникальный класс или атрибут, чтобы узнать названия команд. . Посмотрите на картинку выше: мы нашли .match-info.match-info-MATCH .team .name-detail три класса для достижения названия команды для обеих команд. На картинке вы можете увидеть только два результата поиска с обоими названиями команд. Оба этих элемента мы сохраняем в переменной teamNames.
let teamNameArr = [];
// Get team names
teamNames.each((i, name) => {
teamNameArr.push($(name).text());
})
Создайте массив teamNameArr для хранения имен команд и получите каждый элемент из teamNames. После этого извлеките текст из элемента и вставьте его в teamNameArr.
Извлеките счет команды:
Проверьте оценку так же, как мы делали это раньше для названий команд, и найдите класс уникальный для обеихкомандных оценок. Мы нашел .match-info.match-info-MATCH .team .score-detail .scoreэтот класс для счетов команд и сохранил в >teamScoresпеременная.
let teamScoreArr = [];
// Get Team Score
teamScores.each((i, score) => {
teamScoreArr.push($(score).text());
})
Создайте массив teamScoreArr для хранения командных очков и получите каждый элемент из teamScores. После этого извлеките текст из элемента и вставьте его в teamScoreArr.
Извлечение сведений о совпадении:
Чтобы извлечь детали матча для даты матча и получить жеребьевку. Изучив таблицу детали соответствия, мы нашли классы .card.content-block.match-scorecard-table›.table-responsive для получения таблицы и использования find ()метод получения всех tr.
// Get Match Date const dateRow = $(matchDetails[6]).find(‘td’); const date = $(dateRow[1]).text().split(‘(‘)[0].trim();
Чтобы получить дату совпадения, мы должны использовать matchDetails и получить строку даты после этого найти конкретную ячейку. > и извлеките текст и разделите из '(', чтобы получить точную дату совпадения и используйте trim(), чтобы удалить лишние пробелы.
// Get Toss
const tossRow = $(matchDetails[1]).find('td');
const toss = $(tossRow[1]).text().split('-')[0].trim();
Чтобы получить жеребьевку точно мы сделали для даты.
ПРИМЕЧАНИЕ. Тот же процесс мы должны использовать для извлечения playerOfMatch, playerOfMatchScore, matchResult и иннингов. .
Узнайте имена и результаты команд:
// Get both Team Names and Scores const [team1Name, team2Name] = teamNameArr; const [team1Score, team2Score] = teamScoreArr;
Чтобы получить названия команд имена и очки, мы просто деструктурируем teamNameArr и массив teamScoreArr.
Получите лучший результат:
// Get the Best Batting Score let hrBatsmanName = ''; let hrBatsmanRuns = 0; let hrBatsmanBalls = 0; let hrBatsmanFours = 0; let hrBatsmanSixes = 0; let hrBatsmanSr = 0;
Чтобы сохранить сведения о лучшем счете ватина, мы должны определить переменную в ее начальном значении.
// Looping into both innings
innings.each((i, inning) => {
// Find batman table and get all the rows from batsman table
let allBatsman = $(inning).find('.table.batsman tbody tr');
// Looping into all the batsman rows
allBatsman.each((i, batsman) => {
// Find all the columns from particular batsman row
let batsmanDetails = $(batsman).find('td');
let batsmanName = $(batsmanDetails[0]).text().trim().replace(/[^a-zA-Z ]/g, "");
let batsmanRuns = $(batsmanDetails[2]).text();
let batsmanBalls = $(batsmanDetails[3]).text();
let batsmanFours = $(batsmanDetails[5]).text();
let batsmanSixes = $(batsmanDetails[6]).text();
let batsmanSr = $(batsmanDetails[7]).text();
// check highest batsman run and assign details
if (batsmanRuns > hrBatsmanRuns) {
hrBatsmanName = batsmanName;
hrBatsmanRuns = parseInt(batsmanRuns);
hrBatsmanBalls = parseInt(batsmanBalls);
hrBatsmanFours = parseInt(batsmanFours);
hrBatsmanSixes = parseInt(batsmanSixes);
hrBatsmanSr = parseFloat(batsmanSr);
}
})
})
Чтобы найти лучший результат ватина, мы просто перебираем оба иннинга и находим каждый ряд игроков с битой. После этого мы должны зациклиться на allBatsman и найти информацию о конкретном batsman. Чтобы получить сведения о конкретном игроке с битой, извлеките текст из batsmanDetails и сохраните его в новом >переменная. После этого мы должны проверить самый высокий пробег бэтсмена и заменить его значение до последнего бэтсмен.
Получите лучший результат в боулинге:
// Get the Best Bowling Score let hwBowlerName = ''; let hwBowlerOvers = 0; let hwBowlerRuns = 0; let hwBowlerWickets = 0; let hwBowlerEcon = 0;
Чтобы сохранить сведения о лучшем счете в боулинге, мы должны определить переменную в ее начальное значение.
// assignerHelper function
const assignerHelper = async (bowlerName, bowlerOvers, bowlerRuns, bowlerWickets, bowlerEcon) => {
hwBowlerName = bowlerName;
hwBowlerOvers = bowlerOvers;
hwBowlerRuns = bowlerRuns;
hwBowlerWickets = bowlerWickets;
hwBowlerEcon = bowlerEcon;
}
Прежде чем перейти к процессу, мы просто создадим функцию assignerHelper(). Он используется для назначения сведений о боулерах. Мы не хотим писать один и тот же код несколько раз, как правило, это не очень хорошая практика.
// Looping into both innings
innings.each((i, inning) => {
// Find batman table and get all the rows from batsman table
let allBowler = $(inning).find('.table.bowler tr');
// Looping into all the bowler rows
allBowler.each(async (i, bowler) => {
// Find all the columns from particular bowler row
let bowlerDetails = $(bowler).find('td');
let bowlerName = $(bowlerDetails[0]).text();
let bowlerOvers = $(bowlerDetails[1]).text();
let bowlerRuns = $(bowlerDetails[3]).text();
let bowlerWickets = $(bowlerDetails[4]).text();
let bowlerEcon = $(bowlerDetails[5]).text();
// Check highest wicket and assign using helper function
if (bowlerWickets > hwBowlerWickets) {
await assignerHelper(bowlerName, bowlerOvers, bowlerRuns, bowlerWickets, bowlerEcon);
} else if (bowlerWickets == hwBowlerWickets) {
// Check lowest economy
if (bowlerEcon < hwBowlerEcon) {
await assignerHelper(bowlerName, bowlerOvers, bowlerRuns, bowlerWickets, bowlerEcon);
}
}
})
})
Чтобы найти лучший счет в боулинге, мы просто перебираем оба иннинга и находим каждую строку боулера. После этого мы должны зациклиться на allBowler и найти информацию о конкретном bowler. Чтобы получить сведения о конкретном боулере, извлеките текст из bowlerDetails и сохраните его в новой переменной. После этого мы проверяем самую высокую калитку котелка и заменяем его значение до последнего котелка а также мы должны проверить, является ли калитка одинаковой для нескольких боулеров, мы должны проверить ее экономичность тоже. Так мы можем найти лучший счет в боулинге.
Сохраните данные в формате JSON:
После завершения всех процессов мы должны отправить ответ в формате JSON. Итак, мы хотим хранить все данные в формате JSON.
const data = {
match,
venue,
date,
teams: teamNameArr,
toss,
score: {
team1: {
name: team1Name,
score: team1Score
},
team2: {
name: team2Name,
score: team2Score
},
result: matchResult
},
playerOfMatch: {
team: playerOfMatch[1],
name: playerOfMatch[0],
score: playerOfMatchScore
},
bestBattingScore: {
name: hrBatsmanName,
runs: hrBatsmanRuns.toString(),
balls: hrBatsmanBalls.toString(),
fours: hrBatsmanFours.toString(),
sixes: hrBatsmanSixes.toString(),
sr: hrBatsmanSr.toString()
},
bestBowlingScore: {
name: hwBowlerName,
overs: hwBowlerOvers,
runs: hwBowlerRuns,
wickets: hwBowlerWickets,
economy: hwBowlerEcon,
}
}
return data;
} // extractHtml function closing bracket
} // matchStats function closing bracket
module.exports = matchStats;
Создать экспресс-сервер:
Мы перейдем к настройке приложения HTTP сервер с помощью Express. Создайте файл server.js в корневой папке вашего приложения и добавьте следующий фрагмент кода, чтобы настроить сервер. сильный>.
server.js
const express = require('express');
const matchStats = require('./matchStats');
const app = express();
const port = 3000;
app.get('/match-stats', matchStats);
app.listen(port, () => console.log(`Server is running at ${port}`));
Чтобы показать ответ в формате JSON, просто нажмите на ссылку http://localhost:3000/match-stats.
Вывод:
Спасибо, что прочитали эту статью и добрались до конца. Мы рассмотрели основы веб-скрейпинга с помощью cheerio. Вы можете посетить документацию Cheerio, если хотите заглянуть глубже и полностью понять, как это работает.
Вы можете найти полный код: happy’s GithubRepo
Если у вас есть какие-либо вопросы о коде или парсинге в целом, свяжитесь со мной по адресу: happy’s LinkedIn
Мы встретимся снова с чем-то интересным.
До тех пор,
Удачного программирования...!