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”可能找不到,因为单词之间有多个空格,无法匹配),找到排名数据的附近,往后看,可以看到以下类似的字符串:

    <!–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=”ca53″>61</span>5<span class=”c34d”>57</span>,<span class=”c8a7″>78</span><span class=”c1db”>35</span>4</span><!– google_ad_section_end(name=default) –>

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

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

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

    而秘密其实就包含在 http://client.alexa.com/common/css/scramble.css 样式表文件中。打开该文件,可以看到以下 189 个 CSS 类的定义:

    .c11e {
    display: none
    }
    .c125 {
    display: none
    }
    .c12d {
    display: none
    }
    ……
    ……
    .cfe9 {
    display: none
    }

    混淆字符串中以<span class=”xxxx”>……<span>包含的“xxxx”都是在这里定义的!真实字符<span class=”yyyy”>……<span>的样式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 来实现。

    编程过程简述:

    观察源文件,发现段落:
    <!–Did you know? Alexa offers this data programmatically.  Visit http://aws.amazon.com/awis for more information about the Alexa Web Information Service.–>
    在源文件中是第一次出现的。排名信息就包含在它与
    <!– google_ad_section_end(name=default) –>
    之间。这为编程提供了便利。我们可以根据这个特征首先把最有用的信息挖出来,以缩小范围,为精细编程提供基础。这个是用getBody()函数实现的,实际采用的特征字符串是“Information Service.–>”和“<!– google_ad_section_end(name=default) –>”,抽取它们之间的字符串即可。

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

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

    Percent of global Internet users who visit this site
    <td><!–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=”cded”>10</span>0<span class=”cd83″>.0</span>00<span class=”cd81″>18</span>%
    </td>

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

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

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

    附件:

    Index.php文件:

      <form name=”alexaform” method=”post” action=”get_alexa.php”>
       输入网址:<input type=”text” name=”url” value=”http://www.why100000.com” size=40>
        <input type=”submit” value=”查 询”>
      </form>

    get_alexa.php文件:

    <?php
    //PHP版本要求:PHP 4.4.7
    //支持原创,请保留该处注释:
    //作者:张庆(网眼)陕西-西安
    //网站地址:
    //电脑学习网:http://www.why100000.com
    //《博客》:http://blog.why100000.com
    //《问吧!》http://ask.why100000.com
    //演示地址:http://www.why100000.com/test/alexa
    //代码下载地址:http://www.why100000.com/test /alexa/alexa.rar

      $url = $_POST[’url’];

      if($url!=”")
      {
       echo “您的网站 “. $url .” 在 ALEXA 的排名为:<br>”;
       $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.–>’, ‘<!– google_ad_section_end(name=default) –>’);
        echo ‘<xmp>’;
        echo $rankContent;
        echo ‘</xmp>’;
        $arrSpanClass = getArray($rankContent, ‘<span class=”‘, ‘”>’);
        echo ‘<xmp>’;
        print_r($arrSpanClass);
        echo ‘</xmp>’;
        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 ‘<xmp>’;
        echo $rankContent;
        echo ‘</xmp>’;
        }
        $rankContent = str_replace(’</span>’, ”, $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<count($arr[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 = ‘/<’ . $TagName . ‘([^>])*(’ . $includestr . ‘){1,}([^>])*>/i’;
            $ContentStr = preg_replace($Pattern, ”, $ContentStr);
            break;
   
          case 2:
            $Pattern = ‘/<’ . $TagName . ‘([^>])*(’ . $includestr . ‘){1,}([^>])*>.*?<\/’ . $TagName . ‘([^>])*>/i’;
            $ContentStr = preg_replace($Pattern, ”, $ContentStr);
           break;

          case 3:
          $Pattern = ‘/<’ . $TagName . ‘([^>])*(’ . $includestr . ‘){1,}([^>])*>/i’;
            $ContentStr = preg_replace($Pattern, ”, $ContentStr);
            $Pattern = ‘/<\/’ . $TagName . ‘([^>])*>/i’;
            $ContentStr = preg_replace($Pattern, ”, $ContentStr);
            break;

          default:
            echo ‘error’;
        }
        return $ContentStr;
      }
    ?>











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

相关文章
|
3月前
|
前端开发 关系型数据库 MySQL
PHP外链网盘系统网站源码
> 本文将详细介绍如何从零构建一个基于PHP和MySQL的文件管理系统,分解项目代码并剖析每个模块的功能。我们将以`index.php`、`config.php`和`api.php`这三个核心文件为例,详细展示如何设计文件列表、数据库配置和文件上传接口,从而实现一个完整的文件管理系统。该文章可以作为学术研究和代码实现的参考。
238 98
|
2月前
|
关系型数据库 MySQL PHP
免登录游客卡密发放系统PHP网站源码
这是一个简单易用的卡密验证系统,主要功能包括: 卡密管理和验证,多模板支持,响应式设计,验证码保护,防刷机制,简洁的用户界面, 支持自定义模板,移动端优化,安全性保护,易于部署和维护。
219 77
|
1月前
|
PHP
2025简约的打赏系统PHP网站源码
2025简约的打赏系统PHP网站源码
55 20
|
3月前
|
Linux PHP 数据安全/隐私保护
2024授权加密系统PHP网站源码
2024授权加密系统PHP网站源码
143 58
|
4月前
|
关系型数据库 MySQL PHP
PHP与MySQL的无缝集成:构建动态网站的艺术####
本文将深入探讨PHP与MySQL如何携手合作,为开发者提供一套强大的工具集,以构建高效、动态且用户友好的网站。不同于传统的摘要概述,本文将以一个生动的案例引入,逐步揭示两者结合的魅力所在,最终展示如何通过简单几步实现数据驱动的Web应用开发。 ####
|
4月前
|
SQL 前端开发 PHP
如何使用PHP开发一个购物网站?
在数字化时代,线上购物日益重要。本文介绍如何使用PHP开发一个功能完善、用户友好的购物网站,涵盖需求分析、开发环境选择、数据库设计、前后端开发、用户认证、商品展示、购物车、订单管理、功能扩展及安全性能优化等环节,旨在提供全面的开发指南。
82 3
|
4月前
|
PHP
20241125易支付PHP网站源码
PHP74,上传源码后解压访问域名/install 进行安装 安装完成 之后一定要设置伪静态 源码里面nginx.txt 就是伪静态 然后复制粘贴到伪静态里面保存即可
95 2
|
4月前
|
关系型数据库 MySQL PHP
骗子曝光系统网站PHP源码
骗子曝光系统网站PHP源码 PHP 7.0+ Mysql 5.6+ 上传访问域名/install安装
109 2
|
4月前
|
自然语言处理 安全 PHP
深入浅出PHP编程:从基础到实战
【10月更文挑战第36天】本文将带你走进PHP的奇妙世界,无论你是初学者还是有一定经验的开发者,都将从中获益。文章首先介绍PHP的基础概念和语法,然后通过实际代码示例,展示如何利用PHP进行高效的Web开发。最后,我们将探讨一些高级主题,如面向对象编程、数据库操作以及安全性问题。让我们一起开启PHP的学习之旅吧!
|
4月前
|
关系型数据库 MySQL PHP
PHP与MySQL的深度整合:构建高效动态网站####
在当今这个数据驱动的时代,掌握如何高效地从数据库中检索和操作数据是至关重要的。本文将深入探讨PHP与MySQL的深度整合方法,揭示它们如何协同工作以优化数据处理流程,提升网站性能和用户体验。我们将通过实例分析、技巧分享和最佳实践指导,帮助你构建出既高效又可靠的动态网站。无论你是初学者还是有经验的开发者,都能从中获得宝贵的见解和实用的技能。 ####
52 0