+ -
当前位置:首页 → 问答吧 → PHP 编程获取网站的 Alexa 排名

PHP 编程获取网站的 Alexa 排名

时间:2008-09-18

来源:互联网

《PHPChina“美丽的代码”征集活动》投稿:PHP 编程获取网站的 Alexa 排名

编程需求及其原理:
    为了获取 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

本人有《代码之美》也就是《Beautiful Code》的英文版,Pdf文件,4M 多。谁需要,留下Email,发送给你。

作者: 西安PHPer   发布时间: 2008-09-18

《代码之美》是本好书啊。

作者: luzhou   发布时间: 2008-09-21

是本好书啊

作者: 125231896   发布时间: 2008-09-22

关注中

作者: gvtbs   发布时间: 2008-09-22

速度很慢,经常提示错误:【Get Data Error. Try Again.】

作者: 网鬼   发布时间: 2008-09-25

那是因为 alexa.com 很慢,“Get Data Error. Try Again”是正常容错。

作者: 西安PHPer   发布时间: 2008-09-26

网站 www.phpfans.net 的 Alexa 排名为:【44396】

作者: dxlhs3700   发布时间: 2008-09-27

你们都不知道这个吧:http://alexaicon.zzbaike.com/
虽然图标样式丑了点,但这个排名是能即时刷新的,挂在主页上还是不错的

作者: Ven   发布时间: 2008-09-27

楼主你傻了不是?就为了一个排名何必搞这么麻烦?alexa有免费的接口可用啊!

作者: Ven   发布时间: 2008-09-27

我对“免费”的不放心,谁知道什么时候就关了?这个是提供另一种解决方案,顺便教大家怎么扣网页上的东西,这也是信息“采集”的惯用伎俩。再一个,感觉偷来的东西更有价值哈。

作者: 西安PHPer   发布时间: 2008-09-27

支持`

作者: 额头客人   发布时间: 2008-10-07

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

《代码之美》我需要,麻烦你提供一份。谢谢了。

作者: skyfan   发布时间: 2008-10-24

OK:留下邮箱给你发。

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

关注下

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

作者: 西安PHPer   发布时间: 2008-10-31

beautiful code
I need
Email:[email protected]

作者: 早谷社区   发布时间: 2008-11-06

有没有中文版的《代码之美》

作者: hxphpchina   发布时间: 2008-11-07

谢谢楼主,学习中!~

作者: lanxuexing   发布时间: 2009-09-14

呵呵~~

作者: alei817927   发布时间: 2009-09-20

作者: mysuim   发布时间: 2009-10-12