Monthly Archives: May 2008

读取网站的Alexa排名/Get Alexa ranking data for your site

南卓铜(Zhuotong Nan, [email protected])

由于网站自己设置的网站访问数有时不真实,为了比较网站的访问量,我们一般使用权威的第三方网站来比较访问量。Alexa网站提供被大家认可的排名数据。比如,访问http://www.alexa.com/data/details/traffic_details/westdc.westgis.ac.cn,可以看到“西部数据中心”目前排名访问。

Alexa提供了收费的Web service允许大家使用其数据,大概是每1000次请求0.15美金(见这里)。收费并不高,而且包括众多的功能。

然而作为程序员,有时候宁愿挑战一下自己的能力。比如有没有一种免费而且合法的手段来获取它的排名数据,比如Westdc.westgis.ac.cn目前排名1,080,823里的这个名次(May 06 2008)。

Alexa为了挣钱,使用了一些方法来防止简单的页面数据获取。比如我们看排名的HTML片断:

<span class=”descBold”> &nbsp;<!–Did you know? Alexa offers this data programmatically.  Visit http://aws.amazon.com/awis for more information about the Alexa Web Information Service.–><span class=”c669″>1,</span><span class=”cbf1″>34</span>0<span class=”cd05″>80</span><span class=”c9d1″>,8</span><span class=”c2e8″>23</span></span>

直接从Web页面拷贝的结果是1,34080,823,而不是正确的1,080,823。这是因为Alexa增加了一些<span>标签来混淆HTML代码,这些<span>的CSS被设置成display:none,所以在浏览器里显示却是正确的。而且这些混淆的<span>标签是随机任何组合的。

解决方案可以从模拟浏览器显示出发,逐步剥离没用的信息,最终获取排名数字。

a. 获取整个HTML源代码;分析获取源代码中有关排名的HTML片断;
b. 下载干扰的CSS表,取得display属性为none的全部css类名;
c. 利用css类名列表,从HTML片断中移去对应的<span>标签和标签内的数字;
d. 移去剩余的HTML标签;
e. 转成数值输出。

以下代码演示了此方法,使用了c# 2.0,在Visual Studio 2005编译运行通过。代码里使用了正则表达式。

