Функция для получения погоды с Яндекса



PHP Скрипт информера погоды / парсер погоды с Яндекса (Яндекс.Погода)

weather.php — скрипт парсинга погоды с Яндекс.Погода.

x.tpl — Шаблон, используемый для получение необходимого вида информера погоды.
x — количество выводимых дней. Обработка подразумевает замену конструкций вида "","" соответсвтующими актуальными значениями прогноза:

  1. — дата
  2. — температура + часть дня
  3. — изображение погоды
  4. — давление
  5. — влажность
  6. — направление ветра
  7. — ветер
  8. x — значение в пределах от 1 до 16 (на каждый день по 4 отрезка времени)
  9. y — от 1 до 3

Скрипт необходимо вызывать следующим способом:

city — 5 значный идентификатор города. Надо взять с Яндекс.Погода
c=количесво дней, на которое Вы желаете получить прогноз.
Все данные будут сохранятся в файл вида wth_xxxxx_y.html
Перед использованием рекомендуется изменить следующие переменные: $period=3600; // время обновления
$wherethescript='/img/weather/';
папка с изображениями

Php код скрипта информера погоды:

if (!isset($_GET[‘city’])||!isset($_GET[‘c’])) exit();

$filewithweather=’wth_’.$city.’_’.$c.’.html’;
$period=3600;
$wherethescript=’/img/weather/’;
$tpl=file_get_contents($c.’.tpl’);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, ‘http://weather.yandex.ru/’.$city.’/details/’);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, «Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)»);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$f = mb_convert_encoding(curl_exec($ch),’windows-1251′,’utf-8′);
curl_close($ch);

>
if (file_exists($filewithweather)) include($filewithweather);
?>

Пример для одного дня: "Погода во Владимире " будет заменен на "Погода во владимире +3 .. +8 утро <значок>"

Пример шаблона информера погоды для 3х дней:

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

Источник

Прогноз погоды для сайта через API Яндекса

Виджет или страничка прогноза погоды довольно часто может понадобиться на сайте. Это, например, может быть городской портал или сайт туристической фирмы. Погодные сервисы предлагают установить виджеты, минусы которых очевидны: ограниченные настройки внешнего вида, отсутствие управления через скрипты. Предлагаемые варианты не всегда удается встроить в дизайн сайта. Воспользуемся сервисом Яндекса, предоставляющим прогноз в формате XML.

Итак, начнем сразу с простейшего примера, состоящего из двух файлов: weather.php для описания функции получения погоды и index.php для вывода прогноза с необходимыми нам параметрами. Выглядит это так:

Исходники смотрите в окончании статьи. Ниже я не буду приводить весь код, содержащийся в файлах, только основные моменты.

Файл weather.php описывает функцию get_weather. В качестве обязательного параметра — только идентификатор города, который можно найти здесь:

Находим нужный город поиском и забираем параметр id. Файл погоды содержит прогноз на 10 дней, предусмотрим в скрипте указание количества дней, на которые необходимо получить данные. По умолчанию ставим 10, т.е. парсим по максимуму. Также в качестве дополнительных настроек указываем массивы имен дней недели и времени суток для более удобного вывода информации конечному пользователю.

В итоге получаем функцию get_weather со следующими параметрами:

  • $city — город
  • $col — количество дней, для которых получить погоду
  • $day_of_the_week_array — массив дней недели
  • $time_of_day — массив времени суток

Первый — обязательный, для других по умолчанию устанавливаем привычные «понедельник, вторник…» и «утро, день, вечер…»

Далее с помощью функции simplexml_load_file заполняем переменную $xml, в адрес подставляем идентификатор города, так Яндекс поймет, какой именно прогноз нам показать.

Вывод данных будем осуществлять через переменную $out — многомерный массив, элементы которого — дни, а они, в свою очередь, подмассивы для утренней, дневной, вечерней и ночной сводки, и также инфорацию по дате.

Дату обрабатываем из xml следующим образом:

Разбиваем дату на составляющие (день, месяц, год), получаем затем день недели и заполняем все это в переменную вывода для текущего дня.

