Парсинг данных матчей Counter-Strike: Global Offensive с HLTV с использованием Node.js
Table Of Content
Итак, вы хотите получить доступ к данным матчей Counter-Strike: Global Offensive.
Это может быть просто информация о расписании матчей, например, когда команда A играет против команды B, или данные о текущем счете.
Или, возможно, вам нужны более подробные сведения, например, сколько раундов в этом матче выиграли контр-террористы, обезвредив бомбу.
В этой статье я покажу вам, как легко получить данные о матчах CS:GO с помощью HLTV, используя Node.js!
Установка
Я буду использовать Node.js версии 15.11.0 и npm версии 8.5.2. Вы можете использовать более новую версию, скорее всего, она будет работать нормально.
Давайте создадим папку для нашего проекта и назовем ее hltv_scraper
:
C:\Users\anton
λ mkdir hltv_scraper
Для парсинга фактического веб-сайта мы будем использовать пакет npm HLTV.
Для установки просто перейдите в папку hltv_scraper
(таким образом, вы будете в корневой папке нашего проекта) и выполните команду:
npm install hltv
Вывод будет примерно следующим:
C:\Users\anton
λ cd hltv_scraper\C:\Users\anton\hltv_scraper
λ npm install hltv
npm does not support Node.js v15.11.0
You should probably upgrade to a newer version of node as we
can't make any promises that npm will work with this version.
You can find the latest version at [https://nodejs.org/](https://nodejs.org/)
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See [https://v8.dev/blog/math-random](https://v8.dev/blog/math-random) for details.
npm WARN deprecated request@2.88.2: request has been deprecated, see [https://github.com/request/request/issues/3142](https://github.com/request/request/issues/3142)added 88 packages, and audited 89 packages in 5s13 packages are looking for funding
run `npm fund` for detailsfound 0 vulnerabilities
Теперь у нас должны быть файлы package-lock.json
, package.json
и папка node_modules
в нашей папке проекта.
Наш package.json
должен выглядеть примерно так:
C:\Users\anton\hltv_scraper
λ cat package.json
{
"dependencies": {
"hltv": "^3.4.1"
}
}
Наконец, нам нужно создать файл index.js
. Вот здесь будет находиться вся наша логика парсинга.
Отлично! Вот и все. Теперь мы можем приступить к парсингу!
Получение предстоящих матчей
Прежде всего, нам нужно импортировать библиотеку hltv
.
Для этого достаточно выполнить следующую команду:
const { HLTV } = require(“hltv”);
Эта библиотека отлично справляется с обходом Cloudflare и предоставляет множество методов для получения нужных данных. Например, мы можем использовать метод getMatches()
для получения информации о всех матчах с https://www.hltv.org/matches.
Мы можем сделать это с помощью метода Promise.prototype.then()
следующим образом:
HLTV.getMatches().then(async (returnedMatches) => {});
В переменной returnedMatches
содержатся данные, которые мы получили с HLTV. Давайте посмотрим, в каком формате они возвращаются.
Просто отредактируйте предыдущий код следующим образом:
HLTV.getMatches().then(async (returnedMatches) => {
console.log("Match: ", returnedMatches[Object.keys(returnedMatches)[0]]);
});
Чтобы запустить нашу программу, просто выполните команду node index.js
из корневой папки нашего проекта:
C:\Users\anton\hltv_scraper
λ node index.js
Match: {
id: 2357453,
date: 1658656800000,
stars: 1,
title: undefined,
team1: { name: 'Wings Up', id: 10851 },
team2: { name: 'IHC', id: 11585 },
format: 'bo3',
event: { id: 6669, name: 'Perfect World Arena Premier League Season 2' },
live: false
}
Тада! Здесь у нас есть предстоящий матч по CS:GO, который мы получили с помощью нашего приложения на Node.js.
Давайте немного улучшим его форматирование. Выведем матчи в следующем формате:
“Название события (BO3): Команда 1 против Команды 2 (Дата)”
Продолжаем писать код!
Было бы удобно просто применить функцию map
к returnedMatches
, форматируя каждый возвращаемый объект матча.
HLTV.getMatches().then(async (returnedMatches) => {
let formattedMatches = returnedMatches.map(rawMatch => formatMatch(rawMatch));
console.log("Formatted matches: ", formattedMatches);
});
Как вы могли заметить, здесь мы используем функцию formatMatch
, которую еще не создали. Давайте исправим это.
Здесь мы используем шаблонные строки () для создания нашей строки. Мы можем получить все необходимые данные из объекта
match`, который получаем в качестве аргумента.
Это довольно неприятно выглядящая функция, и если мы вернемся к ней через некоторое время, нам может потребоваться посетить окулиста. Давайте сделаем ее немного более читаемой:
Ах, намного лучше! Небольшой урок о читаемости кода для вас :)
На данный момент наш ````������ должен выглядеть примерно так:
Давайте попробуем запустить его:
C:\Users\anton\hltv_scraper
λ node index.js
C:\Users\anton\hltv_scraper\index.js:4
let eventName = match["event"]["name"];
^TypeError: Cannot read property 'name' of undefined
at formatMatch (C:\Users\anton\hltv_scraper\index.js:4:35)
at C:\Users\anton\hltv_scraper\index.js:15:60
at Array.map (`<anonymous>`)
at C:\Users\anton\hltv_scraper\index.js:15:44
at processTicksAndRejections (node:internal/process/task_queues:94:5)
О нет! Кто бы мог подумать!
Похоже, что иногда некоторые части данных, которые мы ожидаем, отсутствуют в ответе. Это довольно стандартно для любого парсера, и более опытные из вас могли ожидать такого исхода.
Давайте обработаем случаи, когда названия событий и команд отсутствуют, так как это наиболее вероятные кандидаты на undefined
.
Здесь у нас действительно есть 2 варианта работы с некорректными данными: отбросить матч полностью или предоставить значение по умолчанию. Я выберу последнее, но вы можете сделать, что хотите. Свободная страна и все дела.
Если мы сейчас запустим наш код:
C:\Users\anton\hltv_scraper
λ node index.js
Formatted matches: [
'Perfect World Arena Premier League Season 2 (BO3): Wings Up против IHC (2022-07-24T10:00:00.000Z)',
'Perfect World Arena Premier League Season 2 (BO3): Lynn Vision против победителя IHC/Wings Up (2022-07-24T13:00:00.000Z)',
'ESEA Summer 2022 Cash Cup 3 Europe (BO3): Cossacks против kolibri (2022-07-24T14:00:00.000Z)',
'ESEA Summer 2022 Cash Cup 3 Europe (BO3): PALOMA против Spirit Academy (2022-07-24T14:00:00.000Z)',
'ESL Impact Summer 2022 Cash Cup 3 Europe (BO3): Clown5 против SUL (2022-07-24T14:00:00.000Z)',
'Liga Gamers Club 2022 Serie A July Cup (BO3): B4 против Meta BR (2022-07-24T19:00:00.000Z)',
'ESEA Summer 2022 Cash Cup 3 South America (BO3): Corinthians Academy против RDP (2022-07-24T19:00:00.000Z)',
... 9 more items
]
Успех! Вот таким образом мы можем получить данные о матчах по CS:GO. Затем, конечно же, вы можете выбрать, хранить эти данные в базе данных или делать с ними что угодно.
В качестве бонуса я покажу вам, как получить только матчи, которые сейчас идут.
Для этого мы можем использовать функцию filter
на полученных матчах следующим образом:
Запустив его, я получаю:
C:\Users\anton\hltv_scraper
λ node index.js
Live matches: [
{
id: 2357454,
date: undefined,
stars: 1,
title: undefined,
team1: { name: 'Lynn Vision', id: 8840 },
team2: { name: 'IHC', id: 11585 },
format: 'bo3',
event: { id: 6669, name: 'Perfect World Arena Premier League Season 2' },
live: true
}
]
И вот таким образом мы можем получить информацию о матчах по CS:GO, которые сейчас идут.
Если вам понравилась эта статья и вы хотите поддержать меня как автора, подпишитесь на меня на Medium.
Таким образом, вы будете получать уведомления о каждой новой статье, которую я опубликую.
Вы также можете Подписаться на мой Новостной Бюллетень, чтобы получать эти уведомления прямо в свою почту.