CoderCastrov logo
CoderCastrov
Парсер веб-сайтов

Парсинг данных матчей Counter-Strike: Global Offensive с HLTV с использованием Node.js

Парсинг данных матчей Counter-Strike: Global Offensive с HLTV с использованием Node.js
просмотров
5 мин чтение
#Парсер веб-сайтов

Итак, вы хотите получить доступ к данным матчей 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.

Таким образом, вы будете получать уведомления о каждой новой статье, которую я опубликую.

Вы также можете Подписаться на мой Новостной Бюллетень, чтобы получать эти уведомления прямо в свою почту.