После этого открываем массив for от 0 до 3 — так мы получим данные температуры, изображение для погоды в разное время суток (файл Яндекса содержит больше информации, например, скорость ветра, если интересно, посмотрите больше и доработайте по аналогии).

Поясню получение температуры:

Этот кусок кода выполняется после вхождения в массив, т.е. мы получаем информацию по температуре, к примеру, на утро. Здесь есть некоторая особенность. Яндекс может выдавать либо диапазон температур, в этом случае используются элементы temperature_from и temperature_to, либо статичное значение, но через temperature. Именно поэтому мы проверяем на пустоту значение temperature, если там данных не содержится, значит для выбранного времени суток используется диапазон, значение из которых мы присваиваем соответствующим переменным.

Иначе забираем содержимое temperature. Я решил добавлять для него плюс и минус один, образуя тем самым диапазон. В любом случае прогноз таким точным не будет, а для нас важно однообразно выводить информацию.

Добавляем также + для температуры больше нуля.

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

Повторяем эту операцию для нужного количества дней и возвращаем массив $out.

В файле index.php создаем переменную, в которую в результате выполнения функции заносим этот самый массив, и теперь используем его для вывода информации. Используем при этом foreach для прохода по массиву.

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

Используя данный метод, можно создавать удобные сервисы, отображающие погоду в автоматическом режиме. В примере два мы выводим два выпадающих списка — страна и город. Данные подгружаем из файла cities.xml (ссылка на него выше). После выбора города погода подгружается через ajax автоматически.

Заметил для некоторых городов скрипт выдает ошибку — не находит прогноз. Это глюк Яндекса. Т.е город в списке есть, но при попытке получить xml для выбранного id оказывается, что файл не существует. Решение проблемы я вижу только в выводе текстового сообщение вроде «Прогноз погоды для выбранного города в данный момент не доступен».

Из преимуществ также отмечу быстрый ответ сервера Яндекса и его устойчивость. Также он выдерживает большое количество обращений и не дает сбоев. Это здорово. Хотя при многотысячной посещаемости, предполагаю, могут возникнуть проблемы и ошибки.

Выход прост — пишем скрипт по закачке файлов к себе на сервер, ставим на cron и проделываем данную операцию раз в сутки (лучше ночью). Таким образом, получаем несколько тысяч xml-файлов прогнозов для каждого города и по ходу дня обращаемся уже к ним, а не к Яндексу. В этом случае также есть смысл ограничить количество городов парсинга. К примеру, если пишете скрипт для сайта туристического агенства — ограничьтесь городами, с которыми оно работает. Составьте массив необходимых городов и парсите только нужные.

Красивая погода на сайт в стиле Метро.

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

Прогноз погоды для сайта через API Яндекса

Получение xml-файла погоды в цикле

С недавних пор погода начала отдаваться с перебоями и пришлось прикрутить циклы с попытками получения файла. Вот так выглядит код:

Решение найдено было тут, но тоже не всегда срабатывает 🙁

И еще одно решение получения погоды и обработки ошибок

Предлагаю немного улучшить код сценария (на усмотрение автора, конечно).
Ключевые моменты:

Источник

Парсер яндекс погоды на PHP

Парсер яндекс погоды на PHP

Рабочий пример PHP парсера, который получает погоду с Яндекса по ID города. Скрипт сохраняет данные в файле кеша на сайте, и обновляет его раз в час. Так же расскажу как выводить на сайте собственные иконки погоды вместо стандартных от Яндекса.

Шаг 1. Получить id города

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

Ранее узнать id города было несколько проще, он высвечивался в адресной строке при просмотре погоды. Список наиболее часто используемых регионов можно посмотреть здесь

Если нужного региона не нашли в списке, то есть другой вариант. В поиске Яндекс нажмите иконку настроек и измените регион.

Нажмите найти и в адресной строке увидите параметр rstr. Его значение и будет id нужного региона. Так же в параметре lr всегда указан ваш текущий регион, поэтому можно использовать и его.

Функция для получения погоды с Яндекса

Вам необходимо задать $cache_life — время жизни кеша (по умолчанию 3600 сек.). Это время, через которое скрипт будет обновлять данные с Яндекс.Погоды. В $city указать id ранее полученного региона (по умолчанию Москва). И в $cache_file путь к файлу кеша (по умолчанию /log/weather.txt).

