php获取排行榜,PHP 编程获取网站的 Alexa 排名

现在大多数提供网站排名的网站,其数据都是取自于 Alexa 发布的数据。但是 Alexa 的网站排名数据并不能简单、直接地得到,这是因为 Alexa 使用了干扰码技术,使得编程变得困难和繁琐。

但是从理论上讲,只要能在页面上看到的信息,除过图片识别现在还是个顶尖技术以外,文字信息都可能通过抓取页面得到源文件,再进行分析而得到具体的数据。

我们先分析一下“电脑学习网” http://www.why100000.com 在 http://www.alexa.com 查询排名时得到的数据:在 http://www.alexa.com 页面输入网址 http://www.why100000.com,点击按钮“Get traffic Detail”。页面下载完毕后,查看源文件,搜索字符串“traffic rank”(搜索“Why100000.com has a traffic rank”可能找不到,因为单词之间有多个空格,无法匹配),找到排名数据的附近,往后看,可以看到以下类似的字符串:

61557,78354

之所以强调“类似”,是因为每次看到的信息一般都不完全相同,Alexa说了,是“programmatically”产生的这些数据,已经通过编程对真实数据进行了干扰,虽然在页面上眼睛看到的是数字字串“557354”,但是即使在页面上“选择-复制-粘贴”,得到的却是字符串“61557,78354”(每次重新查询后差不多都是不相同的)。从上面的代码中也可以看到“61557,78354”的信息。

但是,如果仔细观察,就会看到,真正的排名数据“557354”是包含在“61557,78354”字符串中的,而实际上,它 “总是”包含在这个变化的字符串中的,多试几次就会看到!多试几次还会看到,真正的排名字符有时没有包含在61中,这让我们想到,干扰字符是通过包含在……中,使用class引用样式表“xxxx”来使其在页面隐含的。但是,有时排名真实数据的数字也包含在……中,那么该样式表应该不设置该字符(串)隐含。–这就是干扰算法的思想:在真实数据中插入页面上看不到的数字,不影响人眼观看,但对程序分析造成干扰,而且对部分可见字符有的也加上…标签,更进一步增加了程序分析的复杂度。

但是,既然浏览器看到了信息,其秘密应该就包含在源文件之中,而且一般和 Javascript、CSS 引用都可能有关系。按照这个思路,我们把源文件相关的Javascript 脚本、CSS 脚本都下载下来进行分析。

.c11e {

display: none

}

.c125 {

display: none

}

.c12d {

display: none

}

……

……

.cfe9 {

display: none

}

混淆字符串中以……包含的“xxxx”都是在这里定义的!真实字符……的样式yyyy可能是随机产生的,但肯定不会和这189个定义相同。

到此真相大白。我们可以通过编写程序来获得该真实排名数据了。

我们可以编写桌面程序,比如用 Delphi、C# 等编写Windows桌面程序,这个需要用到 Internet Browser 组件,来获取

http://www.alexa.com/data/details/traffic_details/why100000.com

的页面源文件,然后进行分析,最终保存到数据库中。

也可以在网页中通过Javascript脚本操作页面文档来获取该数据。这个需要对javascript很熟悉。但要把数据保存到后台数据库中,一般需要手工打开页面来操作。

也可以通过网站后台编程来实现,需要后台编程语言有后台获取网页源文件的能力,这个用Java、ASP.NET、PHP等语言都能实现。

以上所有编程过程,都需要编程语言或脚本有很强的字符串分析和处理能力,常见的就是使用正则表达式,一般流行的语言都支持。

我选用现在很流行的 Web 编程语言 PHP 来实现。

编程过程简述:

观察源文件,发现段落:

在源文件中是第一次出现的。排名信息就包含在它与

之间。这为编程提供了便利。我们可以根据这个特征首先把最有用的信息挖出来,以缩小范围,为精细编程提供基础。这个是用getBody()函数实现的,实际采用的特征字符串是“Information Service.–>”和“”,抽取它们之间的字符串即可。

getAlexaRank是主函数。其他函数通过获取……中的样式表“zzzz”并存入数组,通过对数组的遍历,判断核心数据块内在数字(串)是该删除还是保留,最终产生出真实的数据。程序中充分发挥了PHP正则表达式和字符串处理函数的极大威力,使其比ASP等脚本代码短得多。

