Xpoint
   [напомнить пароль]

Page Rank: определение без парсинга официальных сайтов

Метки: [без меток]
2007-01-12 20:04:53 [обр] Top manager(0/2)[досье]
Как определить Page Rank любого сайта без парсинга официальных сайтов?
Все скрипты которые видел, основаны на парсинге каких либо официальных сайтов с сервисом Page Rank: попросту говоря, они "за человека" идут на сайт и смотрят, чкго там показал (официальный) сайт.
А есть ли способ, что бы просто зайти по урлу и всё, перед тобой просто цифра(?).
спустя 48 минут [обр] Евгений Петров(11/1055)[досье]
Если знаете алгоритм расчета PR - поделитесь.
спустя 11 часов [обр] Дмитрий Фитискин(0/3)[досье]
спустя 32 минуты [обр] Ярослав Витязев[досье]

Дмитрий Фитискин[досье], ваш скрипт (скрипт, ссылку на который вы дали) использует как раз официальный сайт Google $google_url=sprintf("http://www.google.com/search?client=navclient-auto&ch=6%u&features=Rank&q=".$url,$checksum); // url to get from google.

Top manager[досье], существует ряд сервисов, которые при помощи метода, описанного в ссылке Дмитрий Фитискин[досье] получают PR и возвращают XML или текстовое значение PR.

Даю код (PHP) из рабочего проекта (убедительная просьба нигде кроме этой ветки его не распространять).
Также, следует заметить, что этот код забирает значение PR из различных датацентров (следует знать, что в различных ДЦ в один и тот же момент времени для одинаковых URL могут содержаться различные значения PR, однако, этим можно пренебречь в большинстве случаев).

<?php
class IKE_Data_Directory_PageRankGrabber1 {

        function getPageRank($url) {
                $dcMax = 15;
                 $i = rand(1, $dcMax);
                 $url = "http://livepr.raketforskning.com/poll.html?u={$url}&nr={$i}";

                 $content = $this->getContent($url);

                if (!$content) { return -1; }

                if (preg_match("|<\s*tb\s*>(.*?)<\s*/tb\s*>|is", $content, $p)) {
                        $PR = preg_replace("|\\.\s+.*|s", "", $p[1]);
                }
                if (!isset($PR)) { return -1; }
                return intval($PR);
        }

        public function getContent($url) {
                $handle = @ fopen($url, "rb");

                if ($handle) {
                        $contents = '';
                        while (!feof($handle)) {
                                $contents .= fread($handle, 8192);
                        }
                        fclose($handle);
                        return $contents;
                } else {
                        return false;
                }
        }
}

Но это всего лишь прослойка, сам livepr работает аналогичным образом (генерирует GOOGLE_MAGIC и забирает значение с сервера). Возможно, вам следует просто использовать прокси через curl вкупе с классическим скриптом определения PageRank, но тут уже назревает другая проблема — поддержка актуального состояния списка работоспособных прокси-серверов.

спустя 22 часа [обр] Top manager(0/2)[досье]
Ярослав Витязев
вы парсите страницу с некоторым кодом, что уже само по себе не есть хорошо и стабильно.вопрос остается открытым: нужен ресурс который дает данные о ПР в статичном и универсальном формате, например XML. или код который дает ПР на прямую из гугла.
спустя 53 минуты [обр] Ярослав Витязев[досье]

Top manager[досье], поймите, что распространять подобную информацию не в интересах компании Google.

Код, приведенный Дмитрий Фитискин[досье] — это своеобразный хак. Если бы компания Google хотела бы, чтобы значения PR были бы общедоступными, был бы специальный сервис и не нужно было бы так ухищряться. Но, к сожалению, это не так.

Поэтому Вам придется либо использовать метод, описанный в ссылке Дмитрий Фитискин[досье], либо использовать сторонние сервисы, такие как livepr. Иначе никак.

спустя 21 час [обр] Top manager(0/2)[досье]

Ярослав Витязев[досье] :) спасибо :)

Спасибо всем. А также хочу сказать и извинится: я сознательно создал данную тему подняв вопрос о ПР. Мне хотелось узнать, изобрёл ли я "колесо" или нет. Под "колесом" понимается, способ 100% надёжный и простой получения ПР. Оказалось, что пока среди людей посетивших данный топик, не оказалось, кто бы знал такой способ.

Задавшись неделю назад этим вопросом, получения 100% надёжного и (в некотором смысле) "вечного" способа получения ПР, я вспомнил о тулбаре от гугла для FF. Декопелировав аддон, а потом снова декомпелировав там некоторые файлы и прочее,прочее,прочее. Это не интерестно. Выделил код который отвечает за получения ПР любой страницы. Не простая задача скажу я Вам... :)
А вот конечный код на JS. 100% работает. И он будет работать ещё не один год, т.к. если тама поменяется что либо, я про формат выводимых данных, то тулбар о гугла, сломается у всех кто его скачал, а это не в интересах гугла, так что они данный сервис трогать ещё не скоро будут. А значит он как минимум на годы :).

