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

PHP 實作搜尋引擎蜘蛛爬蟲日誌記錄與分析

     編輯:PHP 相關知識

記錄搜尋引擎蜘蛛(Bot)的造訪行為,有助於 SEO 分析、伺服器負載監控與異常流量偵測。本文提供一個輕量級 PHP 實作,自動識別主流蜘蛛並記錄關鍵資訊至文字檔,適合中小型網站快速部署。

核心實作程式碼

<?php
/**
 * 記錄搜尋引擎蜘蛛造訪日誌
 * 建議放入網站公共引入檔(如 common.php、header.php)或使用 auto_prepend_file
 */
function log_spider_visit() {
    $userAgent = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
    $bot = null;

    // 主流蜘蛛特徵字串對照表(可自行擴充)
    $spiders = [
        'googlebot'         => 'Google',
        'mediapartners-google' => 'Google Adsense',
        'baiduspider'       => 'Baidu',
        'sogou spider'      => 'Sogou',
        'sogou web'         => 'Sogou Web',
        'sosospider'        => 'SOSO',
        '360spider'         => '360Spider',
        'yahoo'             => 'Yahoo',
        'msn'               => 'MSN',
        'msnbot'            => 'msnbot',
        'sohu'              => 'Sohu',
        'yodaobot'          => 'Yodao',
        'twiceler'          => 'Twiceler',
        'ia_archiver'       => 'Alexa',
        'iaarchiver'        => 'Alexa',
        'slurp'             => 'Yahoo Slurp',
        'bot'               => 'Other Bot', // 通用兜底
    ];

    foreach ($spiders as $pattern => $name) {
        if (strpos($userAgent, $pattern) !== false) {
            $bot = $name;
            break; // 找到第一個即停止
        }
    }

    if ($bot) {
        $logFile = __DIR__ . '/logs/spider.log'; // 建議放在非公開目錄
        $logLine = sprintf(
            "%s\t%s\t%s\t%s%s%s\n",
            date('Y-m-d H:i:s'),
            $_SERVER['REMOTE_ADDR'] ?? 'unknown',
            $bot,
            'https://',
            $_SERVER['HTTP_HOST'] ?? 'unknown',
            $_SERVER['REQUEST_URI'] ?? '/'
        );

        // 使用 LOCK_EX 避免並發寫入衝突
        file_put_contents($logFile, $logLine, FILE_APPEND | LOCK_EX);
    }
}

// 執行記錄
log_spider_visit();
?>

關鍵設計說明

1. User-Agent 比對策略

  • 採用 strpos() 而非正則,效能極佳。
  • 順序由專用到通用(bot 放最後),避免誤判。
  • 全部轉小寫比對,大小寫不敏感。

2. 日誌格式與儲存

  • 採用 Tab (\t) 分隔,易於匯入 Excel/資料庫分析。
  • 欄位:時間、客戶端 IP、蜘蛛名稱、完整請求 URL。
  • 使用 file_put_contents() + LOCK_EX,無需手動 fopen/fclose,原子寫入更安全。
  • 建議將日誌目錄設為 755、檔案 644,並置於網站根目錄外,防止被直接下載。

3. 效能與擴展考量

  • 高流量網站:文字檔寫入會成為瓶頸,建議改用 Redis/MQ 非同步寫入,或直接分析 Nginx/Apache 存取日誌。
  • 偽裝蜘蛛:惡意爬蟲常偽造 User-Agent。進階版可結合 IP 反查(如 whois、dig -x)驗證真偽。
  • 資料分析:定期將日誌導入資料庫(MySQL/ClickHouse),可製作蜘蛛造訪趨勢圖、抓取頻率統計、404 頁面追蹤等報表。

進階版:支援資料庫儲存與 IP 白名單驗證

<?php
class SpiderLogger {
    private $pdo;
    private $verifiedBots = [
        'Google' => ['googlebot.com', 'google.com'],
        'Baidu'  => ['baidu.com', 'baidu.jp'],
        'Bing'   => ['search.msn.com', 'msn.com'],
        // ... 可擴充
    ];

    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
    }

    public function log() {
        $ua = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
        $botName = $this->identify($ua);
        if (!$botName) return;

        $ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
        // 選擇性:驗證 IP 反解域名是否屬於官方蜘蛛
        $verified = $this->verifyIp($ip, $botName);

        $stmt = $this->pdo->prepare(
            "INSERT INTO spider_logs (visit_time, ip, bot_name, url, verified, user_agent)
             VALUES (NOW(), ?, ?, ?, ?, ?)"
        );
        $stmt->execute([
            $ip,
            $botName,
            'https://' . ($_SERVER['HTTP_HOST'] ?? '') . ($_SERVER['REQUEST_URI'] ?? '/'),
            $verified ? 1 : 0,
            $ua
        ]);
    }

    private function identify($ua) {
        $map = [
            'googlebot' => 'Google',
            'baiduspider' => 'Baidu',
            'bingbot' => 'Bing',
            'yandex' => 'Yandex',
            'slurp' => 'Yahoo',
            'duckduckbot' => 'DuckDuckGo',
            'bot' => 'Unknown Bot',
        ];
        foreach ($map as $pattern => $name) {
            if (strpos($ua, $pattern) !== false) return $name;
        }
        return null;
    }

    private function verifyIp($ip, $botName) {
        if (!isset($this->verifiedBots[$botName])) return false;
        $host = gethostbyaddr($ip);
        foreach ($this->verifiedBots[$botName] as $domain) {
            if (str_ends_with($host, $domain)) return true;
        }
        return false;
    }
}

// 使用範例
// $pdo = new PDO('mysql:host=localhost;dbname=seo', 'user', 'pass');
// $logger = new SpiderLogger($pdo);
// $logger->log();
?>

部署建議

  1. 將基本版加入專案公共引入檔,或在 php.ini 設定 auto_prepend_file 全站自動載入。
  2. 設定 cronjob 定期切割日誌檔(如每日一檔),避免單一檔案過大。
  3. 結合 logrotate(Linux)自動壓縮清理舊日誌。
  4. 若使用資料庫版,建議建立索引:INDEX idx_bot_time (bot_name, visit_time)、INDEX idx_ip (ip)。

透過持續記錄與分析蜘蛛日誌,你可以掌握搜尋引擎抓取節奏、發現爬蟲陷阱、優化網站結構,進而提升 SEO 效果與伺服器資源利用率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved