`
txf2004
  • 浏览: 6831678 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

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

http://edu.cnzz.cn/newsfile/18000-18999/18921/081010233193500.jpg


  由此可以推测http://news.163.com/util/position1.html,是在根据来访者的IP判断所属区域,然后返回一个该地区所对应的区位码,如: 56294代表成都。如何让网易来帮我们的站点来访者判断所属区域,并给出天气情况,并显示在自己的站点页面上呢?还得继续分析。。因为http://news.163.com/util/position1.html,此链接一访问就转向到天气情况的链接,而无法查看源码。便猜想。。此页面肯定有些东西。。无奈之下。。WebRequest一下,出现了如下代码:
  以下是引用片段:
1 
2var city = new Array("安徽","黑龙江","山东","北京","湖北","山西","福建","湖南","陕西","甘肃","吉林","上海","广东","江苏","四川","广西","江西","天津","贵州","辽宁","西藏","海南","内蒙古","新疆","河北","宁夏","云南","河南","青海","浙江","重庆"); 
3var weaths = new Array('58321','50953','54823','54511','57494','53772','59134','57679','57036','52889','54172','58367','59287','58238','56294','59431','58606','54527','57816','54342','55591','52856','53463','51463','53698','53614','56778','57083','52866','58457','57516'); 
4 
5function getCookieVal (offset) { 
6 var endstr = document.cookie.indexOf (";", offset); 
7 if (endstr == -1) 
8 endstr = document.cookie.length; 
9 return unescape(document.cookie.substring(offset, endstr)); 
10} 
11function GetCookie (name) { 
12 var arg = name + "="; 
13 var alen = arg.length; 
14 var clen = document.cookie.length; 
15 var i = 0; 
16 while (i "); 
47  } 
48} 
49 
50 
51if (!NTES_WeatherAddr){ 
52  NTES_WeatherAddr=getCityWeatherID(loc); 
53} 
54window.location.href="http://news.163.com/weather/news/qx1/"+NTES_WeatherAddr+".html"; 
55 
56 
57
上面的这段js实现了对来访者IP判断并给出了天气预报结果的链接。Js里的此链接: http://202.108.39.152/ipquery,起到的是判断用户所在地的作用,返回的是来访者所在地省份。分析到此,想要的结果差不多就出来了…
  在客户端调用这段js获得天气预报结果的链接地址,然后交给服务端来处理。(为什么要交给后台处理,而不是直接显示呢?)因为直接得出的链接页面上,有多余的链接,还应用了样式(如图一),不便为自己所用,所以得处理掉。客户端调用服务端的方法很多,最初使用了Ajax框架Anthem,实现了过后,觉得有点杀鸡用牛刀的感觉。。无聊之余。。就又用CallBack实现了一次。。感觉恰到好处。。后来又发现。。__doPostBack也可以实现客户端调用服务端方法。。看来实现这么一个功能还真是简单。。。
  好了到此就实现了,自己想要的结果:(感觉有点遗憾的是只给出了省会城市的天气预报)
  前台页面代码Defaul.aspx:
  以下是引用片段:
 1
 2
 3
 4
 5
 6
 7var city = new Array("安徽","黑龙江","山东","北京","湖北","山西","福建","湖南","陕西","甘肃","吉林","上海","广东","江苏","四川","广西","江西","天津","贵州","辽宁","西藏","海南","内蒙古","新疆","河北","宁夏","云南","河南","青海","浙江","重庆");
 8var weaths = new Array('58321','50953','54823','54511','57494','53772','59134','57679','57036','52889','54172','58367','59287','58238','56294','59431','58606','54527','57816','54342','55591','52856','53463','51463','53698','53614','56778','57083','52866','58457','57516');
 9
10var NTES_WeatherAddr = GetCookie("NTES_WeatherAddr");
11if (!NTES_WeatherAddr){
12  var loc = GetCookie("theaddr");
13  if(!loc){
14    document.write("");
15  }
16} 
17
18function getCookieVal (offset) {
19 var endstr = document.cookie.indexOf (";", offset);
20 if (endstr == -1)
21 endstr = document.cookie.length;
22 return unescape(document.cookie.substring(offset, endstr));
23}
24
25function GetCookie (name) {
26 var arg = name + "=";
27 var alen = arg.length;
28 var clen = document.cookie.length;
29 var i = 0;
30 while (i ;
91}
92function outPutResult(result)
93{   
94  document.getElementById("result").innerHTML = result;
95    
96}
97
98
99
100  
101    
102    
103  
104
105
106
后台代码Default.cs:
  以下是引用片段:
1using System;
2using System.Data;
3using System.Configuration;
4using System.Web;
5using System.Web.Security;
6using System.Web.UI;
7using System.Web.UI.WebControls;
8using System.IO;
9using System.Net;
10using Anthem;
11
12public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
13{
14  protected void Page_Load(object sender, EventArgs e)
15  {
16    Anthem.Manager.Register(this);
17
18  }
19
20  回调的固定格式#region 回调的固定格式
21  public string str_content;
22  
23  public void RaiseCallbackEvent(string the_string)
24  {
25    str_content = the_string;
26  }
27
28  /**////
29  /// 回调,解析客户端的参数
30  ///
31  ///
32  public string GetCallbackResult()
33  {
34    
35    string[] parts = str_content.Split('|');
36    object[] theArgList = new object[parts.Length - 1];
37    for (int int_index = 1; int_index
45  /// Anthem方式,解析获取的url的页面内容
46  ///
47  /// url
48  /// 解析结果
49  [Anthem.Method]
50  public string ShowWeatherByAnthem()
51  {
52
53    WebRequest request = WebRequest.Create(Text1.Value);
54    request.Credentials = CredentialCache.DefaultCredentials;
55    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
56    Stream dataStream = response.GetResponseStream();
57    StreamReader reader = new StreamReader(dataStream, System.Text.Encoding.Default);
58    string str = reader.ReadToEnd();
59    return str.Substring(220);
60
61  }
62   //
63   //回调方式,解析获取的url的页面内容
64   //
65   //
66   //
67  public string ShowWeatherByCall(string url)
68  {
69    WebRequest request = WebRequest.Create(url);
70    request.Credentials = CredentialCache.DefaultCredentials;
71    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
72    Stream dataStream = response.GetResponseStream();
73    StreamReader reader = new StreamReader(dataStream, System.Text.Encoding.Default);
74    string str = reader.ReadToEnd();
75    return str.Substring(220);
76
77  }
78  #endregion
79}
80

分享到:
评论

相关推荐

    ASP+sql2000+AJAX天气预报加强版-根据IP自动获取当地天气预报

    页面第一次载入时会根据IP自动获取当地天气今天的预报,也可以手动选择获取明天或后天的天气。 全国各省市数据表里读取数据加载到下拉列表中,通过选择省和市,以AJAX异步传输方式获取天气信息,还可 以选择获取...

    根据IP地址获得天气预报

    使用js + CSS根据IP获得当地的天气预报,使用的是新浪的接口。

    ASP+Access+AJAX天气预报加强版-根据IP自动获取当地天气预报

    此版本已过时,仅供学习使用。 请在CSDN下载中心搜索最新版本: 资源名称:(天气预报-根据IP自动获取当地天气预报,更新时间:2010-9-9)

    通过IP查询所在地天气预报

    通过IP查询所在地天气预报,调用了网上的免费接口实现

    C#WInform天气预报

    根据IP获得当地天气预报!开机自动运行程序

    利用c#获取天气预报信息

    利用C#制作的天气预报助手 采用vs2008开发,因为是天气预报,所以需要网络...程序启动后会获取本机IP,根据IP显示当地的天气预报,类似QQ的天气预报显示功能,不过信息更加丰富 也可以手动选择省、市、区查看天气预报。

    ASP+sql2000+AJAX天气预报服务

    全国各省市数据表里读取数据加载到...2.由访问者IP确定其地理位置,再找到他所在的城市,从而显示当地天气信息。 文件中的weather_Data_MDF.rar是数据文件,直接附加就行了。附加后修改conn.asp中的链接串即可使用。

    查询天气预报

    查询天气预报,运行自动识别当地城市,显示72小时天气情况

    C# 基于VS2008 + .Net3.5开发的天气预报(自动 + 手动)

    基于VS2008 + .Net3.5开发的天气预报,需要网络支持。 这里只放开原型。 程序启动时会自动联网获取公网IP,然后根据IP自动查看当地天气。 也可以手动选择省、市、区查看天气预报。

    ASP+Access+AJAX天气预报加强版_2010-1-18最新改进版

    页面第一次载入时会根据IP自动获取当地天气今天的预报,也可以手动选择获取明天或后天的天气。 全国各省市数据表里读取数据加载到下拉列表中,通过选择省和市,以AJAX异步传输方式获取天气信息,还可 以选择获取...

    ASP+sql2000+AJAX天气预报加强版_2010-1-18最新改进版

    页面第一次载入时会根据IP自动获取当地天气今天的预报,也可以手动选择获取明天或后天的天气。 全国各省市数据表里读取数据加载到下拉列表中,通过选择省和市,以AJAX异步传输方式获取天气信息,还可 以选择获取...

Global site tag (gtag.js) - Google Analytics