首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 實作 Google PageRank 查詢:演算法原理與完整程式碼

     編輯:PHP 相關知識

PageRank 簡介

PageRank (PR) 是 Google 早期核心演算法,評估網頁重要性 (0-10 級)。雖 Google 2016 年停止公開 Toolbar PR,但演算法邏輯仍具參考價值。

核心演算法:Google Checksum (GCH)

Google 使用特殊雜湊函數生成查詢參數 `ch`,PHP 移植版:

<?php
define('GMAG', 0xE6359A60);

function zeroFill($a, $b) {
    $z = 0x80000000;
    if ($z & $a) {
        $a = ($a >> 1) & (~$z);
        $a |= 0x40000000;
        $a = $a >> ($b - 1);
    } else {
        $a = $a >> $b;
    }
    return $a;
}

function mix(&$a, &$b, &$c) {
    $a -= $b; $a -= $c; $a ^= zeroFill($c, 13);
    $b -= $c; $b -= $a; $b ^= ($a << 8);
    $c -= $a; $c -= $b; $c ^= zeroFill($b, 13);
    $a -= $b; $a -= $c; $a ^= zeroFill($c, 12);
    $b -= $c; $b -= $a; $b ^= ($a << 16);
    $c -= $a; $c -= $b; $c ^= zeroFill($b, 5);
    $a -= $b; $a -= $c; $a ^= zeroFill($c, 3);
    $b -= $c; $b -= $a; $b ^= ($a << 10);
    $c -= $a; $c -= $b; $c ^= zeroFill($b, 15);
}

function GCH($url, $length = null, $init = GMAG) {
    if (is_null($length)) $length = count($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($a, $b, $c);
        $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($a, $b, $c);
    return $c;
}

function strord($string) {
    $result = [];
    for ($i = 0; $i < strlen($string); $i++) $result[] = ord($string[$i]);
    return $result;
}

function getPR($url) {
    $queryUrl = 'info:' . $url;
    $ch = GCH(strord($queryUrl));
    $encodedUrl = 'info:' . urlencode($url);
    $apiUrl = "https://www.google.com/search?client=navclient-auto&ch=6{$ch}&ie=UTF-8&oe=UTF-8&features=Rank&q={$encodedUrl}";
    
    $response = @file_get_contents($apiUrl);
    if ($response === false) return 'N/A';
    
    // 回應格式: Rank_1_1:5
    if (preg_match('/Rank_\d+_\d+:(\d+)/', $response, $matches)) {
        return (int)$matches[1];
    }
    return 'N/A';
}

// 使用範例
echo "PR 值: " . getPR('https://www.example.com');
?>

注意事項與限制

  1. Google 已關閉公開 API:上述端點可能失效、回傳 403/404
  2. IP 限制:頻繁查詢會被封鎖,需使用 Proxy 池
  3. PR 值已非即時:最後公開更新 2013 年,現代 SEO 參考指標為 DA/PA (Moz)、DR/UR (Ahrefs)、TF/CF (Majestic)
  4. 法律風險:自動化查詢可能違反 Google ToS

現代替代方案

  • 使用第三方 API:Mozscape, Ahrefs, Majestic, DataForSEO (付費)
  • 自建爬蟲計算類 PageRank:基於連結圖譜迭代計算
  • 關注 Core Web Vitals、E-E-A-T 等現代排名因子

教學價值

此程式碼展示:

  • 位元運算在雜湊函數中的應用
  • 無號右移在 PHP 中的模擬 (`zeroFill`)
  • 網路請求與回應解析
  • 逆向工程演算法移植技巧
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved