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

PHP 記錄搜尋引擎蜘蛛爬蟲日誌:Baidu、Google、Bing、Yahoo、Soso、Sogou、Yodao 完整識別與記錄

     編輯:PHP 相關知識

功能簡介

自動識別並記錄主流搜尋引擎蜘蛛(Baidu、Google、Bing、Yahoo、Soso、Sogou、Yodao)的爬取行為,包含訪問時間、蜘蛛名稱、User-Agent、Referer 頁面,生成文字日誌檔案,便於 SEO 分析與伺服器流量審計。

核心識別邏輯

基於 HTTP User-Agent 標頭關鍵字匹配:

完整實作程式碼

<?php
/**
 * 獲取搜尋引擎蜘蛛名稱
 * @return string|false 蜘蛛名稱或 false(非蜘蛛)
 */
function get_search_bot() {
    $user_agent = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
    
    $bots = [
        'googlebot'   => 'Google',
        'baiduspider' => 'Baidu',
        'msnbot'      => 'Bing',
        'slurp'       => 'Yahoo',
        'sosospider'  => 'Soso',
        'sogou spider'=> 'Sogou',
        'yodaobot'    => 'Yodao',
    ];
    
    foreach ($bots as $key => $name) {
        if (strpos($user_agent, $key) !== false) {
            return $name;
        }
    }
    return false;
}

/**
 * 格式化當前時間
 */
function now_time() {
    return date("Y-m-d.H:i:s");
}

// 主邏輯
$search_bot = get_search_bot();

if ($search_bot) {
    $this_page = addslashes($_SERVER['HTTP_USER_AGENT'] ?? '');
    $referer   = $_SERVER['HTTP_REFERER'] ?? 'direct';
    $log_file  = "spider_log_" . date("Y-m-d") . ".txt"; // 按日期分檔
    $time      = now_time();
    
    $log_entry = "Time:$time | Bot:$search_bot | UA:$this_page | Referer:$referer\n";
    
    // 追加寫入(鎖定檔案防併發衝突)
    $fp = fopen($log_file, 'a');
    if ($fp) {
        flock($fp, LOCK_EX);
        fwrite($fp, $log_entry);
        flock($fp, LOCK_UN);
        fclose($fp);
    }
}
?>

進階優化版:支援資料庫儲存、IP 反查、統計報表

<?php
class SpiderLogger {
    private $pdo;
    private $bot_patterns = [
        '/googlebot/i'       => 'Google',
        '/baiduspider/i'     => 'Baidu',
        '/bingbot/i'         => 'Bing',      // 現代 Bing 使用 bingbot
        '/msnbot/i'          => 'Bing',      // 兼容舊版
        '/slurp/i'           => 'Yahoo',
        '/sogou/i'           => 'Sogou',     // 更通用的匹配
        '/sosospider/i'      => 'Soso',
        '/yodaobot/i'        => 'Yodao',
        '/duckduckbot/i'     => 'DuckDuckGo',
        '/yandexbot/i'       => 'Yandex',
    ];
    
    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
        $this->init_table();
    }
    
    private function init_table() {
        $sql = "CREATE TABLE IF NOT EXISTS spider_logs (
            id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            spider_name VARCHAR(32) NOT NULL,
            ip VARCHAR(45) NOT NULL,
            user_agent TEXT NOT NULL,
            referer TEXT,
            request_uri VARCHAR(512),
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            INDEX idx_spider_time (spider_name, created_at),
            INDEX idx_ip (ip)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
        $this->pdo->exec($sql);
    }
    
    public function log() {
        $ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
        $spider = $this->identify($ua);
        
        if (!$spider) return false;
        
        $stmt = $this->pdo->prepare("
            INSERT INTO spider_logs (spider_name, ip, user_agent, referer, request_uri)
            VALUES (?, ?, ?, ?, ?)
        ");
        
        return $stmt->execute([
            $spider,
            $_SERVER['REMOTE_ADDR'] ?? '',
            $ua,
            $_SERVER['HTTP_REFERER'] ?? '',
            $_SERVER['REQUEST_URI'] ?? ''
        ]);
    }
    
    private function identify($ua) {
        foreach ($this->bot_patterns as $pattern => $name) {
            if (preg_match($pattern, $ua)) {
                return $name;
            }
        }
        return null;
    }
    
    // 統計查詢範例
    public function get_daily_stats($date) {
        $stmt = $this->pdo->prepare("
            SELECT spider_name, COUNT(*) as cnt 
            FROM spider_logs 
            WHERE DATE(created_at) = ? 
            GROUP BY spider_name
        ");
        $stmt->execute([$date]);
        return $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
    }
}

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

部署方式

  1. 獨立檔案包含法:將核心邏輯存為 spider_logger.php,在網站入口檔案(如 index.php、框架啟動檔)最頂端 require_once 'spider_logger.php';
  2. 框架中介層法:Laravel 中間件、ThinkPHP 行為、Symfony Event Subscriber、Yii Behavior
  3. Nginx/Apache 日誌分析法:更高效能,離線分析 access.log,無 PHP 額外開銷(推薦高流量站點)
  4. 日誌分析價值

搜尋引擎User-Agent 關鍵字識別名稱
GooglegooglebotGoogle
百度baiduspiderBaidu
必應msnbotBing
YahooslurpYahoo
搜搜sosospiderSoso
搜狗sogou spiderSogou
有道yodaobotYodao

注意事項與反偽裝

  • 偽造 User-Agent:惡意爬蟲常偽裝成 Googlebot。進階驗證:反向 DNS 解析 IP 確認屬於 googlebot.com、baidu.com 等官方網段
  • 效能影響:檔案寫入有磁碟 IO 開銷,高併發建議改用資料庫批次寫入或異步隊列
  • 日誌輪轉:按日/按大小分檔,定期清理舊日誌,避免磁碟佔滿
  • 隱私合規:IP 屬個人資料,遵守 GDPR/個資法,設定保留期限並匿名化

總結

蜘蛛日誌記錄是 SEO 技術審計的基礎數據來源。本文提供從簡單檔案記錄到企業級資料庫方案的完整實作,開發者可根據流量規模、分析需求選擇適合方案。核心關鍵在於:準確識別、高效儲存、持續分析、依數據優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
分析維度SEO 價值
蜘蛛來訪頻次/時間判斷網站被抓取活躍度,調整更新策略
抓取頁面類型分佈發現重要頁面未被抓取、無價值頁面被過度抓取
HTTP 狀態碼分佈發現 404/500/301 異常,修復爬蟲陷阱
抓取深度與廣度評估網站結構合理性、內部鏈接效果
Referer 來源分析了解蜘蛛從何處發現新頁面(站內鏈/站外鏈/站點地圖)
User-Agent 變化監控及時發現搜尋引擎算法更新、新蜘蛛上線