访问www.163.com,首页的栏目里有当地的天气预报。可以猜想,这里的天气预报,应该是根据来访者的ip判断其所在地给出当地的天气情况。问了一些朋友,也证实了这一点。项目里也需要天气预报这个小栏目,同事做过一个(从其他站点抓取的),不过实现不了根据IP显示当地的天气情况,需要用户自行选择,而且抓取的站点属于小站….其可靠性值得怀疑。。所以就萌生了抓取网易的天气预报的想法。。。对页面进行分析。。发现显示天气预报的区域是一个IFrameIFrame里嵌入了如下链接http://news.163.com/util/position1.html对这个地址访问直接跳转到另外一个链接http://news.163.com/weather/news/qx1/56294.html此链接显示了天气情况,

根据IP获取当地天气预报的实现

由此可以推测http://news.163.com/util/position1.html,是在根据来访者的IP判断所属区域,然后返回一个该地区所对应的区位码,如:56294代表成都。如何让网易来帮我们的站点来访者判断所属区域,并给出天气情况,并显示在自己的站点页面上呢?还得继续分析。。因为http://news.163.com/util/position1.html,此链接一访问就转向到天气情况的链接,而无法查看源码。便猜想。。此页面肯定有些东西。。无奈之下。。WebRequest一下,出现了如下代码:

>

 

上面的这段js实现了对来访者IP判断并给出了天气预报结果的链接。Js里的此链接: http://202.108.39.152/ipquery,起到的是判断用户所在地的作用,返回的是来访者所在地省份。分析到此,想要的结果差不多就出来了…

在客户端调用这段js获得天气预报结果的链接地址,然后交给服务端来处理。(为什么要交给后台处理,而不是直接显示呢?)因为直接得出的链接页面上,有多余的链接,还应用了样式(如图一),不便为自己所用,所以得处理掉。客户端调用服务端的方法很多,最初使用了Ajax框架Anthem,实现了过后,觉得有点杀鸡用牛刀的感觉。。无聊之余。。就又用CallBack实现了一次。。感觉恰到好处。。后来又发现。。__doPostBack也可以实现客户端调用服务端方法。。看来实现这么一个功能还真是简单。。。

好了到此就实现了,自己想要的结果:(感觉有点遗憾的是只给出了省会城市的天气预报)

根据IP获取当地天气预报的实现
前台页面代码Defaul.aspx:

  1>

后台代码Default.cs:

 1根据IP获取当地天气预报的实现using System;
 2根据IP获取当地天气预报的实现using System.Data;
 3根据IP获取当地天气预报的实现using System.Configuration;
 4根据IP获取当地天气预报的实现using System.Web;
 5根据IP获取当地天气预报的实现using System.Web.Security;
 6根据IP获取当地天气预报的实现using System.Web.UI;
 7根据IP获取当地天气预报的实现using System.Web.UI.WebControls;
 8根据IP获取当地天气预报的实现using System.IO;
 9根据IP获取当地天气预报的实现using System.Net;
10根据IP获取当地天气预报的实现using Anthem;
11根据IP获取当地天气预报的实现
12根据IP获取当地天气预报的实现public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
13#endregion


      客户端调用服务端的方法,__doPostBack方式,没有实现服务端的方法体,跟其余两种方式大致一样。当前是采用的CallBack方式调用服务端方法,如果想使用Anthem方式 ,更换onload里第二个function就可以了。

相关文章: