Porady i algorytmy

Obliczanie PageRank dla zadanej strony internetowej
Opublikowano 13.06.2008 r. w kategorii PHP.
Odsłon: 4019.

W niniejszym artykule przedstawię kod, dzięki któremu naszej witrynie dodamy funkcjonalność sprawdzanie wartości PageRank dla podanej witryny.

Wiele serwisów, takich mypagerank.pl, pagerank.4free.pl czy prchecker.info oferuje darmową możliwość sprawdzenia wartości PageRank (PR) własnej lub wybranej witryny. Umożliwiają one także umieszczenie wskaźnika PageRank na własnej stronie internetowej, dzięki czemu wartość tą możemy kontrolować praktycznie na bieżąco. Niezaprzeczalną zaletą korzystania z zewnętrznych skryptów jest fakt, iż w zasadzie nie musimy się o nic martwić - skrypt obliczający PR został już przygotowany, podobnie jak grafika służąca do reprezentowania wyniku. Wystarczą więc dwa kliknięcia myszką, Ctrl+C / Ctrl + V i wszystko hula jak należy :-) Jeszcze bardziej istotną kwestią jest to, czy serwer, na którym trzymamy stronę ma zainstalowaną obsługę PHP - w przypadku jej braku, w zasadzie nie mamy wyboru. Jednakże to co jest zaletą, może być również wadą - korzystając z usług innego serwisu musimy mieć świadomość, że w wypadku jego awarii dane te nie będą wyświetlane. Ponadto, jeśli serwer, na którym spoczywa skrypt jest mocno obciążony, spowolni to wczytywanie naszej witryny. Kolejnym minusem może być fakt, że przygotowane przez webmasterów grafiki wyświetlające PR po prostu nie będą pasować do kolorystyki naszej witryny.

W związku z powyższym, warto wziąć sprawy w swoje ręce i napisać skrypt sprawdzający wartość PageRank, dzięki czemu wszystkie powyższe niedogodności znikną jak ręką odjął. Niniejszy, znaleziony jakiś czas temu na jednym z for i nieco przeze mnie zmodyfikowany, sprawdza wartość PageRank dla zadanej strony internetowej.

<?php /* PHP Google PageRank Calculator Script Original author: pagerankscript@googlecommunity.com v. 1.0 Original Release. Author: GoogleCommunity.com v. 1.1 Some bug fixes, source code clean-up and reformatted. Author: Krzysztof Mortka, http://mortka.pl This code is released unto the public domain. */ error_reporting(0); define('GOOGLE_MAGIC', 0xE6359A60); // --------------------------------------------------------------- function ZeroFill($a, $b) { $z = hexdec(80000000); if ($z & $a) { $a = ($a >> 1); $a &= (~$z); $a |= 0x40000000; $a = ($a >> ($b - 1)); } else $a = ($a >> $b); return $a; } // --------------------------------------------------------------- function ToInt32(& $x) { $z = hexdec(80000000); $y = (int)$x; if ($y == -$z && $x <- $z) { $y = (int)((-1) * $x); $y = (-1) * $y; } $x = $y; } // --------------------------------------------------------------- function mix($a, $b, $c) { $a -= $b; $a -= $c; ToInt32($a); $a = (int)($a ^ (ZeroFill($c, 13))); $b -= $c; $b -= $a; ToInt32($b); $b = (int)($b ^ ($a << 8)); $c -= $a; $c -= $b; ToInt32($c); $c = (int)($c ^ (ZeroFill($b, 13))); $a -= $b; $a -= $c; ToInt32($a); $a = (int)($a ^ (zeroFill($c, 12))); $b -= $c; $b -= $a; ToInt32($b); $b = (int)($b ^ ($a << 16)); $c -= $a; $c -= $b; ToInt32($c); $c = (int)($c ^ (ZeroFill($b, 5))); $a -= $b; $a -= $c; ToInt32($a); $a = (int)($a ^ (ZeroFill($c, 3))); $b -= $c; $b -= $a; ToInt32($b); $b = (int)($b ^ ($a << 10)); $c -= $a; $c -= $b; ToInt32($c); $c = (int)($c ^ (ZeroFill($b, 15))); return array($a, $b, $c); } // --------------------------------------------------------------- function GoogleCH($url, $length = null, $init = GOOGLE_MAGIC) { if (is_null($length)) $length = sizeof($url); $a = $b = 0x9E3779B9; $c = $init; $k = 0; $len = $length; while ($len >= 12) { $a += ($url[$k + 0] + ($url[$k + 1] << 8) + ($url[$k + 2] << 16) + ($url[$k + 3] << 24)); $b += ($url[$k + 4] + ($url[$k + 5] << 8) + ($url[$k + 6] << 16) + ($url[$k + 7] << 24)); $c += ($url[$k + 8] + ($url[$k + 9] << 8) + ($url[$k + 10] << 16) + ($url[$k + 11] << 24)); $mix = mix($a, $b, $c); $a = $mix[0]; $b = $mix[1]; $c = $mix[2]; $k += 12; $len -= 12; } $c += $length; switch ($len) { case 11: $c += ($url[$k + 10] << 24); case 10: $c += ($url[$k + 9] << 16); case 9 : $c += ($url[$k + 8] << 8); case 8 : $b += ($url[$k + 7] << 24); case 7 : $b += ($url[$k + 6] << 16); case 6 : $b += ($url[$k + 5] << 8); case 5 : $b += ($url[$k + 4]); case 4 : $a += ($url[$k + 3] << 24); case 3 : $a += ($url[$k + 2] << 16); case 2 : $a += ($url[$k + 1] << 8); case 1 : $a += ($url[$k + 0]); } $mix = mix($a, $b, $c); return $mix[2]; } // --------------------------------------------------------------- function strord($string) { for ($i = 0; $i < strlen($string); $i++) $result[$i] = ord($string{$i}); return $result; } // --------------------------------------------------------------- function ReadPR($link) { $fp = fsockopen("www.google.com", 80, $errno, $errstr, 30); if (!$fp) { return -1; // Błąd - nie udało się nawiązać połączenia exit (1); } else { $out = "GET $link HTTP/1.0\r\n"; $out .= "Host: toolbarqueries.google.com\r\n"; $out .= "User-Agent: Mozilla/4.0"; $out .= "(compatible; GoogleToolbar 2.0.114.9; Windows 5.2)\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); do { $line = fgets($fp, 128); } while ($line !== "\r\n"); $data = fread($fp, 8192); fclose ($fp); return $data; } } // --------------------------------------------------------------- function GetPageRank($url) { if (IsSet($_GET['url'])) { $PageRank = -1; $url = 'info:' . $url; $ch = GoogleCH(strord($url)); $data = "/search?client=navclient-auto&ch=6$ch&features=Rank&q=$url"; $data = ReadPR($data); $rankarray = explode(':', $data); $PageRank = trim($rankarray[2]); if (empty($PageRank) || !is_numeric($PageRank)) $PageRank = -1; // Nie przypisano jeszcze pozycji w rankingu return $PageRank; } else return -1; // Błąd - nie podano wymaganego parametru ($url) } // --------------------------------------------------------------- echo GetPageRank($_GET['url']); ?>

Teraz, aby odczytać wartość PR dla witryny wystarczy w kodzie strony wpisać:

include("http://twoj-serwer.pl/pagerank.php?url=http://mortka.pl"); lub korzystając z funkcji PHP fopen(): $PageRank = -2; $file = fopen('http://twoj-serwer.pl/pagerank.php?url=http://mortka.pl', 'r'); if ($file) $PageRank = fgets($file); echo "PageRank strony wynosi $PageRank"; fclose($file);

Należy pamiętać, że PageRank jest liczony dla każdej strony, a nie całej witryny. Szczegółowe informacje o technologii PageRank znajdują się na stronie Google Technology oraz w Wikipedii.

Serdecznie dziękuję Łukaszowi Czerwińskiemu za zgłoszenie błędu zawartego w artykule (nieprawidłowe wywołanie skryptu).