Averiguar el pagerank de Google de una página con PHP

El Pagerank de Google es un dato al que multitud de webmasters dan una gran importancia, debido a la influencia que tiene en el volumen de visitas que envía el buscador. Una opción habitual para obtener este dato, suele ser tener instalada la Toolbar de Google, donde se nos indica este pagerank para cada página que visitamos. Sin embargo, vamos a ver continuación otro mecanismo, independiente de la toolbar, y que nos permitirá obtener a nosotros mismos este pagerank mediante código PHP, y mostrarlo dentro de nuestras propias páginas, bien como la típica imagen, o como un comentario html, lo que más nos convenga.

Antes de nada, es importante tener en cuenta que este Pagerank que se va a obtener es el mismo que el que se muestra en la toolbar, y que según Google, es algo así como de “juguete”, ya que puede estar varios meses desfasado con el que ellos trabajan internamente, pese a lo cual, al ser la única información de la que disponemos, sigue siendo interesante.

El mecanismo mediante el que se obtiene el Pagerank se divide en dos fases. En una primera, debemos obtener un valor de checksum asociado a la url que queremos comprobar, y en una segunda, realizar una petición a una url concreta proporcionándole la url a comprobar y el checksum obtenido. Como resultado obtendremos un xml en el que figurará el valor del Pagerank de la página.

Para tratar de encapsular este comportamiento vamos a crear una clase PHP que nos exporte varios métodos, que nos permitirán obtener el checksum, la url de consulta a partir de la url de la página que se le indique, y un último método que realizará la comunicación con la url de consulta y nos devolverá el resultado de Pagerank.

En diversas páginas de internet se pueden encontrar diferentes algoritmos que permiten obtener el checksum, la parte más complicada del proceso, pero tras multitud de pruebas, me he encontrado con que la mayoría de ellos tienen problemas, bien debido a diferentes versiones de PHP, o diferentes arquitecturas, ya que las operaciones que se realizan son todas a nivel de bits. Tras mucho indagar finalmente he encontrado un método que me ha dado buenos resultados.

A continuación pongo la clase que encapsula el comportamiento.

<?php 
/**
* Google PageRank number for a URL
*
*  LICENCE
*  ========
*   copyright (c) 2000 Patxi Echarte [patxi@eslomas.com]
*
*   This program is free software; you can redistribute it and/or
*   modify it under the terms of the GNU Lesser General Public License
*   version 2.1 as published by the Free Software Foundation.
*
*   This library is distributed in the hope that it will be useful,
*   but WITHOUT ANY WARRANTY; without even the implied warranty of
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*   GNU Lesser General Public License for more details at 
*   http://www.gnu.org/copyleft/lgpl.html
* 
*   You should have received a copy of the GNU General Public License
*   along with this program; if not, write to the Free Software
*   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*
* @package GooglePageRank
* @version $Id: GooglePageRank.class.php,v 1.1 2010/06/16 $
* @author Patxi Echarte <patxi@eslomas.com>
*
* Version 1.1: se incorporan cambios proporcionados por Marco [http://tehwebmaster.blogspot.com]
*
*/
class GooglePageRank {
 
   var $_GOOGLE_MAGIC = 0xE6359A60;
 
   var $_url = '';
 
   var $_checksum = '';
 
    /**
   * Constructor
    *
    * @access public
    */
   function GooglePageRank($url)
   {
      $this->_url = $url;
   }
 
   function _strToNum($Str, $Check, $Magic)
   {
      $Int32Unit = 4294967296;  // 2^32
 
      $length = strlen($Str);
      for ($i = 0; $i < $length; $i++) {
         $Check *= $Magic;    
         //If the float is beyond the boundaries of integer (usually +/- 2.15e+9 = 2^31),
         //  the result of converting to integer is undefined
         //  refer to http://www.php.net/manual/en/language.types.integer.php
         //if (is_float($Check)) {
         if ($Check >= $Int32Unit) {
            $Check = ($Check - $Int32Unit * (int) ($Check / $Int32Unit));
            // - 2^31
            $Check = ($Check < -2147483647) ? ($Check + $Int32Unit) : $Check;
         }
         $Check += ord($Str{$i});
      }
      return $Check;
   }
 
