自動識別並記錄主流搜尋引擎蜘蛛(Baidu、Google、Bing、Yahoo、Soso、Sogou、Yodao)的爬取行為,包含訪問時間、蜘蛛名稱、User-Agent、Referer 頁面,生成文字日誌檔案,便於 SEO 分析與伺服器流量審計。
| 搜尋引擎 | User-Agent 關鍵字 | 識別名稱 |
| Google | googlebot | Google |
| 百度 | baiduspider | Baidu |
| 必應 | msnbot | Bing |
| Yahoo | slurp | Yahoo |
| 搜搜 | sosospider | Soso |
| 搜狗 | sogou spider | Sogou |
| 有道 | yodaobot | Yodao |
完整實作程式碼
<?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();
?>
部署方式
- 獨立檔案包含法:將核心邏輯存為
spider_logger.php,在網站入口檔案(如 index.php、框架啟動檔)最頂端 require_once 'spider_logger.php';
- 框架中介層法:Laravel 中間件、ThinkPHP 行為、Symfony Event Subscriber、Yii Behavior
- Nginx/Apache 日誌分析法:更高效能,離線分析 access.log,無 PHP 額外開銷(推薦高流量站點)
日誌分析價值
| 分析維度 | SEO 價值 |
| 蜘蛛來訪頻次/時間 | 判斷網站被抓取活躍度,調整更新策略 |
| 抓取頁面類型分佈 | 發現重要頁面未被抓取、無價值頁面被過度抓取 |
| HTTP 狀態碼分佈 | 發現 404/500/301 異常,修復爬蟲陷阱 |
| 抓取深度與廣度 | 評估網站結構合理性、內部鏈接效果 |
| Referer 來源分析 | 了解蜘蛛從何處發現新頁面(站內鏈/站外鏈/站點地圖) |
| User-Agent 變化監控 | 及時發現搜尋引擎算法更新、新蜘蛛上線 |
注意事項與反偽裝
- 偽造 User-Agent:惡意爬蟲常偽裝成 Googlebot。進階驗證:反向 DNS 解析 IP 確認屬於 googlebot.com、baidu.com 等官方網段
- 效能影響:檔案寫入有磁碟 IO 開銷,高併發建議改用資料庫批次寫入或異步隊列
- 日誌輪轉:按日/按大小分檔,定期清理舊日誌,避免磁碟佔滿
- 隱私合規:IP 屬個人資料,遵守 GDPR/個資法,設定保留期限並匿名化
總結
蜘蛛日誌記錄是 SEO 技術審計的基礎數據來源。本文提供從簡單檔案記錄到企業級資料庫方案的完整實作,開發者可根據流量規模、分析需求選擇適合方案。核心關鍵在於:準確識別、高效儲存、持續分析、依數據優化。
- 上一篇文章: PHP 中英文混合斷句無亂碼:urlencode + 正則實現精準分句
- 下一篇文章: 純 CSS 實現 Tab 切換:兩大方案深度對比與避坑指南
Copyright ©
程式碼之家 All Rights Reserved