在 SEO 統計、反爬蟲、差異化內容輸出等場景,需區分訪客是搜索引擎爬蟲還是真人用戶。本文匯總 4 種基於 User-Agent 的判斷方案,從 Discuz 成熟邏輯到簡單關鍵字匹配,附完整代碼可直接落地。
特點:維護蜘蛛/瀏覽器關鍵字白名單,先排除瀏覽器再匹配蜘蛛,準確率高。
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;
}
123.125.68.*、Google 66.249.64.*)雙重校驗,防止 UA 偽造。gethostbyaddr(),驗證主機名是否屬於搜索引擎域名(如 *.googlebot.com)。選擇方案原則:方案一 平衡準確與性能,適合大多數項目;方案二 適合需要詳細蜘蛛分類統計;方案三/四 適合快速接入、維護關鍵字庫。