   function _hashURL($String)
   {
      $Check1 = $this->_strToNum($String, 0x1505, 0x21);
      $Check2 = $this->_strToNum($String, 0, 0x1003F);
 
      $Check1 >>= 2;    
      $Check1 = (($Check1 >> 4) & 0x3FFFFC0 ) | ($Check1 & 0x3F);
      $Check1 = (($Check1 >> 4) & 0x3FFC00 ) | ($Check1 & 0x3FF);
      $Check1 = (($Check1 >> 4) & 0x3C000 ) | ($Check1 & 0x3FFF);   
 
      $T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) <<2 ) | ($Check2 & 0xF0F );
      $T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000 );
 
      return ($T1 | $T2);
   }
 
   function checksum()
   {
      if($this->_checksum != '') return $this->_checksum;
 
      $Hashnum = $this->_hashURL($this->_url);
 
      $CheckByte = 0;
      $Flag = 0;
 
      $HashStr = sprintf('%u', $Hashnum) ;
      $length = strlen($HashStr);
 
      for ($i = $length - 1;  $i >= 0;  $i --) {
         $Re = $HashStr{$i};
         if (1 == ($Flag % 2)) {
            $Re += $Re;
            $Re = (int)($Re / 10) + ($Re % 10);
         }
         $CheckByte += $Re;
         $Flag ++;   
      }
 
      $CheckByte %= 10;
      if (0 !== $CheckByte) {
         $CheckByte = 10 - $CheckByte;
         if (1 === ($Flag%2) ) {
            if (1 === ($CheckByte % 2)) {
               $CheckByte += 9;
            }
            $CheckByte >>= 1;
         }
      }
 
      $this->_checksum = '7'.$CheckByte.$HashStr;
      return $this->_checksum;
   }
 
   /**
   * obtiene la url donde obtener la información del pagerank
   * @access public
   */
   function pageRankUrl()
   {
      return 'http://toolbarqueries.google.com/search?client=navclient-auto&ch='
               .$this->checksum().'&q=info:'.$this->_url.'&features=Rank&num=100&filter=0';
   }
 
   /**
   * devuelve el pagerank para la url indicada o -1 si error
   * @access public
   */
   function getPageRank()
   {
      $fh = @fopen($this->pageRankUrl(), "r");
      if($fh)
      {
         $contenido = '';
         while (!feof($fh)) {
           $contenido .= fread($fh, 8192);
         }
         fclose($fh);
 
         list(,,$pr) = split(":", $contenido);
         if ($pr >= 0 and $pr <= 10) return $pr;
      }
      return -1;
   }
 
}
?>

Para utilizar la clase podríamos usar un código como el siguiente, por ejemplo para obtener, como comentario html, el PageRank de la página que se está mostrando.

include(dirname(__FILE__).'/GooglePageRank.class.php');
$url = 'http://www.eslomas.com'.$_SERVER['REQUEST_URI'];
 
$gpr =& new GooglePageRank($url);
 
echo "<!-- PAGERANK [".$gpr->pageRankUrl()."]: ".$gpr->getPageRank()." -->";

Por supuesto esta es solamente una opción y podríamos utilizar la clase para obtener el pagerank de cualquier página. Como posibles mejoras a la clase, se podría plantear la utilización de una caché para no tener que calcular continuamente los pagerank, la creación de un método que acepte una plantilla en la que se sustituya una cadena determinada por el pagerank, e incluso un método que aceptando una de estas plantillas realice el paso final de forma asíncrona desde el navegador del usuario con AJAX, liberando así recursos en el servidor.

Descargas

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

6 Respuestas para “Averiguar el pagerank de Google de una página con PHP”

  1. Como es posible que en alguna pagina como somos viajeros se hayan equivocado y suba el pagerank a 7 de la noche a la mañana, esto es una loteria?

  2. yo estoy buscan alguna pagina que me pueda indicar el pagerank en numeros decimales

  3. Yo lo que busco es una pagina que me diga rapidamente el pagerank de cada una de las páginas de mi blog (o de cualquier web). ¿Sabéis alguna?

    Con la herramienta que te puedes descargar en la página de exponsor se puede hacer, pero el problema es que no puedes hacer click en los resultados (es un programa flash), y es un poco lento ir escribiendo cada página en el navegador.

  4. le hice una pequeña modificacion al script para que funcione nuevamente ya que google ha cambiado algunas cosas:
    http://tehwebmaster.blogspot.com/2009/02/clase-php-para-calcular-pagerank.html

    saludos

  5. Para utilizar el pagerank a nuestro favor, primero debemos comprender que no es absoluto. Por suerte y por desgracia es relativo, como la teoria de einstein

  6. Gracias por la información, estuvo interesante.