最近项目中需要增加天气预报功能,网上给的资料有很多缺陷比如
1. 有些小网站提供的webservers本身就不稳定不能长期使用。
2. 还有一些网站限制访问次数。
3. 再有就是花钱买服务。
根据以上几点只能放弃使用第三方的webservers,由此我们只能找个信得过的提供天气预报的网站抓取页面信息。
接下来我们以中央气象台为例实现从请求到数据解析的过程。
1. 浏览http://www.nmc.gov.cn/ 发现一个搜索功能
做过网页的人都知道通过表单提交城市名字,那我们去看看具体提交到什么地方呢。
在这个from表单中我们发现了什么?对有action 和 keys 这都知道是什么意思我就不废话了。
最终我们得到一个url : http://www.nmc.gov.cn/search_result.php?keys =城市名字
哈哈,这就是我们获得天气预报的关键。
2. 通过程序访问url.
以下是使用HttpClient的例子
HttpClient client = new HttpClient();//实例
String url="http://www.nmc.gov.cn//search_result.php?keys="+city;
method = new GetMethod(url);//通过Get方式访问
httpstatus = client.executeMethod(method);
if(httpstatus==200)//200表示成功
{
//获得响应转码为GBK,否则中文会乱码
String result=newString
(method.getResponseBodyAsString().getBytes("iso-8859-1"),"GBK");
}
用上面的程序访问你会发现报错了 Invalid query ;这里我们需要将城市名字转码
String url="http://www.nmc.gov.cn//search_result.php?
keys="+URLEncoder.encode(city,”GBK”);
这样在url中中文就是转码后的不会出现乱码。
3. 解析数据
以北京为例提交后网页信息为:
对应的页面中的代码为:
至此我们就可以获得天气信息了。。。。解析的代码如下:
public void ParaseHtml(String html)
{
String climate = ParaseWeatherInfo(html,"天气");
String temperature = ParaseWeatherInfo(html,"气温");
String wind = ParaseWeatherInfo(html,"风");
String barometric = ParaseWeatherInfo(html,"气压");
log .debug("天气:"+climate +"/ 气温 :"+temperature +"/ 风 "+wind +"/ 气压"+barometric);
}
public String ParaseWeatherInfo(String str,String word)
{
String w = null;
String st = "w365line1";
//System.err.println(str);
int a = str.indexOf(st);
if(a!= -1)
{
String div1 = "<div";
String div2 = "</div>";
String keyword = ":";
int d1 = str.lastIndexOf(div1, a);
int d2 = str.indexOf(div2, a);
if(d2 != -1)
{
String str4 = null;
String str2 = str.substring(d1, d2+div2.length());
if(str2.indexOf(word) !=-1)
{
str4 = filerStr(str2,word,"");
int k1 = str4.indexOf(keyword);
str4 = str4.substring(k1+1,str4.length()).trim();
return str4;
}
else
{
String s5 = str.replace(str2, "");
w = ParaseWeatherInfo(s5,word);
return w;
}
}
}
return w;
}
public String filerStr(String html,String word,String replacement)
{
try{
if(replacement==null)
replacement = "";
String str=html;
String str1="(<[^>]*>)|( )";
Pattern p=Pattern.compile (str1);
Matcher m=p.matcher(str);
boolean f=m.find();
StringBuffer sb=new StringBuffer();
while(f) {
m.appendReplacement(sb,replacement);
f=m.find();
}
m.appendTail(sb);
return sb.toString();
}
catch(Exception e)
{
}
return html;
}
抓取北京的天气信息:
String html = WeatherUtil2.getInstance ().getNMCRespones("北京");
WeatherUtil2.getInstance ().ParaseHtml(html);
天气:多云/ 气温 :30 ℃/ 风 西南风,3级,4米/秒/ 气压1001.8hPa
到这里关于天气预报的程序基本讲解完毕,欢迎大家指正。