Теперь при обращении к функции getWeatherDataXml() можно получить и вывести $weather[‘temp’] — данные температуры , $weather[‘image’] — иконку и $weather[‘weather_type’] — тип погоды.

Собственные иконки погоды

Скрипт указанный выше полностью готов к работе. Но иногда стандартные иконки Яндекса могут не вписаться в дизайн сайта. Поэтому привожу пример с кастомными иконками погоды.

Иконки размещаем в папке /images/weather_ico/ и подменяем ссылку из Яндекса на свою. Так же я использую иконки .svg. И следующей строкой меняем расширение png на svg.

В папке /images/weather_ico/ находятся файлы иконок. Вот список их имен и значений с примером исходной иконки:

bkn_-ra_d.svg — облачно с прояснениями, небольшой дождь (день)
bkn_-ra_n.svg — облачно с прояснениями, небольшой дождь (ночь)
bkn_-sn_d.svg — облачно с прояснениями, небольшой снег (день)
bkn_-sn_n.svg — облачно с прояснениями, небольшой снег (ночь)
bkn_d.svg — переменная облачность (день)
bkn_n.svg — переменная облачность (ночь)
bkn_ra_d.svg — переменная облачность, дождь (день)
bkn_ra_n.svg — переменная облачность, дождь (ночь)
bkn_sn_d.svg — переменная облачность, снег (день)
bkn_sn_n.svg — переменная облачность, снег (ночь)
bl.svg — метель
fg_d.svg — туман
ovc.svg — облачно
ovc_-ra.svg — облачно, временами дождь
ovc_-sn.svg — облачно, временами снег
ovc_ra.svg — облачно, дождь
ovc_sn.svg — облачно, снег
ovc_ts_ra.svg — облачно, дождь, гроза
skc_d.svg — ясно (день)
skc_n.svg — ясно (ночь)

Источник

Виджет или страничка прогноза погоды довольно часто может понадобиться на сайте. Это, например, может быть городской портал или сайт туристической фирмы. Погодные сервисы предлагают установить виджеты, минусы которых очевидны: ограниченные настройки внешнего вида, отсутствие управления через скрипты. Предлагаемые варианты не всегда удается встроить в дизайн сайта. Воспользуемся сервисом Яндекса, предоставляющим прогноз в формате XML.

Для начала хотелось бы отметить необходимость при использовании погоды Яндекса указания ссылки на правообладателя. Я в примерах этого делать не буду, так как статья обучающая. Думаю, Яндекс меня поймет и простит.

Итак, начнем сразу с простейшего примера, состоящего из двух файлов: weather.php для описания функции получения погоды и index.php для вывода прогноза с необходимыми нам параметрами. Выглядит это так:

Исходники смотрите в окончании статьи. Ниже я не буду приводить весь код, содержащийся в файлах, только основные моменты.

Файл weather.php описывает функцию get_weather. В качестве обязательного параметра — только идентификатор города, который можно найти здесь:

Находим нужный город поиском и забираем параметр id. Файл погоды содержит прогноз на 10 дней, предусмотрим в скрипте указание количества дней, на которые необходимо получить данные. По умолчанию ставим 10, т.е. парсим по максимуму. Также в качестве дополнительных настроек указываем массивы имен дней недели и времени суток для более удобного вывода информации конечному пользователю.

В итоге получаем функцию get_weather со следующими параметрами:
$city — город
$col — количество дней, для которых получить погоду
$day_of_the_week_array — массив дней недели
$time_of_day — массив времени суток

Первый — обязательный, для других по умолчанию устанавливаем привычные «понедельник, вторник…» и «утро, день, вечер…»

Далее с помощью функции simplexml_load_file заполняем переменную $xml, в адрес подставляем идентификатор города, так Яндекс поймет, какой именно прогноз нам показать.

Вывод данных будем осуществлять через переменную $out — многомерный массив, элементы которого — дни, а они, в свою очередь, подмассивы для утренней, дневной, вечерней и ночной сводки, и также инфорацию по дате.

