Утром, когда завтракаю, почти ежедневно просматриваю Яндекс.Погоду и у меня переодически возникает чувство дежавю, но только наоборот. Глядишь — одна температура на выходные указана, а на другой день смотришь — уже совем другие показатели температуры обещаны. Потихоньку начинаешь сомневаться в своей памяти (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
Результат вы могли видеть в начале статьи, где реальная температура пытается проползти сквозь диапазон предсказаний, но что ей удаётся не всегда. Посмотреть подробнее и потыкать на разные даты можно здесь.
Примеры графиков предсказаний температуры для конкретного дня:
Вывод
Память моя в порядке, можно не волноваться.