随笔-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 姜大叔 阅读(1201) 评论(1)  编辑  收藏 所属分类: Flash/Flex

评论:
# re: Flex + PHP 的天气预报[未登录] 2013-12-21 15:27 | gg
lj;kljl  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: