【实践】基于百度地图API实现的地图形式天气预报【二】

摘要:
基于百度地图API实现的地图形式天气预报主要介绍了前端地图显示页面的实现,现在介绍下服务端城市天气信息的获取方法。该脚本主要实现两个功能一个是根据客户端提交来的城市名称从网上抓取该城市的天气信息,另一个功能是格式化天气信息便于前端显示。另一处是对百度天气搜索返回的页面内容进行编码转换,这是因为百度页面编码是gb2312,转换为utf-8进行统一以防乱码。

【实践】基于百度地图API实现的地图形式天气预报【一】主要介绍了前端地图显示页面的实现,现在介绍下服务端城市天气信息的获取方法。

最近在学php语言,也算入了门了,所以此脚本是用php实现的也算是练习练习。该脚本主要实现两个功能一个是根据客户端提交来的城市名称从网上抓取该城市的天气信息,另一个功能是格式化天气信息便于前端显示。

天气信息抓取是通过向百度搜索页面提交城市名称+天气组成的关键字(如“北京天气”),获得搜索后的页面内容,再在该页面内容中利用正则抓取出天气信息。

<?php
$city = $_GET["a"]; 
/**
 * 功能: 根据输入的城市名进行天气查询并提取出天气信息
 * 参数: $city为该城市名称
 * 说明: 返回三天天气信息数组
 */
function get_city_weather($city){
			$w=array();
			if(!mb_detect_encoding($city,"utf-8")){
						$city=mb_convert_encoding($city, "utf-8", "gbk");
			}
			$url = 'http://www.baidu.com/s?wd=' . $city . '天气';

			$lines = file($url);
			$contents = file_get_contents ($url);
			$contents = mb_convert_encoding($contents, "utf-8", "gbk");
			$w["city"]=$city;
			
			preg_match('/中国天气网(.*?)中国气象局/', $contents, $contents_string);
			$lines_string = $contents_string[1];
			
			$w["img"]=array();
			preg_match_all('/<img(.*?)\/>/', $lines_string, $images);
			for ($i = 0; $i < (count($images[0])/2); $i++) {  
				preg_match('/src=(.*?)\/>/',$images[0][$i*2],$array_images1);
				preg_match('/src=(.*?)\/>/',$images[0][$i*2+1],$array_images2);
				$w["img"][$i]=array($array_images1[1],$array_images2[1]);
			} 

			preg_match_all('/<\/div>(.*?)<span>/', $lines_string, $weather);
			for ($i = 0; $i < count($weather[0]); $i++) {
				preg_match('/(.*?)℃/', strip_tags($weather[0][$i]), $array_temperature);
				$temperature[$i] = $array_temperature[0];
				preg_match('/℃(.*)/', strip_tags($weather[0][$i]), $array_tianqi);
				$tianqi[$i] = $array_tianqi[1];
			} 
			$w["temperature"]=$temperature;
			$w["weather"]=$tianqi;

			preg_match_all('/<span>(.*?)<\/span>/', $lines_string, $wind);
			for ($i = 0; $i < count($wind[0]); $i++) {
				$w["wind"][$i]=strip_tags($wind[0][$i]);
			} 

			return $w;
}

其中有两处关于编码转换问题,第一处对提交来的$city变量进行编码检查,刚开始我此处我并未这样做因为我是在firefox浏览器下进行测试未发现任何问题,后来我在ie上进行测试时发现了提交数据是乱码的问题,想起以前看过的一篇文章介绍过firefox和ie在提交数据时默认采用了不同的编码,firefox默认是采用utf-8而ie是gbk,我写的前端地图显示页面和后台php脚本都是统一的uft-8编码,所以才出现了ie上的乱码问题,后来在此处添加了编码检查,现用mb_detect_encoding函数进行编码检查,不是utf-8就再利用mb_convert_encoding函数进行编码转换。另一处是对百度天气搜索返回的页面内容进行编码转换,这是因为百度页面编码是gb2312,转换为utf-8进行统一以防乱码。

后面要做的就是对百度搜索返回的页面内容利用正则表达式进行天气信息提取,这里的关键就是编写正则表达式,正好提取出想要的天气信息,在这里自己先前也是没多少经验,只能比对这页面内容不断进行尝试,最后利用preg_match和preg_match_all函数配合自己编写的正则达到了目的,提取出了下图所示红框中的天气信息。

【实践】基于百度地图API实现的地图形式天气预报【二】第1张

