Берем погоду с weather.com
10 января 2010 :: 33 комментария :: 26771 просмотр :: 321 слово

В старые добрые времена для получения текущей погоды я занимался плохим делом, а именно — парсил страничку своего города на gismeteo.ru регекспами. Получалось сложно, не расширяемо, и не хорошо с моей стороны. Хотя тут и гисметео постаралось, надо давать людям нормальное API. Но все равно, ребятки, не делайте так. Парсить веб — это плохо. Но есть weather.com, которое дает нам шикарный XML-поток для любого города мира. Надо бы его получить и разобраться.

1. Регистрируемся на получение ключа на поток. Weather.com заботится о своей безопасности, так что чтобы получать поток, необходимо стать партнером получить License Key. Делается явно для того, чтобы банить провинившихся и отлавливать плохих дяденек, перегружающих их сервера. Регистрация на поток где-то здесь: https://registration.weather.com/ursa/xmloap/step1. После всего этого нам придется дождаться e-mail, в котором вам все расскажут. Вообще-то уже на этом можно было бы закончить, но я продолжу.

2. Получаем свой поток. В письме вам пришлют Partner ID и License Key. Чтобы получить свой поток нужно сформировать URL типа:

http://xoap.weather.com/weather/local/30339?cc=*&dayf=5&link=xoap&prod=xoap&par=[PartnerID]&key=[LicenseKey]

где 30339 — zip-код вашего города. Для США все понятно, для остальных городов можно получить, найдя в поиске свой город и скопировав его из URL типа: http://www.weather.com/outlook/travel/businesstraveler/local/RSXX0077. Для Новосибирска это RSXX0077;
PartnerID, LicenseKey — пришлют в письме.

3. Парсеры. После этого можно открывать его в браузере и получить долгожданный XML. Что дальше делать с ним — понятно. От себя дам реализации на PHP и Python. Ну просто для примера.

PHP

$xml =  simplexml_load_file("<тут URL до вашего XML>");
$result = array();
foreach ($xml->dayf->day as $day) {
    // Не забываем, что там фаренгейты. C = (F — 32) * 5/9
    $result[] = array("temp" => ($day->low - 32)*5/9, "sunr" => $day->sunr, "suns" => $day->suns);
}

Python

#!/usr/bin/python
from lxml import etree
import urllib2
url = urllib2.urlopen("<тут URL до вашего XML>")
tree = etree.fromstring(url.read())

for (num, day) in enumerate(tree.find("dayf").findall("day")):
    temp = (int(day.find("low").text) - 32) * 5/9.0
    print "#%d: %.2f" % (num, temp)

Я знаю, что никому это не надо, но пусть будет. А я сделал себе вот такую ненужную штуку на десктоп:
My Weather

Комментарии ↓
werehuman :: 11 января 2010 в 05:43 из Rickmansworth, GB #
0

А я раньше cn-овскую страницу погоды парсил. Удивительно, даже сейчас работает... Вау, наконец-то потеплело! -13°C!

> А разве погода "Сегодня" и "10 января" не должна была быть одинаковой? В одном месте прогноз погоды, а во втором - данные с термометра.

И да, за am-pm низачот.

> А я сделал себе вот такую ненужную штуку на десктоп: Есть плазмоиды же. ftp://wolfram.sibnsk.net/pub/desktop.png

ReDetection :: 11 января 2010 в 09:40 из Novosibirsk, RU #
0

плазмоиды - это для четвертых кед. фтопку, они еще не хороши >_< по поводу am/pm согласен, но поменять это - минутное дело

а на десктоп выводил через те же conky ?

The Hast Master :: 11 января 2010 в 09:55 из Simferopol, UA #
0

Давно юзал эту штуку для conky. Правда там была уже готовая реализация на непомнюкаком языке.

JasonX :: 11 января 2010 в 12:45 из Novosibirsk, RU #
0

угу. токо непонятно какому прогнозу доверять.

werehuman :: 11 января 2010 в 13:53 из Rickmansworth, GB #
0

> фтопку, они еще не хороши >_< Ты случайно не опенбсд юзаешь?

ReDetection :: 11 января 2010 в 17:03 из Novosibirsk, RU #
0

>Ты случайно не опенбсд юзаешь? арч же

werehuman :: 11 января 2010 в 19:00 из Rickmansworth, GB #
0

> арч же Ты юзаешь арч и говоришь про стабильный софт? /0

ReDetection :: 12 января 2010 в 04:10 из Novosibirsk, RU #
1

