前些天在网上找到了一些获取alexa和google pr的api,现在结合实际使用asp和asp.net实现自己的google pr和alexa排名查询。要想查询看更多如何获取alexa的api,请阅读下面两篇文章
[转]如何获取Alexa排名数据
示例代码点击此处下载
首先介绍自己写的ajax类库ajax.js,这个是ajax查询的基础,代码如下
String.prototype.trim=function(){return this.replace(/$/s*|/s*$/g,'');} var Showbo={author:'showbo'}; //获取json对象 Showbo.getJson=function(v){if(typeof(v)=='string')return eval('('+v+')');else return v;} //根据id获取对象 Showbo.$=function(Id){if('object'==typeof(Id))return Id;else if('string'==typeof(Id))return document.getElementById(Id);else return null;} Showbo.IsIE=!!document.all; //扩展IE下的XMLHttpRequest if(Showbo.IsIE)window.XMLHttpRequest=function(){ var acX=['msxml2.xmlhttp.5.0','msxml2.xmlhttp.4.0','msxml2.xmlhttp.3.0','msxml2.xmlhttp','microsoft.xmlhttp'],Xhr; for(var i=0;itry{Xhr=new ActiveXObject(acX[i]);return Xhr;}catch(e){} return false; } //ajax应用池 Showbo.Ajax={ pools:[]//存储ajax对象的数组 ,getObject:function(){//从数组中获取ajax对象,如果未返回则新建一个ajax对象 for(var i=0;i<this.pools.length;i++) if(this.pools[i].readyState==0||this.pools[i].readyState==4)return this.pools[i]; this.pools[this.pools.length]=new XMLHttpRequest(); return this.pools[this.pools.length-1]; } ,send:function(cfg){/*cfg示例 { url:'请求的页面' ,params:'键值对,注意不是json对象' ,method:'post/get,如果为指定则默认为get' ,success:成功时的回调函数 ,failure:失败时的回调函数 ,otherParams:提供给回调函数的其他参数,可以为json对象 } 成功或者失败的回调函数参数为 (当前的xhr对象,配置文件的中的otherParams) */ if(!cfg||!cfg.url)throw("未设置配置文件!"); var method=cfg.method,asy="boolean"==typeof(cfg.asy)?cfg.asy:true; if(!method||method!="post")method="get"; if(method.toLocaleLowerCase()=='get'){ var _dc=new Date().getTime();//加时间戳防止ie浏览器下的缓存 cfg.params=cfg.params?cfg.params+'&_dc='+_dc:'_dc='+_dc; if(cfg.url.indexOf("?")!=-1)cfg.url+="&"+cfg.params; else cfg.url+="?"+cfg.params;cfg.params=null; } else if(!cfg.params)cfg.params=''; var o=this.getObject(); if(!o)throw("未能创建ajax对象!"); o.open(method,cfg.url,asy); if(method.toLocaleLowerCase()=='post')o.setRequestHeader("content-type","application/x-www-form-urlencoded"); o.send(cfg.params); o.onreadystatechange=function(){ if(o.readyState==4){ if(o.status==200||o.status==0){ if("function"==typeof(cfg.success))cfg.success(o,cfg.otherParams); } else if("function"==typeof(cfg.failure))cfg.failure(o,cfg.otherParams); } } } }
下面是测试页面index.html
<!!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>简易alexa排名,google pr查询</title> <meta name="Keywords" runat="server" id="metaKey" content="ajax查询,alexa排名,google page rank 查询"/> <meta name="Description" runat="server" id="metaDes" content="ajax查询,alexa排名,google page rank 查询"/> <mce:script type="text/javascript" src="ajax.js" mce_src="ajax.js"></mce:script> <mce:style type="text/css"><!-- body{font-size:12px;} div{line-height:20px;margin-top:10px;} div span{float:left;} div span.prm{width:40px;height:5px;border:solid 1px #000000;line-height:5px;overflow:hidden;margin-top:7px;} div span.prm span{background:#5eaa5e;} --></mce:style><style type="text/css" mce_bogus="1"> body{font-size:12px;} div{line-height:20px;margin-top:10px;} div span{float:left;} div span.prm{width:40px;height:5px;border:solid 1px #000000;line-height:5px;overflow:hidden;margin-top:7px;} div span.prm span{background:#5eaa5e;} </style> </head> <body> <h1>简易alexa排名,google pr查询</h1> 请输入要查询的域名:<input type="text" style="width:300px" id="Url" value="w3dev.cn" οnkeydοwn="if(event.keyCode==13)load();"/><input type="button" οnclick="load()" value="查询"/> <br ><div id="divAl"></div> <div id="divGPR"></div> <mce:script type="text/javascript"><!-- function getGPR(n){ if(!/^[0-9]$|^10$/.test(n))n=0; else n=parseInt(n,10); return '<span>google PR:</span><span class="prm" title="'+n+'"><span style="width:'+n+'0%">'+(n==0?'':' ')+'</span></span>'; } function ajaxHandler(xhr,Id){Showbo.$(Id).innerHTML=Id=="divGPR"?getGPR(xhr.responseText.trim()):'Alexa排名为:'+xhr.responseText;} function load(){ var u=Showbo.$('Url'),v=u.value.trim(); if(v==''){alert('请输入要查询的域名!');u.select();return false;} Showbo.$('divAl').innerHTML='<img src="loading.gif" mce_src="loading.gif"/>正在加载Alexa排名...'; Showbo.$('divGPR').innerHTML='<img src="loading.gif" mce_src="loading.gif"/>正在加载Google PR....'; //修改下面请求的页面既可实现asp版本 Showbo.Ajax.send({url:'alexa.ashx',method:'post',params:'u='+escape(v),otherParams:'divAl',success:ajaxHandler,failure:ajaxHandler}); Showbo.Ajax.send({url:'googlepr.ashx',method:'post',params:'u='+escape(v),otherParams:'divGPR',success:ajaxHandler,failure:ajaxHandler}); } // --></mce:script> </body> </html>
下面分别为asp.net版本的ashx文件和asp版本的获取alexa排名和google pr的源代码。很简单的,和ajax代码差不多,只是服务器端的xhr请求而已,并且为同步请求。
===================asp.net===================
alexa.ashx
<%@ WebHandler Language="C#" Class="alexa" %> using System; using System.Web; using System.Net; using System.Text; using System.Text.RegularExpressions; public class alexa : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; string u = (context.Request.Form["u"] + "").Trim(), rank = "NaN"; if (u != "") { WebClient wc = new WebClient(); string xmlString = wc.DownloadString("http://data.alexa.com/data/+wQ411en8000lA?cli=10&dat=snba&ver=7.0&cdt=alx_vw=20&" + "wid=12206&act=00000000000&ss=1680x1050&bw=964&t=0&ttl=35371&vis=1&rq=4&url="+u); wc.Dispose(); Match m = Regex.Match(xmlString, "<POPULARITY URL=/"//s*.+?//s*/" TEXT=/"//s*(//d+)//s*/"/>" , RegexOptions.IgnoreCase | RegexOptions.Compiled); if (m.Groups[1].Value != "") rank = m.Groups[1].Value; } context.Response.Write(rank); } public bool IsReusable { get { return false; } } }
<%@language="vbscript" codepage="65001"%> <% Option Explicit '防止asp使用utf-8编码时中文出现乱码 Session.CodePage=65001 Response.CharSet="utf-8" Dim u,xhr,rank u=trim(Request.Form("u")&""):rank="NaN" If u<>"" Then Set xhr=Server.CreateObject"Micr"&"osoft.XML"&"HTTP")'防止被杀毒软件干掉 xhr.open "get","http://data.alexa.com/data/+wQ411en8000lA?cli=10&dat=snba&ver=7.0&cdt=alx_vw=20&"&_ "wid=12206&act=00000000000&ss=1680x1050&bw=964&t=0&ttl=35371&vis=1&rq=4&url="&u,False xhr.send Dim xmlString,r xmlString=xhr.responseText'获取返回的xml字符串 Set xhr=Nothing Set r=New RegExp r.Global=True r.IgnoreCase=True r.Pattern="<POPULARITY URL=""/s*.+?/s*"" TEXT=""/s*(/d+)/s*""/>" Set ms=r.Execute(xmlString) For Each m In ms rank=m.submatches(0):Exit For Next Set r=Nothing End If Response.Write rank %>
googlepr.asp
<%@language="vbscript" codepage="65001"%> <% Option Explicit '防止asp使用utf-8编码时中文出现乱码 Session.CodePage=65001 Response.CharSet="utf-8" Dim u,xhr,pr u=trim(Request.Form("u")&""):pr="0" If u<>"" Then' Set xhr=Server.CreateObject("Micr"&"osoft.XML"&"HTTP")'防止被杀毒软件干掉 xhr.open "get","http://www.google.cn/search?client=navclient-auto&ch=6-1385476800&"&_ "features=Rank&q=info:"&u,False xhr.send Dim str,rs str=xhr.responseText'获取返回的xml字符串 Set xhr=Nothing rs=Split(str,":") pr=rs(UBound(rs)) End If Response.Write pr %>
用alexa接口获取到的不是最新的排名信息,下面发一个获取最新的,直接从alexa的页面上抓取到的
不过如果alexa更改过页面布局或者类名的话,那可能要修改下对应的正则。下面就只发asp.net的了,asp基本一样,只需要修改url和正则部分就可以了
latestalexa.ashx <%@ WebHandler Language="C#" Class="alexa" %>
using System;
using System.Web;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
public class alexa : IHttpHandler {
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
string u = (context.Request.Form["u"] + "").Trim(), rank = "NaN";
if (u != "")
{
WebClient wc = new WebClient();
string xmlString = wc.DownloadString("http://www.alexa.com/siteinfo/"+u);
wc.Dispose();
Match m = Regex.Match(xmlString, "<div class=/"data//s+up/">([//d,]+)"
, RegexOptions.IgnoreCase | RegexOptions.Compiled);
if (m.Groups[1].Value != "") rank = m.Groups[1].Value;
}
context.Response.Write(rank);
}
public bool IsReusable {
get {
return false;
}
}
}