這幾天無聊著,打開163郵箱,看到右上角的天氣信息,突然心血來潮,自已也做個天氣信息的小模塊放在Blog上,就是左邊側欄的那個,其實之前都做過,只不過是用Java來解析,Flex來顯示,而已之前的那個是解析www.weathercn.com的信息的,但現在該站的天氣頁面改版了,所以不得不重新做,既然如此,就拿163的來做吧。原理都是一樣,用PHP讀取163的天氣信息網頁,再用正則表達式解析網頁的內容,提取有用的天氣信息,組織好成XML格式,之后Flex用WebService來讀取該PHP,得到XML數據,再相應的顯示。
其實這并不難,打開的我163郵箱,查看它的網頁源碼,經過一番的查找分析,找到它獲取天氣信息的網頁:http://mimg.163.com/tianqi/city/59287.html 呵呵,還是Html的哦,網易的將動態的天氣生成靜態的頁面,我們訪問起來,也不太占服務器資源吧,因為天氣也是經常訪問的。看看源代碼,就幾行Html代碼,正合我的需求,免得我的PHP分析大量的代碼占點資源。不過有點要注意,網易把每個城市的代號生成一個頁面,即是一個城市,一個天氣頁面,上面那個URL是廣州的,就是說 59287 就是廣州的城市代碼,在PHP里訪問時,要跟據用戶選的是哪個城市,相對應的修改那個號碼就行了,如:
$url = "http://mimg.163.com/tianqi/city/".$_GET['city'].".html";
這樣,你訪問PHP時,要傳一個城市代碼參數,至于網易定義的城市代碼,我這里就不列出來了,太多太長了,也找了我不少時間。我放在Flex的源碼里,可以下載我的源碼看看。
以下是PHP頁面的代碼:
1 <?php
2 include("class.Chinese.php"); #導入字符集轉換的類
3 $codeTableDir = "./config/"; #指定字符碼表的路徑
4
5 $url = "http://mimg.163.com/tianqi/city/".$_GET['city'].".html"; #獲取城市代碼,組成完整的URL
6
7 $fh = fopen($url,'r'); #讀取該URL獲取內容
8 while(!feof($fh)){
9 $content .= fread($fh,128); #讀取全部內容
10 }
11 $content = new Chinese("GB2312","UTF8",$content,$codeTableDir); #轉換字符碼,GB轉UTF8
12 $content = $content->ConvertIT(); #轉換
13 eregi('(<span class="wetCityName">)([^/]*)(</span>)',$content,$arr); #找出表示城市的內容
14 $city = $arr[2];
15
16 eregi('(<span class="wetDate">)(.*)(</span></div>)',$content,$arr); #找出表示日期的內容
17 $date = $arr[2];
18
19 $wea = split('txtAlgCen fRig handle',$content); #分開今天與明天
20
21 eregi('(<div class="wetSts">)([^<]*)(</div>)',$wea[0],$arr); #找出表示今日天氣的內容
22 $info1 = $arr[2];
23 eregi('(<div class="wetSts">)([^<]*)(</div>)',$wea[1],$arr); #找出表示明日天氣的內容 下同
24 $info2 = $arr[2];
25
26 eregi('(</b>)([^<]*)(</div>)',$wea[0],$arr);
27 $temp1 = $arr[2];
28 eregi('(</b>)([^<]*)(</div>)',$wea[1],$arr);
29 $temp2 = $arr[2];
30
31 eregi('(class="wetDico )(.*)("></div>)',$wea[0],$arr);
32 $pic1 = $arr[2];
33 eregi('(class="wetDico )(.*)("></div>)',$wea[1],$arr);
34 $pic2 = $arr[2];
35
36 echo "<?xml version=\"1.0\" encoding=\"utf-8\" ?>";
37 echo "\n";
38 ?>
39 <weather>
40 <city><?= $city ?></city>
41 <date><?= $date ?></date>
42 <today>
43 <wea><?= $info1 ?></wea>
44 <temp><?= $temp1 ?></temp>
45 <pic><?= $pic1 ?></pic>
46 </today>
47 <tomorrow>
48 <wea><?= $info2 ?></wea>
49 <temp><?= $temp2 ?></temp>
50 <pic><?= $pic2 ?></pic>
51 </tomorrow>
52 </weather>
以上有幾點要注意:
1。由于網易里的網頁是用GB2312編碼的,而Flex里接收的XML要UTF-8編碼才會正確讀出,所以要將獲取的網易里的數據進行轉碼,這問題剛開始時,老是亂碼,搞到心煩,后來發現網易的Html的頭信息里 發現是GB2312的編碼,郁悶了半天,之后上網找了個中文轉碼的類,下載來直接套用。
2。獲取回來的天氣信息的Html是分今天與明天的天氣信息,而里面的格式也是一樣的,所以,用正則查找時,只找到最先的那個,所以要先找個今天與明天的分界點,將其分離開來再各自解析里面的內容,得出今天的天氣與明天的天氣。
3。寫輸出XML時,格式要正確,不然Flex里讀取會有麻煩,還有,encoding一定要是UTF-8,還要將該PHP文件保存成UTF-8格式,我用DW寫該PHP時,因為我的DW新建文件時,默認是ISO8859-1的,所以要將其文檔編碼格式改為UTF-8來保存。
PHP完工之后,來到Flex這邊,畫好界面,添加代碼如下:
先加一個HttpService標簽 :
<mx:HTTPService id="hs" showBusyCursor="true" method="GET" result="{hsResult(event);}" fault="{hsFault(event);}" />
(事件響應方法我就不在這里貼出來了,可下載源碼看)
當下拉選框選中城市之后,判斷用戶選中的是哪個城市,再對照該城市的代號,組合成URL
hs.url = "http://www.jiangzone.com.cn/jiang/weather/weather.php?city=" + cityvalues[i];
hs.send();
結果返回時,再相應的賦值:
lblCity.text = event.result.weather.city;
lblDate.text = event.result.weather.date;
lblWea.text = event.result.weather.today.wea;
weather對應XML里的<weather>根標簽,city對應XML里的<city>標簽。
OK,修改一下,大功告成!
以下是源碼:
[down=attachments/month_0709/t2007916122822.rar]點擊下載此文件[/down]
posted on 2008-07-29 14:07
姜大叔 閱讀(1221)
評論(1) 編輯 收藏 所屬分類:
Flash/Flex