А вот и код. Может кто-то его модифицирует, может кто-то сделает на PHP. Не важно. Главно есть база :)

а вот код не получилось опубликовать здесь, система форума не корртно показывает код с символами < < < и > > >, т.к. думает что это очередное "начало/конец" экземпляра кода.
Он отражается здесь не верно, а вводить Вас в заблуждение я не хочут. Но могу отправить по мылу :). Скоро опубликую на своём сайте и дам урл на статейку :).

спустя 18 минут [обр] Top manager(0/2)[досье]
Ярослав Витязев[досье] я запустил Ваш скрипт. при обращении на сайт rabota.kz выводит результат -1
спустя 3 часа 7 минут [обр] Алексей В. Иванов(25/2861)[досье]
100% надёжный и простой получения ПР. Оказалось, что пока среди людей посетивших данный топик, не оказалось, кто бы знал такой способ.

Используйте поиск. Этот способ уже обсуждался и, если тему не удалили, он должен быть в архиве.

а вот код не получилось опубликовать здесь, система форума не корртно показывает код с символами < < < и > > >

Что неправильно отображает? Напишите багрепорт, если уверены, что что-то не так.

спустя 36 минут [обр] Ярослав Витязев[досье]

Top manager[досье], а у меня выводит "4": http://livepr.raketforskning.com/poll.html?u=http://rabota.kz&nr=1.

Возможные причины:

  1. проблемы на стороне livepr;
  2. невозможность получения контента сайта при помощи fopen/fread.

Код

$obj = new IKE_Data_Directory_PageRankGrabber1();
var_dump($obj->getPageRank('http://rabota.kz'));

возвращает как и следовало ожидать int(4). Возможно, вам стоит попробовать проделать то же самое через Curl, заменив метод getContent($url) на приведенный ниже:

   function getContentCurl($url, $mode = false) {
       $ch = curl_init();
   
       curl_setopt($ch, CURLOPT_URL, $url);
       curl_setopt($ch, CURLOPT_HEADER, 0);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
       if ($mode == 'WITHHEADERS' || $mode == 'HTTPCODE') {
           curl_setopt($ch, CURLOPT_HEADER, 1);
       }
          
       $result = curl_exec($ch);
       curl_close($ch);
       
       if ($mode == 'HTTPCODE') {
           $headersS = explode(" ", $result);
           return @$headersS[1];
       }
       
       return $result;
   }

спустя 19 часов [обр] Top manager(0/2)[досье]
Алексей В. Иванов[досье] об ошибке написал
Ярослав Витязев[досье] Да, Вы правы, по-поводу отстутствия "прямого" доступа к интернету. И это тоже некоторый минус, т.к. им не смогу воспользоватся люди у которых сетка закрыта, а если и смогу то с некторыми трудностями (придётся писать код работающий через прокси и прочие вещи, а это существенно усложнение системы)
спустя 3 часа 52 минуты [обр] Ярослав Витязев[досье]

Переписал JS-версию, любезно предоставленную Top manager[досье]. Теперь она доступна и на PHP.
Если вам необходим исходник, обращайтесь через встроенный пейджер.

Начало исходного файла:

<?php
/**
 * Google Page rank data grabber.
 * Based on Google toolbar data.
 * 
 * Working with data like that:
 * "Rank_1:1:4". Without XML/HTML parsing.
 * 
 * @version 1.0
 * @author xstb
 * 
 * @example usage:
 * $obj = new PageRankGrabber();
 * $rank = $obj->getRank('http://dir.org.ru');
 */
