Утром, когда завтракаю, почти ежедневно просматриваю Яндекс.Погоду и у меня переодически возникает чувство дежавю, но только наоборот. Глядишь — одна температура на выходные указана, а на другой день смотришь — уже совем другие показатели температуры обещаны. Потихоньку начинаешь сомневаться в своей памяти (30 лет — это же уже четвёртый десяток начался). Но чтобы окончательно не пасть духом — я решил проверить, насколько прогноз соотносится с реальной температурой.
Голубая линия — это реальная температура. Оранжевая область — это диапазон предсказаний.

Источник картинки.
Немного технических деталей
Первым делом поставил в крон скрипт, который каждый час сохраняет страницу Яндекс.Погоды в виде html файла и оставил его поработать некоторое время.
curl https://yandex.ru/pogoda/novosibirsk > test/`date +%Y-%m-%d-%H-%M`
Следующим шагом написал небольшой php скрипт, поражающий своей простотой и лаконичностью, для парсинга сохраненных файлов и формирования json файлов, которые, в свою очередь, используются для отображения графиков. Пример обработки сохраненного дня:
function parseFile($day) { global $mega, $csv, $realT; $predicts = []; $html = file_get_html(__DIR__ . '/test/' . $day); foreach($html->find('.forecast-brief_cols_10') as $element) { foreach ($element->find('.forecast-brief__item-temp-day') as $s) { $predicts[] = str_replace('−', '-', $s->plaintext); } } $dayDate = date_create_from_format("Y-m-d-H-i", $day); $dayDateString = date_format($dayDate, 'Y-m-d H:i:s'); $dayArr = explode('-', $day); if ($dayArr[3] == 14) { foreach($html->find('.current-weather__thermometer_type_now') as $s) { $realT[] = [ intval(date_format($dayDate, 'U') . '000'), intval(str_replace('−', '-', $s->plaintext)) ]; } } for ($i = 1; $i < count($predicts); $i++) { $nextDay = date('Y-m-d', strtotime('+' . $i . ' day', strtotime($dayDateString))); $nextDayArr = explode('-', $nextDay); $line = [ 'Y' => $dayArr[0], 'm' => $dayArr[1], 'd' => $dayArr[2], 'H' => $dayArr[3], 'i' => $dayArr[4], '_m' => $nextDayArr[1], '_d' => $nextDayArr[2], '_C' => $predicts[$i] ]; $mega[] = $line; $csv .= join(';', array_values($line)) . "\n"; } }
Для внесения ясности
- Прогнозом я считал дневные температуры дня, показанные не на текущий день (на картинке нижний длинный выделенный прямоугольник);
- Реальную температуру я брал из верхнего выделенного прямоугольника в 14:25

Результат вы могли видеть в начале статьи, где реальная температура пытается проползти сквозь диапозон предсказаний, но что ей удаётся не всегда. Посмотреть подробнее и потыкать на разные даты можно здесь.
Примеры графиков предсказаний температуры для конкретного дня:


Вывод
Память моя в порядке, можно не волноваться.
ссылка на оригинал статьи https://geektimes.ru/post/283950/
Добавить комментарий