通路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 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;i35 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>"); 47 } 48} 49 50 56 57 |
上面的這段js實作了對來訪者IP判斷并給出了天氣預告結果的連結。Js裡的此連結: http://202.108.39.152/ipquery,起到的是判斷使用者所在地的作用,傳回的是來訪者所在地省份。分析到此,想要的結果差不多就出來了…
在用戶端調用這段js獲得天氣預告結果的連結位址,然後交給服務端來處理。(為什麼要交給背景處理,而不是直接顯示呢?)因為直接得出的連結頁面上,有多餘的連結,還應用了樣式(如圖一),不便為自己所用,是以得處理掉。用戶端調用服務端的方法很多,最初使用了Ajax架構Anthem,實作了過後,覺得有點殺雞用牛刀的感覺。。無聊之餘。。就又用CallBack實作了一次。。感覺恰到好處。。後來又發現。。__doPostBack也能夠實作用戶端調用服務端方法。。看來實作這麼一個功能還真是簡單。。。
好了到此就實作了,自己想要的結果:(感覺有點遺憾的是隻給出了省會城市的天氣預告)
前台頁面代碼Defaul.aspx:
1 2 3 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>"); 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 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 ; 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 < 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 |