Дату обрабатываем из xml следующим образом:

Разбиваем дату на составляющие (день, месяц, год), получаем затем день недели и заполняем все это в переменную вывода для текущего дня.

После этого открываем массив for от 0 до 3 — так мы получим данные температуры, изображение для погоды в разное время суток (файл Яндекса содержит больше информации, например, скорость ветра, если интересно, посмотрите больше и доработайте по аналогии).

Поясню получение температуры:

Этот кусок кода выполняется после вхождения в массив, т.е. мы получаем информацию по температуре, к примеру, на утро. Здесь есть некоторая особенность. Яндекс может выдавать либо диапазон температур, в этом случае используются элементы temperature_from и temperature_to, либо статичное значение, но через temperature. Именно поэтому мы проверяем на пустоту значение temperature, если там данных не содержится, значит для выбранного времени суток используется диапазон, значение из которых мы присваиваем соответствующим переменным.

Иначе забираем содержимое temperature. Я решил добавлять для него плюс и минус один, образуя тем самым диапазон. В любом случае прогноз таким точным не будет, а для нас важно однообразно выводить информацию.

Добавляем также + для температуры больше нуля.

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

Повторяем эту операцию для нужного количества дней и возвращаем массив $out.

В файле index.php создаем переменную, в которую в результате выполнения функции заносим этот самый массив, и теперь используем его для вывода информации. Используем при этом foreach для прохода по массиву.

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

Используя данный метод, можно создавать удобные сервисы, отображающие погоду в автоматическом режиме. В примере два мы выводим два выпадающих списка — страна и город. Данные подгружаем из файла cities.xml (ссылка на него выше). После выбора города погода подгружается через ajax автоматически.

Заметил для некоторых городов скрипт выдает ошибку — не находит прогноз. Это глюк Яндекса. Т.е город в списке есть, но при попытке получить xml для выбранного id оказывается, что файл не существует. Решение проблемы я вижу только в выводе текстового сообщение вроде «Прогноз погоды для выбранного города в данный момент не доступен».

Из преимуществ также отмечу быстрый ответ сервера Яндекса и его устойчивость. Также он выдерживает большое количество обращений и не дает сбоев. Это здорово. Хотя при многотысячной посещаемости, предполагаю, могут возникнуть проблемы и ошибки.

Выход прост — пишем скрипт по закачке файлов к себе на сервер, ставим на cron и проделываем данную операцию раз в сутки (лучше ночью). Таким образом, получаем несколько тысяч xml-файлов прогнозов для каждого города и по ходу дня обращаемся уже к ним, а не к Яндексу. В этом случае также есть смысл ограничить количество городов парсинга. К примеру, если пишете скрипт для сайта туристического агенства — ограничьтесь городами, с которыми оно работает. Составьте массив необходимых городов и парсите только нужные.

Источник

Парсить погоду с яндекса

Вот первый пробный вариант:
<?php
include('simple_html_dom.php'); // подключаем библиотеку

/* структура таблицы которую парсим table | tbody | tr — это первые 3 дня с подробной погодой*/

foreach($html->find('tbody .near tr') as $e)
echo $e->innertext . '<br>';
?>
парсит нормально, но выводится все в неправильной кодировке. как быть?

более осмысленный вариант, который вытягивает только данные:
<?php
include('simple_html_dom.php'); // подключаем библиотеку

Степан Грязнов

Зачем гонять из utf-8 в windows-1251? Отдавайте в браузер utf-8. Заголовок
header("Content-Type: text/html; charset=utf-8");
поможет решить проблемы с кодировкой в браузере.
В базу тоже проще писать utf-8. На любой забугорной хостинг-помойке скрипт заведется без проблем.

Картинки можно руками скачать один раз, вариантов погоды не так и много. Да и в базу адреса картинок писать не надо, можно сразу в скрипте их объявить.
Если не руками, то регyляркой найти все нужные картинки и скачать их в папочку.

ps сразу не заметил, что страницу вы качаете с помощью Simple HTML DOM Parser, не знаю что он там делает с данными, так что мой вариант с utf-8 может и не прокатить

Источник

Это может быть интересно:  Геймплей погода и погодные эффекты