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

PHP 識別搜索引擎蜘蛛與普通用戶的多種實現方案

     編輯:PHP 綜合知識

在 SEO 統計、反爬蟲、差異化內容輸出等場景,需區分訪客是搜索引擎爬蟲還是真人用戶。本文匯總 4 種基於 User-Agent 的判斷方案,從 Discuz 成熟邏輯到簡單關鍵字匹配,附完整代碼可直接落地。

方案一:Discuz X3.2 核心邏輯(推薦)

特點:維護蜘蛛/瀏覽器關鍵字白名單,先排除瀏覽器再匹配蜘蛛,準確率高。

function checkRobot($userAgent = '') {
    static $spiders = ['bot', 'crawl', 'spider', 'slurp', 'sohu-search', 'lycos', 'robozilla'];
    static $browsers = ['msie', 'netscape', 'opera', 'konqueror', 'mozilla'];

    $ua = strtolower(empty($userAgent) ? $_SERVER['HTTP_USER_AGENT'] : $userAgent);

    // 若包含瀏覽器特征且非 HTTP 鏈接,視為人類
    if (strpos($ua, 'https://') === false && dstrpos($ua, $browsers)) return false;
    // 匹配蜘蛛關鍵字
    if (dstrpos($ua, $spiders)) return true;
    return false;
}

function dstrpos($string, $arr, $returnValue = false) {
    if (empty($string)) return false;
    foreach ((array)$arr as $v) {
        if (strpos($string, $v) !== false) {
            return $returnValue ? $v : true;
        }
    }
    return false;
}

// 使用
if (!checkRobot()) {
    // 真人用戶邏輯:統計 PV、顯示廣告、記錄行為
}

方案二:詳細蜘蛛分類統計(適合日誌分析)

$ua = strtolower($_SERVER['HTTP_USER_AGENT']);
$bot = '';

if (strpos($ua, 'googlebot') !== false) $bot = 'Google';
elseif (strpos($ua, 'baiduspider') !== false) $bot = 'Baidu';
elseif (strpos($ua, 'sogou spider') !== false) $bot = 'Sogou';
elseif (strpos($ua, '360spider') !== false) $bot = '360Spider';
elseif (strpos($ua, 'yahoo') !== false) $bot = 'Yahoo';
elseif (strpos($ua, 'msnbot') !== false) $bot = 'Bing';
elseif (strpos($ua, 'yodaobot') !== false) $bot = 'Yodao';
// ... 可繼續擴展

if ($bot) {
    $log = date('Y-m-d H:i:s') . "\t" . $_SERVER['REMOTE_ADDR'] . "\t" . $bot . "\t" . 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . "\n";
    file_put_contents('bot.log', $log, FILE_APPEND);
}

方案三:簡潔陣列遍歷(易維護)

function isCrawler() {
    $ua = strtolower($_SERVER['HTTP_USER_AGENT']);
    $spiders = [
        'Googlebot', 'Baiduspider', 'Yahoo! Slurp', 'YodaoBot', 'msnbot',
        'Bingbot', 'Slurp', 'Sogou', '360Spider', 'Sosospider', 'Alexa'
    ];
    foreach ($spiders as $spider) {
        if (strpos($ua, strtolower($spider)) !== false) return true;
    }
    return false;
}

方案四:大全關鍵字庫(覆蓋面廣)

function isCrawlerFull() {
    $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
    $spiderSite = [
        "TencentTraveler", "Baiduspider+", "BaiduGame", "Googlebot", "msnbot",
        "Sosospider+", "Sogou web spider", "ia_archiver", "Yahoo! Slurp",
        "YoudaoBot", "MSNBot", "Java", "BaiDuSpider", "Voila", "Yandex bot",
        "BSpider", "twiceler", "Sogou Spider", "Speedy Spider", "Google AdSense",
        "Heritrix", "Python-urllib", "Alexa", "Ask", "Exabot", "Custo",
        "OutfoxBot/YodaoBot", "yacy", "SurveyBot", "legs", "lwp-trivial",
        "Nutch", "StackRambler", "Perl tool", "MJ12bot", "Netcraft",
        "MSIECrawler", "WGet tools", "larbin", "Fish search"
    ];
    foreach ($spiderSite as $val) {
        if (strpos($agent, strtolower($val)) !== false) return true;
    }
    return false;
}

進階防偽裝建議

  1. IP 段驗證:結合官方發布的爬蟲 IP 段(如百度 123.125.68.*、Google 66.249.64.*)雙重校驗,防止 UA 偽造。
  2. 行為分析:單位時間請求頻率、訪問路徑規律、是否執行 JS、Cookie 支持等。
  3. 蜜罐頁面:在 robots.txt 禁止的隱藏鏈接,訪問者極大概率為惡意爬蟲。
  4. 反向 DNS 查詢:對疑似 IP 執行 gethostbyaddr(),驗證主機名是否屬於搜索引擎域名(如 *.googlebot.com)。

應用場景示例

  • SEO 友好:蜘蛛輸出純文本、結構化數據;用戶輸出富交互頁面。
  • 流量統計:分離蜘蛛流量,統計真實用戶 PV/UV。
  • 反采集:疑似爬蟲返回 403/驗證碼/延遲響應。
  • 廣告投放:不向蜘蛛展示廣告,避免廣告商扣費糾紛。

選擇方案原則:方案一 平衡準確與性能,適合大多數項目;方案二 適合需要詳細蜘蛛分類統計;方案三/四 適合快速接入、維護關鍵字庫。

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