PHP 编程获取网站的 Alexa 排名
时间:2008-09-18
来源:互联网
编程需求及其原理:
为了获取 Alexa 的网站排名数据,提供网站排名服务。打算提取 Alexa.com 的查询结果页面数据,但是数据并不能简单、直接地得到,因为 Alexa 使用了干扰码技术,使得编程变得困难和繁琐。
但是从理论上讲,只要能在页面上看到的信息,除过图片识别现在还是个顶尖技术以外,文字信息都可能通过抓取页面得到源文件,再进行分析而得到具体的数据。本代码就是通过分析 Alexa 的查询结果,过滤掉干扰码。得到实际的数据。
例如,Alexa 的查询结果得到网站的排名是“557354”,但是得到相关的Html代码是:
<span class=”ca53″>61</span>5<span class=”c34d”>57</span>,<span class=”c8a7″>78</span><span class=”c1db”>35</span>4</span>
这是一串混杂了干扰码的数据,夹杂在<span>...</span>中的数字,通过样式表控制其可见或不可见,可见的是有用的数字,不可见的是干扰数字。
本例中,<span class=”ca53″>61</span>和<span class=”c8a7″>78</span>是干扰码。样式表类 .ca53 和 .c8a7 的定义是:
.ca53 {display: none}
.c8a7 {display: none}
所有干扰码的定义样式文件是:http://client.alexa.com/common/css/scramble.css。
我们编程的过程,就是:首先获取这一段Html代码,然后把干扰码<span>...</span>去除,最后得到真实的排名数据。
本段代码编程主要用了2个知识点,即网站Html代码的获取和正则表达式的正确运用。具体的编程原理请参考文章:http://blog.why100000.com/?p=272。
演示地址:http://www.why100000.com/test/alexa/alexa.php (由于alexa.com网站较慢,不能取到数据时,多试几次就可以了。)
测试的PHP版本:PHP 4.4.7,WindowsServere 2003,IIS6.0
代码自我评价:
可以完美满足当前需求。缺点是,如果将来 Alexa.com 网站改版,可能需要修改源代码。但是编程思想不变。
全部代码及其注释:
<?php
if (isset($_POST['url']))
{
$url = $_POST['url'];
if($url!="")
{
$rank = getAlexaRank($url);
}
}
?>
<Html>
<head>
<title>获取 Alexa 的排名 PHP 测试程序</title>
<style>
body {font-size:9pt; scrollbar-face-color:rgb(232,232,255); scrollbar-arrow-color:rgb(0,0,255)}
td {font-size:9pt}
</style>
</head>
<body>
<table width=500 align=center>
<tr height=30 valign=bottom>
<td align="center"><b>获取 Alexa 的排名 PHP 测试程序</b></td>
</tr>
<tr height=50>
<td align=center>
<form name="alexaform" method="post">
输入网址:<input type="text" name="url" value="<?php echo $url; ?>" size=28 title="Please enter a web address">
<input alt="Get Traffic Details" type="image" src="./images/button_traffic.gif">
</td></form>
</tr>
<tr height=50>
<td align="center">
<?php
if (isset($rank))
echo "网站 <b>". $url ."</b> 的 Alexa 排名为:【<b>$rank</b>】";
?>
</td>
</tr>
</table>
<?php
//主函数:
function getAlexaRank($weburl)
{
$weburl = strtolower($weburl);
$tempurl = getDomainUrl($weburl); //网站得到域名
$strAlexaCss = file_get_contents('http://client.alexa.com/common/css/scramble.css'); //得到干扰码样式表
$alexaRankQueryUrl = 'http://www.alexa.com/data/details/traffic_details/' . $tempurl; //构造查询排名的 Url 地址
$strAlexaContent = file_get_contents($alexaRankQueryUrl); //得到查询结果 Html 代码
//从以上Html代码中进一步得到包含干扰码和排名数据的 <span>...</span> 代码段
$rankContent = getBody($strAlexaContent, 'Information Service.-->', '<!-- google_ad_section_end(name=default) -->');
//echo "<xmp>$rankContent</xmp>"; //可以从这里看到<span>...</span> 代码段
$arrSpanClass = getArray($rankContent, '<span class="', '">'); //得到class后的所有样式表类,保存在数组中
if ($arrSpanClass!='')
{
foreach($arrSpanClass as $css) //遍历样式表类数组,
{
if (strpos($strAlexaCss, '.' . $css)>0) //如果是干扰码样式表类,删除<span class='...'>干扰数字串</span>
$rankContent = ScriptHtml($rankContent, "span", 2, $css);
else //不是干扰码样式表类,删除<span class='...'>(会留下“有用数字串”和“</span>”)
$rankContent = ScriptHtml($rankContent, "span", 1, $css);
}
$rankContent = str_replace('</span>', '', $rankContent); //去掉所有“</span>”字符串
$rankContent = str_replace(',', '', $rankContent); //去掉“,”字符串
return $rankContent; //最后得到正确的排名数字字符串
}
else
return 'No Data.';
}
//得到包含干扰码的<span>...</span>组成的 Html 代码段
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));
}
//得到class后的所有样式表类,保存在数组中
function getArray($ContentStr, $StartStr, $EndStr)
{
$reg = '/' . $StartStr . '.+?' . $EndStr . '/';
preg_match_all($reg, $ContentStr, $arr, PREG_PATTERN_ORDER);
for($i=0; $i<count($arr[0]); $i++)
{ //得到的数组元素包含 $StartStr 和 $EndStr 字符串,去掉它们:
$arr[0][$i] = str_replace($EndStr, '', str_replace($StartStr, '', $arr[0][$i]));
}
if (trim($arr[0])=='')
return '';
else
return $arr[0];
}
//去掉协议头“http://”和网址中的“/”等符号,得到网站域名
function getDomainUrl($url)
{
$tempUrl = str_replace('http://', '', $url);
$tempUrl = str_replace('/', '', $tempUrl);
return $tempUrl;
}
//把 $ContentStr 中匹配内容用空字符串替换
//本程序代码用来替换<span class='cssclass'>...</span>...字符串中的span标签为空,也就是删除
//$ContentStr:被操作的字符串
//$TagName:标签名
//$FType:替换的类型
//$includestr:包含的字符串
function ScriptHtml($ContentStr, $TagName, $FType, $includestr)
{
switch ($FType)
{
case 1: //删除匹配的<span class='cssclass'>
$Pattern = '/<' . $TagName . '([^>])*(' . $includestr . '){1,}([^>])*>/i';
$ContentStr = preg_replace($Pattern, '', $ContentStr);
break;
case 2: //删除匹配的<span class='cssclass'>...</span>
$Pattern = '/<' . $TagName . '([^>])*(' . $includestr . '){1,}([^>])*>.*?<\/' . $TagName . '([^>])*>/i';
$ContentStr = preg_replace($Pattern, '', $ContentStr);
break;
case 3: //删除匹配的<span class='cssclass'>和</span>,留下<span>...</span>中间内容
$Pattern = '/<' . $TagName . '([^>])*(' . $includestr . '){1,}([^>])*>/i';
$ContentStr = preg_replace($Pattern, '', $ContentStr);
$Pattern = '/<\/' . $TagName . '([^>])*>/i';
$ContentStr = preg_replace($Pattern, '', $ContentStr);
break;
default:
echo 'error';
}
return $ContentStr;
}
?>
作者:张庆(西安市)2008-9-18 1:29
参考文章:http://blog.why100000.com/?p=272
测试网址:http://www.why100000.com/test/alexa/alexa.php
或:http://why100000.com/test/alexa/alexa.php
作者: 西安PHPer 发布时间: 2008-09-18
楼主又对ALEXA的排名数据进行了详细讲解,真的非常感谢!
作者: RICHARD 发布时间: 2008-09-18


