隨筆-31  評論-257  文章-0  trackbacks-0
              這幾天無聊著,打開163郵箱,看到右上角的天氣信息,突然心血來潮,自已也做個天氣信息的小模塊放在Blog上,就是左邊側(cè)欄的那個,其實之前都做過,只不過是用Java來解析,F(xiàn)lex來顯示,而已之前的那個是解析www.weathercn.com的信息的,但現(xiàn)在該站的天氣頁面改版了,所以不得不重新做,既然如此,就拿163的來做吧。原理都是一樣,用PHP讀取163的天氣信息網(wǎng)頁,再用正則表達(dá)式解析網(wǎng)頁的內(nèi)容,提取有用的天氣信息,組織好成XML格式,之后Flex用WebService來讀取該PHP,得到XML數(shù)據(jù),再相應(yīng)的顯示。
              其實這并不難,打開的我163郵箱,查看它的網(wǎng)頁源碼,經(jīng)過一番的查找分析,找到它獲取天氣信息的網(wǎng)頁:http://mimg.163.com/tianqi/city/59287.html  呵呵,還是Html的哦,網(wǎng)易的將動態(tài)的天氣生成靜態(tài)的頁面,我們訪問起來,也不太占服務(wù)器資源吧,因為天氣也是經(jīng)常訪問的。看看源代碼,就幾行Html代碼,正合我的需求,免得我的PHP分析大量的代碼占點資源。不過有點要注意,網(wǎng)易把每個城市的代號生成一個頁面,即是一個城市,一個天氣頁面,上面那個URL是廣州的,就是說 59287 就是廣州的城市代碼,在PHP里訪問時,要跟據(jù)用戶選的是哪個城市,相對應(yīng)的修改那個號碼就行了,如:
          $url = "http://mimg.163.com/tianqi/city/".$_GET['city'].".html";
          這樣,你訪問PHP時,要傳一個城市代碼參數(shù),至于網(wǎng)易定義的城市代碼,我這里就不列出來了,太多太長了,也找了我不少時間。我放在Flex的源碼里,可以下載我的源碼看看。
          以下是PHP頁面的代碼:
           1 <?php
           2     include("class.Chinese.php");        #導(dǎo)入字符集轉(zhuǎn)換的類
           3     $codeTableDir = "./config/";        #指定字符碼表的路徑
           4 
           5     $url = "http://mimg.163.com/tianqi/city/".$_GET['city'].".html";        #獲取城市代碼,組成完整的URL
           6    
           7     $fh = fopen($url,'r');                #讀取該URL獲取內(nèi)容
           8     while(!feof($fh)){
           9         $content .= fread($fh,128);        #讀取全部內(nèi)容
          10     }
          11     $content = new Chinese("GB2312","UTF8",$content,$codeTableDir);            #轉(zhuǎn)換字符碼,GB轉(zhuǎn)UTF8
          12     $content = $content->ConvertIT();                                        #轉(zhuǎn)換
          13     eregi('(<span class="wetCityName">)([^/]*)(</span>)',$content,$arr);    #找出表示城市的內(nèi)容
          14     $city = $arr[2];
          15    
          16     eregi('(<span class="wetDate">)(.*)(</span></div>)',$content,$arr);        #找出表示日期的內(nèi)容
          17     $date = $arr[2];
          18    
          19     $wea = split('txtAlgCen fRig handle',$content);                            #分開今天與明天
          20    
          21     eregi('(<div class="wetSts">)([^<]*)(</div>)',$wea[0],$arr);            #找出表示今日天氣的內(nèi)容
          22     $info1 = $arr[2];
          23     eregi('(<div class="wetSts">)([^<]*)(</div>)',$wea[1],$arr);            #找出表示明日天氣的內(nèi)容   下同
          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。由于網(wǎng)易里的網(wǎng)頁是用GB2312編碼的,而Flex里接收的XML要UTF-8編碼才會正確讀出,所以要將獲取的網(wǎng)易里的數(shù)據(jù)進(jìn)行轉(zhuǎn)碼,這問題剛開始時,老是亂碼,搞到心煩,后來發(fā)現(xiàn)網(wǎng)易的Html的頭信息里 發(fā)現(xiàn)是GB2312的編碼,郁悶了半天,之后上網(wǎng)找了個中文轉(zhuǎn)碼的類,下載來直接套用。
              2。獲取回來的天氣信息的Html是分今天與明天的天氣信息,而里面的格式也是一樣的,所以,用正則查找時,只找到最先的那個,所以要先找個今天與明天的分界點,將其分離開來再各自解析里面的內(nèi)容,得出今天的天氣與明天的天氣。
              3。寫輸出XML時,格式要正確,不然Flex里讀取會有麻煩,還有,encoding一定要是UTF-8,還要將該PHP文件保存成UTF-8格式,我用DW寫該PHP時,因為我的DW新建文件時,默認(rèn)是ISO8859-1的,所以要將其文檔編碼格式改為UTF-8來保存。

          PHP完工之后,來到Flex這邊,畫好界面,添加代碼如下:
          先加一個HttpService標(biāo)簽 :
          <mx:HTTPService id="hs" showBusyCursor="true" method="GET" result="{hsResult(event);}" fault="{hsFault(event);}" />
          (事件響應(yīng)方法我就不在這里貼出來了,可下載源碼看)
          當(dāng)下拉選框選中城市之后,判斷用戶選中的是哪個城市,再對照該城市的代號,組合成URL
          hs.url = "http://www.jiangzone.com.cn/jiang/weather/weather.php?city=" + cityvalues[i];
          hs.send();
          結(jié)果返回時,再相應(yīng)的賦值:
          lblCity.text = event.result.weather.city;
          lblDate.text = event.result.weather.date;
          lblWea.text = event.result.weather.today.wea;
          weather對應(yīng)XML里的<weather>根標(biāo)簽,city對應(yīng)XML里的<city>標(biāo)簽。

          OK,修改一下,大功告成!
          以下是源碼:

          [down=attachments/month_0709/t2007916122822.rar]點擊下載此文件[/down]


          posted on 2008-07-29 14:07 姜大叔 閱讀(1222) 評論(1)  編輯  收藏 所屬分類: Flash/Flex

          評論:
          # re: Flex + PHP 的天氣預(yù)報[未登錄] 2013-12-21 15:27 | gg
          lj;kljl  回復(fù)  更多評論
            
          主站蜘蛛池模板: 高清| 岑溪市| 巴青县| 行唐县| 玉树县| 东阳市| 桦甸市| 如皋市| 江源县| 南开区| 宜宾市| 新安县| 阜新| 遂平县| 枣强县| 泌阳县| 西乌| 开封县| 新晃| 龙游县| 横山县| 河曲县| 随州市| 洛南县| 石台县| 清新县| 体育| 响水县| 沂水县| 丰原市| 五台县| 台安县| 达尔| 台东县| 三亚市| 沙雅县| 沾益县| 高青县| 凉城县| 洱源县| 连江县|