/* Purpose: to get Alexa ranking data by using c#
* Author: Zhuotong Nan ([email protected])
* Date: May 06 2008
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace wml.stat
{
class AlexaRanking
{
public static int Rank(string url)
{
int ret = -1;

Uri uri = new Uri(url);
string newUrl = “http://www.alexa.com/data/details/traffic_details/” + uri.Host;
System.Net.WebClient wc = new System.Net.WebClient();
string html=wc.DownloadString(newUrl);

//pattern for obtaining html codes in relation to ranking data
string htmlpattern = @” about the Alexa Web Information Service.–>(.+?)</span><!–“;
string snipet = Regex.Match(html, htmlpattern).Groups[1].Value;

//get css file which store css classes preventing from scrambling
string cssUrl = “http://client.alexa.com/common/css/scramble.css”;
string cssfile = wc.DownloadString(cssUrl);

//css class pattern for getting CSS class listing with no display to the browse
string cssclassPattern=@”.(.*?) {“;
MatchCollection cssmc = Regex.Matches(cssfile, cssclassPattern);
//css classes without display, forming reg patterns
List<string> css_nodisp_patterns = new List<string>();
foreach (Match m in cssmc)
{
css_nodisp_patterns.Add( “<span class=”” + m.Groups[1].Value
+””>.*?</span>”);
}
//remove those classes from html snippet
foreach (string p in css_nodisp_patterns)
{
snipet=Regex.Replace(snipet, p, “”);
}

//see html snippet left
//remove span tags
string tagPattern = “<[^>]*>”;
snipet=Regex.Replace(snipet, tagPattern, “”);

ret = Int32.Parse(snipet, System.Globalization.NumberStyles.AllowThousands);
return ret;
}

static void Main(string[] args)
{
AlexaRanking.Rank(“http://westdc.westgis.ac.cn”);
}
}
}

本文独立实现,但后来google发现有人利用了差不多的方法,只不过在实现上用了PHP,最终产生的结果稍有不同,见 http://plice.net/?p=10

爱,是要表达的

上午跟一个朋友讲家里情况。才想起又是很长时间没给家里打电话了。

每次打过去,我爸接的一般都很快转到我妈手里。我一般只会说,妈,都好着吧?你跟爸的身体都好着吧?她就说,都好都好。然后再问问朵朵的情况,接着说电话费贵,不说了,接着挂掉。前后一般不到3分钟。

我爸妈从不将家里发生的事讲给我听。比如我妈跟我弟吵架,都是从我堂妹或表妹那知晓的。当打回去的时候,问及这些事,总是讲没事,小事,已经过去了。也许真是没事小事,但我知道其实他们有时候是很渴望有人听他们讲。这人不是我。他们总是怕我在外面担心他们的事情——所以从来不跟我讲。

而我过的总是很平淡的生活。科研的事情是没法跟他们讲的,他们搞不清楚。讲到最后,一般他们很茫然的问,那今年挣了多少钱?温州人的思维都是将什么事情都要换算成钱来衡量做事是否值得。自从有了朵朵,情况稍有改善,因为多了朵朵的话题。

所以听到孩子妈妈给她家里打电话,总是有说不尽的话,感觉特是羡慕。也许女孩这点天生比男孩强,女儿跟父母会比较亲昵一些。

有时候想起来给家里挂个电话,但想想没啥话讲,摇摇头作罢。所以发展到现在,除非有什么事情,比如买房子要向他们借款,再比如出国了,才能给家里打个电话,顺便问候一下老人的身体情况——尽管毫无例外他们会告诉我,都好。

以前有时候看电视小说,看到亲人团聚,双方都不吝表达他们的亲情。大学时尝试学学他们,跟妈妈说几句爱她的话,鼓起勇气。妈听了呵呵的说,问我,你是不是读书读傻了?从此,我没敢尝试。父母那辈不会说爱儿女,听着儿女说爱他们也会怪怪的感觉肉麻。虽然他们无时无刻不牵挂着在外的儿子。

也许等朵朵长大,可以大方的跟我和她妈妈说,爸妈我爱你们。

我跟朋友说,我是爱他们的,他们明白。朋友说,那也是需要表达的。

所以决定今天还是打个电话回去报告一下我在这边的生活吧——因为朵朵和她妈妈回兰州了,也算个大事了。

爱国

韩国逮捕了一名21岁的中国留学生,起因是这名留学生在奥运圣火传递期间的集会上暴力攻击韩国民众。我没看到攻击的图片,但我同事告诉说打的头破血流,很是血腥。中国外交部发言人此前就韩国声明要严惩此次集会中的暴力行为发言说,中国留学生只是为了保卫圣火,请韩国考虑实际情况。

这些被逮捕或者将被逮捕的留学生面临的韩国法律的惩罚,可能导致驱逐出境。这后果估计是这些学生事先没有想到的。我不知道这位被逮捕的学生现在是怎么想,会怨恨国家没出面救他吗?

由于奥运会,大家爱国热情大涨,这本是好事,我感觉也是政府在努力倡导的。有了凝聚力是好事前提是爱国得用到合法的事情上去。如果借爱国的名义干违反法律的事情,或者扰乱正常的社会和经济秩序,不管在国内还是国外,估计都是被禁止的。事实上对中国的形象也不见得是好事情。有这样一句话,我可以不赞同你的观点,但坚决悍卫你说话的权利。民主社会里你有集会的权力,同时也赋予别人有不同声音的权力。暴力是不对的。

我并不为留学生感到惋惜。然而,外交部发言人不痛不痒的发言也许是种外交辞令,但总让我不是很开心。但凡说话示弱的只有三种情况,有求于人,有把柄示于人,或者人格或国格的缺失。外国人在国内处在大老爷的位置就很不正常,政府是要代表自己民众的利益。胶济铁路事故后,几个法国人受了轻伤但被迅速转移到北京协和医院,铁道路副部长还亲自去看望,而且全免治疗费,弄的几个法国人很惊讶,说想不到,他们在淄博医院已经受到很好的治疗。然而不和谐的是,有报道指出由于床位紧张,一些中国伤员得不到很好的休养,要转院却面临医院不接收的问题。类似例子比比皆是,外国人可以在中国的土地上恣意妄为,处在高级公民的位置,有时候让外国人自己也惊讶。韩国人在国内也是乱来惯了,作为表达中国的一种态度,我更希望政府就逮捕几个违法的韩国人也赶了出去,未必不是种强势的外交手段。

离别

时间好快。才记得过去机场接她们过来的时候,又到了离别的时间。上午将两位lady送到了机场。有点不大敢回家了,怕面对空荡荡的房间。有时候烦朵朵的不听话或者缠人,但其实如果没有她的声音会少掉好多的乐趣。

然而为了生活总得放弃一些东西,不能总是在一起,好在剩余的时间也不很多了,盼望着5个月后回家再见她们了。

祝旅途一切都顺利了,当妈妈的只有辛苦着多担待一些了。