最近、私はYahoo!のいくつかのサービスとかなり徹底的に話さなければなりませんでした。 この記事では、そのうちの1つについて説明します。 これは
Yahoo!です 天気約2年前、私はそのようなデータの便利でオープンソースをウェブで検索しましたが、何も見つかりませんでした。 国内のすべてのサービスは金銭のためにデータをエクスポートしました(むしろ、それは私を怖がらせる価格ではなく、支払いをいじっていました)が、西洋のサービスは自動処理に便利な形式でデータを提供しなかったか、私が住んでいる都市の存在を知りませんでした
Yahoo! 天気はこれらの欠点の欠如に満足しています。 現在の天気に関する情報と今後5日間の予報は、RSS形式でサーバーからエクスポートされます。 私の意見では、この形式の選択は非常に難しいです。 天気RSSフィードには1つのアイテムのみが含まれます。 同じデータをより簡潔な形式でエクスポートすることもできますが、ヤフーは標準のRSS処理方法に依存しているようです。これはかなり重要な議論でもあります。 標準は依然として標準です。
関心のある都市のRSSフィードアドレスは、
weather.yahoo.comで見つけることができます。
/2008/02/yahoo-weather.png)
一般に、URLは次のとおりです。
xml.weather.yahoo.com/forecastrss?p=_&u=_
最初のパラメーターは、対象の都市の識別子です。 2番目のパラメーターは、温度を表示する単位を決定します。 値「c」は摂氏温度、「f」は華氏温度に対応します。
いくつかの例:
これを自動化する
以下で説明する
YahooWeather
クラス(PHP5)は、HTTP経由でRSSをダウンロードし、データを前処理するように設計されています。
<?php
クラスYahooWeather {
//風
public $ wind_chill;
public $ wind_direction;
public $ wind_speed;
//大気インジケーター
パブリック$湿度;
パブリック$可視性;
公的圧力;
//日の出と日の入りの時刻をUNIXの時刻形式に変換します
パブリック$日の出;
パブリック$サンセット;
//現在の気温と天気
public $ temp;
public $ condition_text;
public $ condition_code;
// 5日間の天気予報
パブリック$予測。
パブリック$ユニット;
関数__construct($コード、$単位= 'c'、$ lang = 'en'){
$ this-> units =($ units == 'c')? 'c': 'f';
$ url = 'http://xml.weather.yahoo.com/forecastrss?p='。
$ code。 '&u ='。$ this-> units;
$ xml_contents = file_get_contents($ url);
if($ xml_contents === false)
新しい例外をスロー(「エラー読み込み」。$ url);
$ xml = new SimpleXMLElement($ xml_contents);
//風
$ tmp = $ xml-> xpath( '/ rss / channel / yweather:wind');
if($ tmp === false)throw new Exception( "Error parsing XML。");
$ tmp = $ tmp [0];
$ this-> wind_chill =(int)$ tmp ['chill'];
$ this-> wind_direction =(int)$ tmp ['direction'];
$ this-> wind_speed =(int)$ tmp ['speed'];
//大気インジケーター
$ tmp = $ xml-> xpath( '/ rss / channel / yweather:atmosphere');
if($ tmp === false)throw new Exception( "Error parsing XML。");
$ tmp = $ tmp [0];
$ this->湿度=(int)$ tmp ['湿度'];
$ this-> visibility =(int)$ tmp ['visibility'];
$ this-> pressure =(int)$ tmp ['pressure'];
//日の出と日の入りの時刻をUNIXの時刻形式に変換します
$ tmp = $ xml-> xpath( '/ rss / channel / yweather:astronomy');
if($ tmp === false)throw new Exception( "Error parsing XML。");
$ tmp = $ tmp [0];
$ this-> sunrise = strtotime($ tmp ['sunrise']);
$ this-> sunset = strtotime($ tmp ['sunset']);
//現在の気温と天気
$ tmp = $ xml-> xpath( '/ rss / channel / item / yweather:condition');
if($ tmp === false)throw new Exception( "Error parsing XML。");
$ tmp = $ tmp [0];
$ this-> temp =(int)$ tmp ['temp'];
$ this-> condition_text = strtolower((string)$ tmp ['text']);
$ this-> condition_code =(int)$ tmp ['code'];
// 5日間の天気予報
$予測=配列();
$ tmp = $ xml-> xpath( '/ rss / channel / item / yweather:予測');
if($ tmp === false)throw new Exception( "Error parsing XML。");
foreach($ tmpを$日として){
$ this->予測[] =配列(
'date' => strtotime((string)$ day ['date'])、
'low' =>(int)$ day ['low']、
'high' =>(int)$ day ['high']、
'text' =>(文字列)$ day ['text']、
'code' =>(int)$ day ['code']
);
}
}
パブリック関数__toString(){
$ u = "°"。(($ this-> units == 'c')? 'C': 'F');
return $ this-> temp。 ' '。$ u。'、 '。$ this-> condition_text;
}
}
?>
使用例:
<?php
{
$ weather =新しいYahooWeather( 'RSXX0091');
} catch(例外$ e){
echo "キャッチされた例外:" $ e-> getMessage();
exit();
}
echo '<h1>'。$ weather。 '</ h1>';
echo "<pre>";
print_r($天気);
echo "</ pre>";
?>
結論:
/2008/02/weather-report.png)
日の出と日の入りの時刻値(それぞれ
sunrise
と
sunset
フィールド)は、Unixの時刻形式に自動的に変換されます。 何らかの理由でYahoo! 明らかに不正確な大気圧値(0)を生成します。 ただし、XMLに対応する属性が存在することから、遅かれ早かれこのデータのエクスポートが修復される可能性が多少あります。
condition_code
フィールドは、天気コードを格納するために使用されます。 現在の値のテキスト解釈は
condition_text
フィールドに保存され、可能なオプションの完全なリストが次の表に示されています。
コード | 説明 |
0 | 竜巻 |
1 | 熱帯嵐 |
2 | ハリケーン |
3 | 激しい雷雨 |
4 | 雷雨 |
5 | 混じった雨と雪 |
6 | 雨とみぞれが混ざった |
7 | 雪とみぞれの混合 |
8 | 凍結霧雨 |
9 | 霧雨 |
10 | にわか雨 |
11 | にわか雨 |
12 | にわか雨 |
13 | にわか雪 |
14 | にわか雪 |
15 | 吹雪 |
16 | 雪 |
17 | あられ |
18 | みぞれ |
19 | ほこり |
20 | 霧深い |
21 | もや |
22 | スモーキー |
23 | 吹き荒れ |
24 | 風が強い |
25 | 寒い |
26 | 曇った |
27 | だいたい曇(夜) |
28 | おおむね曇り(日) |
29日 | 所により曇り(夜) |
30 | 曇り時々晴れ |
31 | 晴れ(夜) |
32 | 晴れ |
33 | フェア(夜) |
34 | フェア(日) |
35 | にわか雨 |
36 | 暑い |
37 | 孤立した雷雨 |
38 | 散在する雷雨 |
39 | 散在する雷雨 |
40 | にわか雨 |
41 | 大雪 |
42 | にわか雪 |
43 | 大雪 |
44 | 部分的に曇り |
45 | 雷雨 |
46 | にわか雨 |
47 | 孤立した雷雨 |
3200 | 利用できません |
この記事は
paradigm.ruブログに掲載されました。
関連リンク