werehuman, прости, ты не мог бы показать, где я сказал фразу "стабильный софт"? если вот здесь >плазмоиды - это для четвертых кед. фтопку, они еще не хороши >_< , то прошу заметить, что "не хороши" != "нестабильны". в моем личном и никому не навязываемом понимании они уродливы. и я даже не знаю с напильником какого размера к ним подходить. или уже создано много тем? может ты подскажешь, как избавиться от эффекта надутости всего подряд? а для таких, как я есть репа kdemod3-legacy, в которой раздают 3.5.10. тем временем, напоминаю, что топик про погоду, а мы <i>немного</i> отклонились от темы и оффтопим.

themylogin :: 12 января 2010 в 05:28 #
0

Вот такие вот они, пользователи KDE4 с активной позицией: чуть что, сразу ЧО ЧО ОНИ СТАБИЛЬНЫЕ УЖЕ СЛЫШ!

werehuman :: 12 января 2010 в 16:40 из Rickmansworth, GB #
0

> может ты подскажешь, как избавиться от эффекта надутости всего подряд? Пошариться на kde-look.org > тем временем, напоминаю, что топик про погоду, а мы немного отклонились от темы и оффтопим. Так не интересно. Если я умолкну, то тут появится от силы еще 2-3 комментария. > Вот такие вот они, пользователи KDE4 с активной позицией: чуть что, сразу ЧО ЧО ОНИ СТАБИЛЬНЫЕ УЖЕ СЛЫШ! А чо так громко, ты чего кричишь тут, дерский чтоле?

> Пошариться на kde-look.org Хинт: если хочешь, чтобы было очень компактно, то поставь тему skulpture (или заточи qtcurve должным образом), шрифты pt sans, уменьши панель до 16 пикселей в высоту... А собственно, после этих шагов ты получишь минималистический интерфейс.

themylogin :: 13 января 2010 в 08:56 #
0
vas3k :: 13 января 2010 в 09:44 из UA #
0

themylogin, THUMBS UP Красота.

Cornholio :: 11 февраля 2010 в 12:34 #
0

>Давно юзал эту штуку для conky. Правда там была уже готовая реализация на непомнюкаком языке. conkyforecast?

JasonX :: 15 февраля 2010 в 15:51 из Novosibirsk, RU #
1

хотелось бы добавить. если пользуемся кедами нумбер 4 - достаточно скомпилять или поставить из бинарников плазменный виджет cwp, залезть на freemeteo.com, и забить в cwp идентификатор города, например, "gid=1496747&la=14" - это для новосиба. также, виджет отличается хорошей настраиваемостью, и только одно портит впечатление от него - вздумай я выложить скрин на ЛОР, анонимус сразу заорёт "ещё один кедераст-неофит с двумя часами!!!". :-)

themylogin, только гном и опера всё портят. а так да, ништяк. уютненько

themylogin :: 16 февраля 2010 в 16:36 #
0

JasonX, это не гном

balagur :: 19 августа 2010 в 09:45 из Moscow, RU #
0

Полезная статья:)

Эрли hanev[@]mail.ru :: 25 сентября 2011 в 11:49 из Moscow, RU #
0

Статья полезная. Спасибо. Но если почитать документацию, то там написано про параметр unit. Ставим unit=m и у нас идёт выдача данных в метрической системе. Т.е. температура в гр. Целься.

Lizard :: 22 ноября 2011 в 13:53 из Kazan’, RU #
0

Сервис стал платным? Кей не присылают, старый не работает..

vas3k :: 22 ноября 2011 в 13:54 из Novosibirsk, RU #
0

Lizard, не знаю, два года прошло уже, вроде нет.

aveji :: 28 ноября 2013 в 13:32 из Lentekhi, GE #
0

Кей не присылают, старый не работает.. помогите!

Razor :: 31 мая 2015 в 19:35 из Novosibirsk, RU #
0

Я просто максимальный некрофил, просто я не нашел твоего поста http://vas3k.ru/dev/geektool_gismeteo/ с виджетом погоды для geektools, поэтому напишу здесь:) Сегодня виджет перестал показывать погоду, там сменили url и при парсинге всё ломалось. быстрофикс(54-56 строка): icon = cloudness_elem[0]["style"][24:-1] if icon: urllib.urlretrieve("http://"+icon, os.path.join(os.path.dirname(file), "weather.jpg"))

Ну вот отлично, я ещё и говно:D

ReDetection :: 01 июня 2015 в 06:14 из Novosibirsk, RU #
0

Razor, ну дык пулл-реквест сделай https://github.com/vas3k/geektool-gismeteo-parser

Razor :: 01 июня 2015 в 11:11 из Novosibirsk, RU #
0

ReDetection, сделано.

vas3k :: 02 июня 2015 в 11:25 из Vilnius, LT #
0

Принято, спасибо :)

Комментирование доступно только участникам Клуба

Войти
Еще? Тогда вот