class PageRankGrabber {
[...]
спустя 1 час 45 минут [обр] Ярослав Витязев[досье]
This code is for cognitive purposes only.
 Usage of this code is against Google's terms of service.
 No support is provided for this code.
 Can be used "as is" for your own risk.
Документацию и исходный текст скрипта на PHP разместил здесь: http://static.ikernel.org/projects/standalone/PageRankGrabber/src-doc/.
спустя 25 минут [обр] Ярослав Витязев[досье]
То же самое, другими словами: http://forum.dklab.ru/viewtopic.php?p=126717#126717.
Обидно осознавать, но неделю назад читал эту ветку. Как я мог забыть про это сообщение? :(
В общем, напрасно потратил время.
спустя 12 часов [обр] Дмитрий Фитискин(0/3)[досье]
Почему то при переходе по url, который возвращает метод getRankUrlStingByPageUrl гугль выдает ошибку 403 Forbidden, и любезно предлагает ознкомиться с правилами использования сервиса.
спустя 4 часа 32 минуты [обр] Top manager(0/2)[досье]
Ярослав Витязев[досье] ты прав, код на http://forum.dklab.ru/viewtopic.php?p=126717#126717 тоже самое что и здесь :)
спустя 3 минуты [обр] Top manager(0/2)[досье]

Дмитрий Фитискин[досье] у тебя есть тама строка

var url = "http://toolbarqueries. ...

в это переменной не должно быть "пробела" - %20, если есть - убери. Это баг толи почтовика, толи броузера. Так и не выяснили до конца, появляется и всё... . А если убрать, то всё работает.

спустя 52 минуты [обр] Ярослав Витязев[досье]

Top manager[досье], там точно нет пробела, я это исправил еще в первой JS-версии, которая мне пришла, после этого данная ошибка не проявлялась.

$url  = "http://toolbarqueries.google.com/search?sourceid=" .
        "navclient-ff&features=Rank&client=navclient-auto-ff&";
$url .= "ch=" . $hash . "&q=info:" . urlencode($page);

Дмитрий Фитискин[досье], приведите, пожалуйста, результат метода getRankUrlStingByPageUrl, вызванного, например, таким образом:

$obj = new PageRankGrabber();
echo $obj->getRankUrlStingByPageUrl('вашУРЛ');
спустя 15 часов [обр] Дмитрий Фитискин(0/3)[досье]
http://toolbarqueries.google.com/search?sourceid=navclient-ff&features=Rank&client=navclient-auto-ff&ch=8cee5f4 c&q=info:http%3A%2F%2Fwww.yandex.ru%2F0
спустя 7 часов [обр] Ярослав Витязев[досье]

Дмитрий Фитискин[досье], спасибо, выявил две ошибки.

Пробел появлялся не по причине его наличия в самом исходном тексте в явном виде, он генерировался в методе awesomeHash, ненужные пробелы сейчас вырезаются при возвращении строки из метода.

Вторая ошибка: неверная работа метода toHex8($num), необходимо заменить метод на следующий:

    private function toHex8($num) {
        $vector = "0123456789abcdef";
        return $vector[($num % 256) / 16] . $vector[$num % 16];
    }

В ближайшее время обновлю документацию и исходный файл: http://static.ikernel.org/projects/standalone/PageRankGrabber/src-doc/.

спустя 1 день [обр] Top manager(0/2)[досье]
Ярослав Витязев[досье] - даже не знаю..., правильно ли это или нет. Просто это код 100% гугловский (просто переменные переименованы). Думаю они не просто так сделали... . Хотя, может FF под который этот код был заточен, работает на "ура"... :)
спустя 9 часов [обр] Дмитрий Фитискин(0/3)[досье]
Использую исправленную библиотеку, проблема попрежнему осталась:
http://toolbarqueries.google.com/search?sourceid=navclient-ff&features=Rank&client=navclient-auto-ff&ch=8cee5f40c&q=info:http%3A%2F%2Fwww.yandex.ru%2F
теперь в URL параметр ch без пробела, точнее вместо пробела стоит 0.
спустя 13 минут [обр] Дмитрий Фитискин(0/3)[досье]

Покопался в своих скриптах ... нашел рабочий вариант определение PR.

define('GOOGLE_MAGIC', 0xE6359A60);

...

    function GetPageRank($_host_name)
    {
        $_pr = 0;
        $_url = sprintf('info:%s', $_host_name);
        $_ch = iconv('cp1251', 'utf-8', $this->GoogleCH($this->PageRankStrOrd($_url)));
        $_ch = sprintf("6%u", $_ch);
        $_raw = $this->LoadPage('http://toolbarqueries.google.com/search?client=navclient-auto&ch='.$_ch.'&features=Rank&q='.$_url);
        $_pr_parts = explode(':', $_raw);
        if (isset($_pr_parts[2]))
        {
            $_pr = trim($_pr_parts[2]);
        }
        return $_pr;
    }

