В старые добрые времена для получения текущей погоды я занимался плохим делом, а именно — парсил страничку своего города на 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)
Я знаю, что никому это не надо, но пусть будет. А я сделал себе вот такую ненужную штуку на десктоп:
А разве погода "Сегодня" и "10 января" не должна была быть одинаковой?
Хотя... Там уже почти "Завтра наступило" :-[
А я раньше cn-овскую страницу погоды парсил. Удивительно, даже сейчас работает... Вау, наконец-то потеплело! -13°C!
И да, за am-pm низачот.
плазмоиды - это для четвертых кед. фтопку, они еще не хороши >_< по поводу am/pm согласен, но поменять это - минутное дело
а на десктоп выводил через те же conky ?
Давно юзал эту штуку для conky. Правда там была уже готовая реализация на непомнюкаком языке.
угу. токо непонятно какому прогнозу доверять.
werehuman, прости, ты не мог бы показать, где я сказал фразу "стабильный софт"? если вот здесь >плазмоиды - это для четвертых кед. фтопку, они еще не хороши >_< , то прошу заметить, что "не хороши" != "нестабильны". в моем личном и никому не навязываемом понимании они уродливы. и я даже не знаю с напильником какого размера к ним подходить. или уже создано много тем? может ты подскажешь, как избавиться от эффекта надутости всего подряд? а для таких, как я есть репа kdemod3-legacy, в которой раздают 3.5.10. тем временем, напоминаю, что топик про погоду, а мы <i>немного</i> отклонились от темы и оффтопим.
Вот такие вот они, пользователи KDE4 с активной позицией: чуть что, сразу ЧО ЧО ОНИ СТАБИЛЬНЫЕ УЖЕ СЛЫШ!
http://storage.thelogin.ru/screenshots/2010-01-13_14:55:12.png :-[
themylogin, THUMBS UP Красота.
хотелось бы добавить. если пользуемся кедами нумбер 4 - достаточно скомпилять или поставить из бинарников плазменный виджет cwp, залезть на freemeteo.com, и забить в cwp идентификатор города, например, "gid=1496747&la=14" - это для новосиба. также, виджет отличается хорошей настраиваемостью, и только одно портит впечатление от него - вздумай я выложить скрин на ЛОР, анонимус сразу заорёт "ещё один кедераст-неофит с двумя часами!!!". :-)
themylogin, только гном и опера всё портят. а так да, ништяк. уютненько
JasonX, это не гном
Полезная статья:)
Статья полезная. Спасибо. Но если почитать документацию, то там написано про параметр unit. Ставим unit=m и у нас идёт выдача данных в метрической системе. Т.е. температура в гр. Целься.
Сервис стал платным? Кей не присылают, старый не работает..
Lizard, не знаю, два года прошло уже, вроде нет.
Кей не присылают, старый не работает.. помогите!
Я просто максимальный некрофил, просто я не нашел твоего поста 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
Razor, ну дык пулл-реквест сделай https://github.com/vas3k/geektool-gismeteo-parser
ReDetection, сделано.
Принято, спасибо :)