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

  由此可以推测http://news.163.com/util/position1.html,是在根据来访者的IP判断所属区域,然后返回一个该地区所对应的区位码,如: 56294代表成都。如何让网易来帮我们的站点来访者判断所属区域,并给出天气情况,并显示在自己的站点页面上呢?还得继续分析。。因为http://news.163.com/util/position1.html,此链接一访问就转向到天气情况的链接,而无法查看源码。便猜想。。此页面肯定有些东西。。无奈之下。。WebRequest一下,出现了如下代码:
以下是引用片段:
 1 
50 
56 
57
  上面的这段js实现了对来访者IP判断并给出了天气预报结果的链接。Js里的此链接: http://202.108.39.152/ipquery,起到的是判断用户所在地的作用,返回的是来访者所在地省份。分析到此,想要的结果差不多就出来了…
  在客户端调用这段js获得天气预报结果的链接地址,然后交给服务端来处理。(为什么要交给后台处理,而不是直接显示呢?)因为直接得出的链接页面上,有多余的链接,还应用了样式(如图一),不便为自己所用,所以得处理掉。客户端调用服务端的方法很多,最初使用了Ajax框架Anthem,实现了过后,觉得有点杀鸡用牛刀的感觉。。无聊之余。。就又用CallBack实现了一次。。感觉恰到好处。。后来又发现。。__doPostBack也可以实现客户端调用服务端方法。。看来实现这么一个功能还真是简单。。。
  好了到此就实现了,自己想要的结果:(感觉有点遗憾的是只给出了省会城市的天气预报)

  前台页面代码Defaul.aspx: 
以下是引用片段:
 1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" ResponseEncoding="GB2312" %> 
 2 
 3 
 4
  5
  6 
 98 
 99 
100 
 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 < parts.Length; int_index++) 
38 theArgList[int_index - 1] = parts[int_index]; 
39 return (string)GetType().GetMethod(parts[0]).Invoke(this, theArgList); 
40 } 
41 #endregion 
42 
43 解析url的页面内容的方法体#region 解析url的页面内容的方法体 
44 /**////  
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
来源:天极