作者: 西安PHPer 发布时间: 2008-09-18
作者: luzhou 发布时间: 2008-09-21
作者: 125231896 发布时间: 2008-09-22

作者: gvtbs 发布时间: 2008-09-22
作者: 网鬼 发布时间: 2008-09-25
作者: 西安PHPer 发布时间: 2008-09-26

作者: dxlhs3700 发布时间: 2008-09-27
虽然图标样式丑了点,但这个排名是能即时刷新的,挂在主页上还是不错的
作者: Ven 发布时间: 2008-09-27
作者: Ven 发布时间: 2008-09-27
作者: 西安PHPer 发布时间: 2008-09-27
作者: 额头客人 发布时间: 2008-10-07

作者: 西安PHPer 发布时间: 2008-10-12
作者: skyfan 发布时间: 2008-10-24
作者: 西安PHPer 发布时间: 2008-10-28

作者: 妖夜荒踪 发布时间: 2008-10-30



作者: 西安PHPer 发布时间: 2008-10-31
作者: 早谷社区 发布时间: 2008-11-06
作者: hxphpchina 发布时间: 2008-11-07
作者: lanxuexing 发布时间: 2009-09-14
作者: alei817927 发布时间: 2009-09-20
作者: mysuim 发布时间: 2009-10-12
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28