在Alexa查询结果中还有其他大量的数据可能也用得到,也可以通过本编程思想来设计和编写程序代码。比如抽取访问某站点的全球用户的比例,一周内的平均值,可以参考以下部位的代码:

Percent of global Internet users who visit this site

Visit http://aws.amazon.com/awis for more information about the Alexa Web Information Service.–>

100.00018%

方法还是寻找段落特征,取出部分的精细信息,再进行深入分析得到数据。

用该文的方法也可以编写网页信息采集程序,包括新闻、博客等等互联网上的大量文章。

但是,如果Alexa下次再修改算法,该方法就会失效了。

附件:

Index.php文件:

输入网址:

get_alexa.php文件:

$url = $_POST[’url’];

if($url!=”")

{

echo “您的网站 “. $url .” 在 ALEXA 的排名为:
”;

$rank = getAlexaRank($url);

echo ‘[’ . $rank .’]';

}

function getAlexaRank($weburl)

{

$weburl = strtolower($weburl);

$tempurl = getDomainUrl($weburl);

//读取http://client.alexa.com/common/css/scramble.css中的数据

$strAlexaCss = file_get_contents(’http://client.alexa.com/common/css/scramble.css’);

$alexaRankQueryUrl = ‘http://www.alexa.com/data/details/traffic_details/’ . $tempurl;

$strAlexaContent = file_get_contents($alexaRankQueryUrl);

$rankContent = getBody($strAlexaContent, ‘Information Service.–>’, ‘’);

echo ‘

’;

echo $rankContent;

echo ‘

’;

$arrSpanClass = getArray($rankContent, ‘’);

echo ‘

’;

print_r($arrSpanClass);

echo ‘

’;

foreach($arrSpanClass as $css)

{

//global $rankContent;

if (strpos($strAlexaCss, ‘.’ . $css)>0)

{

echo $css .’(h)’;

$rankContent = ScriptHtml($rankContent, “span”, 2, $css);

}

else

{

echo $css .’(s)’;

$rankContent = ScriptHtml($rankContent, “span”, 1, $css);

}

echo ‘

’;

echo $rankContent;

echo ‘

’;

}

$rankContent = str_replace(’’, ”, $rankContent);

$rankContent = str_replace(’,', ”, $rankContent);

return $rankContent;

}

function getBody($ContentStr, $StartStr, $EndStr)

{

$ContentStr = strtolower($ContentStr);

$StartStr = strtolower($StartStr);

$EndStr = strtolower($EndStr);

$StartPos = strpos($ContentStr, $StartStr);

$EndPos = strpos($ContentStr, $EndStr);

return substr($ContentStr, $StartPos+strlen($StartStr), $EndPos-$StartPos-strlen($StartStr));

}

function getArray($ContentStr, $StartStr, $EndStr)

{

$reg = ‘/’ . $StartStr . ‘.+?’ . $EndStr . ‘/’;

preg_match_all($reg, $ContentStr, $arr, PREG_PATTERN_ORDER);

for($i=0; $i

{

$arr[0][$i] = str_replace($EndStr, ”, str_replace($StartStr, ”, $arr[0][$i]));

}

return $arr[0];

}

function getDomainUrl($url)

{

$tempUrl = str_replace(’http://’, ”, $url);

$tempUrl = str_replace(’/', ”, $tempUrl);

return $tempUrl;

}

function ScriptHtml($ContentStr, $TagName, $FType, $includestr)

{

switch ($FType)

{

case 1:

$Pattern = ‘/])*(’ . $includestr . ‘){1,}([^>])*>/i’;

$ContentStr = preg_replace($Pattern, ”, $ContentStr);

break;

case 2:

$Pattern = ‘/])*(’ . $includestr . ‘){1,}([^>])*>.*?])*>/i’;

$ContentStr = preg_replace($Pattern, ”, $ContentStr);

break;

case 3:

$Pattern = ‘/])*(’ . $includestr . ‘){1,}([^>])*>/i’;

$ContentStr = preg_replace($Pattern, ”, $ContentStr);

$Pattern = ‘/])*>/i’;

$ContentStr = preg_replace($Pattern, ”, $ContentStr);

break;

default:

echo ‘error’;

}

return $ContentStr;

}

?>

本文转自网眼51CTO博客,原文链接:http://blog.51cto.com/itwatch/286475,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值