    function PageRankZeroFill($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 PageRankMix($a,$b,$c)
    {
         $a -= $b; $a -= $c; $a ^= ($this->PageRankZeroFill($c,13));
         $b -= $c; $b -= $a; $b ^= ($a<<8);
         $c -= $a; $c -= $b; $c ^= ($this->PageRankZeroFill($b,13));
         $a -= $b; $a -= $c; $a ^= ($this->PageRankZeroFill($c,12));
         $b -= $c; $b -= $a; $b ^= ($a<<16);
         $c -= $a; $c -= $b; $c ^= ($this->PageRankZeroFill($b,5));
         $a -= $b; $a -= $c; $a ^= ($this->PageRankZeroFill($c,3));
         $b -= $c; $b -= $a; $b ^= ($a<<10);
         $c -= $a; $c -= $b; $c ^= ($this->PageRankZeroFill($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 = $this->PageRankMix($a,$b,$c);
            $a = $mix[0]; $b = $mix[1]; $c = $mix[2];
            $k += 12;
            $len -= 12;
        }

        $c += $length;
        /* all the case statements fall through */
        switch($len)
        {
            case 11: $c+=($url[$k+10]<<24);
            case 10: $c+=($url[$k+9]<<16);
            case 9 : $c+=($url[$k+8]<<8);
            /* the first byte of c is reserved for the length */
            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]);
            /* case 0: nothing left to add */
        }
        $mix = $this->PageRankMix($a,$b,$c);
        return $mix[2];
    }

    /**
     * converts a string into an array of integers containing the numeric
     * value of the char
     */
    function PageRankStrOrd($string)
    {
        for($i=0;$i<strlen($string);$i++)
        {
            $result[$i] = ord($string{$i});
        }
        return $result;
    }

...

Я в свое время переписывал под свои нужды довольно распространенный скрипт. Это фрагмент класса, тут только часть касаемая PR. Метод LoadPage - просто возвращает содержимое страницы по указанному адресу (можно и на curl сделать).
Так вот суть тут все та же. Только реализация отличается. Ну и к тому же этот вариант у меня работает исправно.

спустя 1 час 48 минут [обр] Top manager(0/2)[досье]
Дмитрий Фитискин[досье] Ну мэн, я не знаю чё ты тама намутил в своём коде, может он и работает, я не спорю. Но то что алгоритм просто "дурной" (большой/длинный) - это однозначно. Я бы вообще удивился бы, если при таких объёмах он у тя не работал... .
Что же касается скрипта, которому посвящён данный топик (в том числе модифицированная версия от Ярослав Витязев[досье]), то тут проблема разрешаемая, я почти уверен, что решаемая, как говорят кодеры, в "один байт".
спустя 2 дня 6 часов [обр] Дмитрий Фитискин(0/3)[досье]
я этот код не писал, я только мог названия функций поменять ...
спустя 12 минут [обр] Дмитрий Фитискин(0/3)[досье]
... и уж извините что вторым сообщением, но
я взял по ссылке приведенной выше версию класса 1.1 от 18 января, результат тот же:
http://toolbarqueries.google.com/search?sourceid=navclient-ff&features=Rank&client=navclient-auto-ff&ch=8cee5f40c&q=info:http%3A%2F%2Fwww.yandex.ru%2F
раз уж проблема решена, то где можно взять рабочий код?
спустя 5 часов [обр] Top manager(0/2)[досье]
Дмитрий Фитискин[досье] тебе к Ярослав Витязев[досье] :)
спустя 10 часов [обр] Ярослав Витязев[досье]

Была опечатка в исходном коде (причем не опечатка, а, видимо, глюк моей версии phpDocumentor):

В 141 строке:
Рабочий код: $a |= 0x40000000;
Выложенный на сайте с документацией: $a |= 40000000;

Дмитрий Фитискин[досье], спасибо за обнаружение ошибки.

Обновил вручную документацию, располагается там же: http://static.ikernel.org/projects/standalone/PageRankGrabber/src-doc/.

спустя 6 месяцев [обр] Markus[досье]
Ярослав Витязев, доброго времени суток. Долго искал скрипт определения PR.
Скачал Ваш скрипт последнюю версию. Но при попытке определения PR получил 0.
Решил посмотреть что выдает метод getContentCurl($url) в итоге получил страницу Forbiden.
В чем может быть проблема? Уж очень нужен этот скрипт:)
спустя 5 дней [обр] Top manager(0/2)[досье]
Markus[досье] проблема уже обсуждалась, причина в некоректном формировании ссылки... :)
PS. А может и вообще сырвис изменили/закрыли.
спустя 1 день 10 часов [обр] Markus[досье]
Top manager[досье], я нашел другой скрипт. И скорее всего сервис действительно поменялся.
спустя 1 месяц 17 дней [обр] Евгений+[досье]
Cлишком уж нестабильные эти методы подсчета PR :)
спустя 8 часов [обр] Top manager(0/2)[досье]
Евгений[досье] чушь, метод взят из декомпилированого кода Google Toolbar. Один в один. Так что сервис не может поменяться, може тока реализация не быть достойно на "высоте". А если даже поменялся, что мешает снова декомпилировать, разложить и снова декомпилировать. И будут данные, как говориться, из первоисточников.
Powered by POEM™ Engine Copyright © 2002-2005