記錄搜尋引擎蜘蛛(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();
?>
strpos() 而非正則,效能極佳。bot 放最後),避免誤判。file_put_contents() + LOCK_EX,無需手動 fopen/fclose,原子寫入更安全。755、檔案 644,並置於網站根目錄外,防止被直接下載。whois、dig -x)驗證真偽。<?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();
?>
php.ini 設定 auto_prepend_file 全站自動載入。cronjob 定期切割日誌檔(如每日一檔),避免單一檔案過大。logrotate(Linux)自動壓縮清理舊日誌。INDEX idx_bot_time (bot_name, visit_time)、INDEX idx_ip (ip)。透過持續記錄與分析蜘蛛日誌,你可以掌握搜尋引擎抓取節奏、發現爬蟲陷阱、優化網站結構,進而提升 SEO 效果與伺服器資源利用率。