再后面要做的就是编写html与css代码,对天气信息进行显示,这当然要与前端地图显示页面的信息窗口相符合,信息窗口的内容就是此处服务端返回给地图显示页面的html代码。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body{margin:0 auto;padding:0;background:none repeat scroll 0 0 #F8FAFC;}
.div_content{
		400px;
		background:none repeat scroll 0 0 #FFFFFF;
		height:135px;
		margin:0;
		padding:0;
		}
table{
		font-family:arial;
		font-size:100%;
		}
td{
		font-size:14px;
		text-align:center;
}
.td_lf{
		padding-right:20px;
		}
.td_center{
		padding-right:20px;
		padding-left:20px;
		border-left:1px solid #E2E9FC;
		}
.td_rt{
		padding-left:20px;
		border-left:1px solid #E2E9FC;
		}
strong{
		white-space:nowrap;
		}
</style>
</head>
<body>  
<div class="div_content">
<table cellspacing="0" cellpadding="0">
	<tr>
		<td class="td_lf">
			<strong>今天</strong>
			<br />
			<div>
			   <img src=<?php  echo $w["img"][0][0]; ?>/>
			   <img src=<?php echo $w["img"][0][1]; ?>/>
			</div>
			<strong><?php echo $w['temperature'][0]; ?></strong>
			<br />
			<strong><?php echo $w['weather'][0]; ?></strong>
			<br />
			<strong><?php echo $w['wind'][0]; ?></strong>
			</td>
		<td class="td_center">
			<strong>明天</strong>
			<br />
			<div>
			   <img src=<?php echo $w["img"][1][0]; ?>/>
			   <img src=<?php echo $w["img"][1][1]; ?>/>
			</div>
			<strong><?php echo $w['temperature'][1]; ?></strong>
			<br />
			<strong><?php echo $w['weather'][1]; ?></strong>
			<br />
			<strong><?php echo $w['wind'][1]; ?></strong>
			</td>
		<td class="td_rt">
			<strong>后天</strong>
			<br />
			<div>
			   <img src=<?php echo $w["img"][2][0]; ?>/>
			   <img src=<?php echo $w["img"][2][1]; ?>/>
			</div>
			<strong><?php echo $w['temperature'][2]; ?></strong>
			<br />
			<strong><?php echo $w['weather'][2]; ?></strong>
			<br />
			<strong><?php echo $w['wind'][2]; ?></strong>
			</td>
	</tr>
	</table>  
	</div>
</body>
</html>

显示效果如下图:

【实践】基于百度地图API实现的地图形式天气预报【二】第2张

最后,就是在地图显示页面,弹出的信息窗口中显示天气信息了,最终效果图:

【实践】基于百度地图API实现的地图形式天气预报【二】第3张

最后,还提下存在的问题,就是在ie中显示的效果问题,在ie中信息窗口中的内容是无样式的排列,如下图:

【实践】基于百度地图API实现的地图形式天气预报【二】第4张

这个问题折腾了很久也没解决,浏览器之间的兼容问题还真令人感到纠结啊,自己现在也只能不断积累经验,待日后解决。

免责声明:文章转载自《【实践】基于百度地图API实现的地图形式天气预报【二】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇go mod使用submit text3的激活与使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

中央气象台天气预报api调用

今天突然要做一个天气预报的应用,上网搜了一下,发现可用的api其实挺多的,包括谷歌、雅虎、中央气象台等等。 谷歌的天气预报的优点在于可以直接获取支持查询天气的国家和城市。并且可以预报4天天气,支持经纬度查询天气(这个可以利用GPS做应用)。缺点也是惊人的:支持的中国城市比较少。 雅虎的天气预报返回的是xml数据,我需要的是json数据,所以也没什么好感。...

[安卓网络入门] 获取天气

实验要求 本次实验,通过调用http://www.weather.com.cn/data/sk/101010100.html制作天气查询的app。 实验过程 我是利用了okhttp这个第三方库,通过post请求,向上面的天气查询接口查询信息, 然后返回的结果,通过handler送到ui线程。因为安卓不允许无关线程修改ui界面。 对于json字符串的解析,可...

Android之基于小米天气的天气源库

大概去年的这个时候,有跟大家分享简洁天气这个应用。 该应用一開始使用的是中国天气网的数据,可是,由于须要反复多次请求server获取信息才干满足我们的需求,因此。后来我偷偷的将天气源更换成“知趣天气”的server(如有冒犯,请谅解,本人仅仅是用作学习交流)。由于该server将我们须要的天气数据又一次处理了一下。包含当前天气信息、未来6天的预报以及空气...

微信公众平台开发(75) 语音识别

本文介绍如何使用微信公众平台高级接口中的语音识别功能,做出一个语音版的天气预报查询功能。根据这个模型,你可以扩展到所有的语音查询。 一、接收语音识别结果 开通语音识别功能以后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段。该字段为语音识别出的文本内容。 用户发送语音: 语音XML数据包如下 <...

微信小程序开发实战-天气小程序

园龄6年8个月了,还一篇文章都没写过,惭愧! 最近周末做了个天气预报小程序,在这里整理一下开发过程和注意点,给对小程序开发感兴趣的伙伴们提供点参考。 废话不多说,先上图最终效果: 下面进入正文: 第一步  准备 0. 把微信小程序开发文档过一遍。https://developers.weixin.qq.com/miniprogram/dev/framew...

python 获取天气信息

【说明】接口为聚合数据接口。API使用说明: 实现代码: import requests,json def main(): #参数 farmat=1 cityname = input("请输入你想查询的城市天气:") key='621043608cb9e7f7f485461ef9e5adef' get_weat...