Парсинг статистики о коронавирусе с карты Яндекс - мировая, по странам, по регионам России.
Данный забираем с https://yandex.ru/web-maps/covid19
Нужные страны и регионы перечисляем в массиве $region
, предварительно убедившись, что по таким субъектам есть данные на карте.
$region = ['Кировская область','Нижегородская область','Москва','Австралия','Украина'];
Код сценария (или метода, кому как нравится).
$region = ['Кировская область','Нижегородская область','Москва','Австралия','Украина'];
$str = file_get_contents('https://yandex.ru/web-maps/covid19');
$covid = [];
$re_json = '/class=\"config-view\">(.+?)</';
$re_rus = '/\"covid-stat-view__item-value\">(.+?)</';
$re_time = '/\"covid-panel-view__subtitle\">(.+?)</';
// Статистика по России
preg_match_all($re_rus, $str, $matches, PREG_SET_ORDER, 0);
$covid['Россия']['cases'] = (int)preg_replace("/[^0-9]/", '', $matches[0][1]);
$covid['Россия']['new_cases'] = (int)preg_replace("/[^0-9]/", '', $matches[1][1]);
$covid['Россия']['cured'] = (int)preg_replace("/[^0-9]/", '', $matches[2][1]);
$covid['Россия']['deaths'] = (int)preg_replace("/[^0-9]/", '', $matches[3][1]);
// Мировая статистика и статистика по регионам России
ini_set('pcre.backtrack_limit', 5000000);
preg_match($re_json, $str, $matches, PREG_OFFSET_CAPTURE, 0);
$data = json_decode($matches[1][0], true);
$covid['Россия']['tests'] = (int)preg_replace("/[^0-9]/", '', $data['covidData']['tests']);
foreach ($data['covidData']['items'] as $item) {
// Мировая статистика
if (!isset($item['ru'])) {
$covid['Мир']['cases'] += $item['cases'];
$covid['Мир']['cured'] += $item['cured'];
$covid['Мир']['deaths'] += $item['deaths'];
}
// Статистика по странам и регионам России
if (in_array($item['name'], $region)) {
$covid[$item['name']]['cases'] += $item['cases'];
$covid[$item['name']]['cured'] += $item['cured'];
$covid[$item['name']]['deaths'] += $item['deaths'];
if (is_array($item['histogram']) && count($item['histogram']) > 2) {
$cnt = count($item['histogram']);
$today = $item['histogram'][$cnt-1]['value'];
$yesterday = $item['histogram'][$cnt-2]['value'];
$covid[$item['name']]['new_cases'] = $today - $yesterday;
}
}
}
preg_match($re_time, $str, $matches, PREG_OFFSET_CAPTURE, 0);
$covid['Updated'] = substr($matches[1][0], 0, strpos($matches[1][0], ' ('));
//var_dump($covid); // для отладки раскомментировать
На выходе имеем массив $covid
, который в дальнейшем используем на свое усмотрение, - раскидываем по свойствам объекта(ов), формируем отчет для телеграм-бота и т.д.
Результат работы.
Пример формирования отчета с последующим его сохранением в свойство объекта.
$report = "<b>️ COVID-2019 ️</b>\n\n";
$report .= "<b>В Кирове:</b>\n";
$report .= "Заражений всего: <b>" . $covid['Кировская область']['cases'] . "</b>\n";
$report .= "Заражений за сутки: <b>" . $covid['Кировская область']['new_cases'] . "</b>\n";
$report .= "Выздоровело: <b>" . $covid['Кировская область']['cured'] . "</b>\n";
$report .= "Смертей: <b>" . $covid['Кировская область']['deaths'] . "</b>\n\n";
$report .= "<b>В Нижнем:</b>\n";
$report .= "Заражений всего: <b>" . $covid['Нижегородская область']['cases'] . "</b>\n";
$report .= "Заражений за сутки: <b>" . $covid['Нижегородская область']['new_cases'] . "</b>\n";
$report .= "Выздоровело: <b>" . $covid['Нижегородская область']['cured'] . "</b>\n";
$report .= "Смертей: <b>" . $covid['Нижегородская область']['deaths'] . "</b>\n\n";
$report .= "<b>В России:</b>\n";
$report .= "Заражений всего: <b>" . $covid['Россия']['cases'] . "</b>\n";
$report .= "Заражений за сутки: <b>" . $covid['Россия']['new_cases'] . "</b>\n";
$report .= "Выздоровело: <b>" . $covid['Россия']['cured'] . "</b>\n";
$report .= "Смертей: <b>" . $covid['Россия']['deaths'] . "</b>\n";
$report .= "Проведено тестов: <b>" . $covid['Россия']['tests'] . "</b>\n\n";
$report .= "<b>В мире:</b>\n";
$report .= "Заражений: <b>" . $covid['Мир']['cases'] . "</b>\n";
$report .= "Выздоровело: <b>" . $covid['Мир']['cured'] . "</b>\n";
$report .= "Смертей: <b>" . $covid['Мир']['deaths'] . "</b>\n\n";
$report .= "По состоянию на: <b>" . $covid['Updated'] . "</b>";
SetGlobal('covid2019', $report);
Результат выполнения команды в телеграм-боте.
Данные обновляются редко, поэтому запускать сценарий чаще 2-3 раз в сутки нет смысла.