访问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<script language="Javascript"> 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 < clen) { 17 var j = i alen; 18 if (document.cookie.substring(i, j) == arg) 19 return getCookieVal (j); 20 i = document.cookie.indexOf(" ", i) 1; 21 if (i == 0) 22 break; 23 } 24 return ""; 25} 26function SetCookie(cookieName,cookieValue,nDays) { 27 var today = new Date(); 28 var expire = new Date(); 29 if (nDays==null || nDays==0) nDays=1; 30 expire.setTime(today.getTime() 3600000*24*nDays); 31 document.cookie = cookieName "=" escape(cookieValue) ";path=/;domain=.163.com;expires=" expire.toGMTString(); 32} 33function getCityWeatherID(cityname){ 34 for(i=0;i<city.length;i ){ 35 if(city[i]==cityname){ 36 return weaths[i]; 37 } 38 } 39 return "54511"; 40} 41 42var NTES_WeatherAddr = GetCookie("NTES_WeatherAddr"); 43if (!NTES_WeatherAddr){ 44 var loc = GetCookie("theaddr"); 45 if(!loc){ 46 document.write("<script type='text/javascript' src='http://202.108.39.152/ipquery'><" "/script>"); 47 } 48} 49</script> 50<script> 51if (!NTES_WeatherAddr){ 52 NTES_WeatherAddr=getCityWeatherID(loc); 53} 54window.location.href="http://news.163.com/weather/news/qx1/" NTES_WeatherAddr ".html"; 55</script> 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<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml">
4<head runat="server">
5<title></title>
6<script>
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("<script type='text/javascript' src='http://202.108.39.152/ipquery'><" "/script>");
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 < clen) {
31 var j = i alen;
32 if (document.cookie.substring(i, j) == arg)
33 return getCookieVal (j);
34 i = document.cookie.indexOf(" ", i) 1;
35 if (i == 0)
36 break;
37 }
38 return "";
39}
40
41function SetCookie(cookieName,cookieValue,nDays) {
42 var today = new Date();
43 var expire = new Date();
44 if (nDays==null || nDays==0) nDays=1;
45 expire.setTime(today.getTime() 3600000*24*nDays);
46 document.cookie = cookieName "=" escape(cookieValue) ";path=/;domain=.163.com;expires=" expire.toGMTString();
47}
48
49//根据Ip服务器返回的省份名称获取对应的编号
50function getCityWeatherID(cityname){
51 for(i=0;i<city.length;i ){
52 if(city[i]==cityname){
53 return weaths[i];
54 }
55 }
56 return "57816";
57}
58
59//获取所在地天气预报结果的链接
60function getWeatherUrl(){
61if (!NTES_WeatherAddr){
62 NTES_WeatherAddr=getCityWeatherID(loc);
63
64}
65var addr="http://news.163.com/weather/news/qx1/" NTES_WeatherAddr ".html";
66document.form1.Text1.value=addr;
67}
68
69//客户端调用服务端方法实现对天气预报结果链接的页面内容进行解析,Anthem实现方式
70function showWeatherByAnthem() {
71 Anthem_InvokePageMethod("ShowWeatherByAnthem", [], getServerResult);
72}
73
74function getServerResult(result) {
75 document.getElementById("result").innerHTML = result.value;
76}
77
78//客户端调用服务端方法实现对天气预报结果链接的页面内容进行解析,_doPostBack实现方式
79function showWeatherBylink()
80{
81 __doPostBack('LinkButton1','');
82}
83
84//客户端调用服务端方法实现对天气预报结果链接的页面内容进行解析,CallBack实现方式
85function showWeatherByCallBack()
86{
87 var context=document.getElementById("result");
88 var weatherUrl=document.getElementById("Text1");
89 var arg="ShowWeatherByCall|" weatherUrl.value;
90 <%= ClientScript.GetCallbackEventReference(this,"arg","outPutResult","context")%>;
91}
92function outPutResult(result)
93{
94 document.getElementById("result").innerHTML = result;
95
96}
97</script>
98</head>
99<body onload="getWeatherUrl(),showWeatherByCallBack()">
100 <form id="form1" runat="server">
101 <span id="result"></span>
102 <input id="Text1" type="hidden" runat="server" />
103 </form>
104</body>
105</html>
106
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
网站运营
建站经验
策划盈利
搜索优化
网站推广
免费资源
网站联盟
联盟新闻
联盟介绍
联盟点评
网赚技巧
行业资讯
业界动态
搜索引擎
网络游戏
门户动态
电子商务
广告传媒
网络编程
Asp.Net编程
Asp编程
Php编程
Xml编程
Access
Mssql
Mysql
其它
服务器技术
Web服务器
Ftp服务器
Mail服务器
Dns服务器
安全防护
软件技巧
其它软件
Word
Excel
Powerpoint
Ghost
Vista
QQ空间
QQ
FlashGet
迅雷
Internet Explorer
网页制作
FrontPages
Dreamweaver
Javascript
css
photoshop
fireworks
Flash
程序设计
Java技术
C/C++
VB
delphi
网络知识
网络协议
网络安全
网络管理
组网方案
Cisco技术
操作系统
Win2000
WinXP
Win2003
Mac OS
Linux
FreeBSD




