隨筆-31  評論-257  文章-0  trackbacks-0
              這幾天無聊著,打開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 姜大叔 閱讀(1222) 評論(1)  編輯  收藏 所屬分類: Flash/Flex

          評論:
          # re: Flex + PHP 的天氣預報[未登錄] 2013-12-21 15:27 | gg
          lj;kljl  回復  更多評論
            
          主站蜘蛛池模板: 涪陵区| 泸溪县| 仪征市| 台南市| 十堰市| 德阳市| 枣阳市| 当雄县| 庄浪县| 阿鲁科尔沁旗| 永宁县| 彭阳县| 麻江县| 鄂托克旗| 余江县| 德州市| 建昌县| 巍山| 周口市| 齐河县| 班玛县| 东乡县| 江源县| 平邑县| 东港市| 沅江市| 嵩明县| 河津市| 建阳市| 上思县| 常德市| 黄龙县| 土默特左旗| 眉山市| 金川县| 八宿县| 宁乡县| 霞浦县| 青阳县| 阜城县| 花莲市|