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

PHP 實現搜索引擎爬蟲日誌記錄系統

     編輯:PHP 綜合知識

需求

記錄百度、Google、必應等搜索引擎蜘蛛訪問網站的時間、URL、IP、User-Agent,便於分析收錄情況、發現抓取異常。

數據表設計

CREATE TABLE `crawler_log` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `crawler_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '蜘蛛名稱',
  `visit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '訪問時間',
  `request_url` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '請求URL',
  `client_ip` VARCHAR(45) NOT NULL DEFAULT '' COMMENT '客戶端IP',
  `user_agent` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '完整UA',
  INDEX `idx_time` (`visit_time`),
  INDEX `idx_crawler` (`crawler_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='爬蟲訪問日誌';

核心記錄腳本 (robot.php)

 'Google',
    'mediapartners-google' => 'Google Adsense',
    'baiduspider' => 'Baidu',
    'sogou spider' => 'Sogou',
    'yahoo' => 'Yahoo',
    'bingbot' => 'Bing',
    'msnbot' => 'MSN/Bing',
    'ia_archiver' => 'Alexa',
    'yodaobot' => 'Yodao',
    'iaskspider' => 'Iask',
    'bytespider' => 'Toutiao/ByteDance',
    '360spider' => '360',
];

foreach ($crawlerMap as $key => $name) {
    if (strpos($ua, $key) !== false) {
        $crawler = $name;
        break;
    }
}

// 非爬蟲可選擇不記錄
if ($crawler === 'Other') {
    // 也可記錄所有帶 bot 的
    if (strpos($ua, 'bot') === false) exit;
}

// 2. 組裝數據
$requestUrl = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$clientIp = $_SERVER['REMOTE_ADDR'] ?? '';
$visitTime = date('Y-m-d H:i:s');

// 3. 寫入數據庫 (PDO 防注入)
try {
    $pdo = new PDO(
        'mysql:host=localhost;dbname=your_db;charset=utf8mb4',
        'db_user', 'db_pass',
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );
    $stmt = $pdo->prepare(
        "INSERT INTO crawler_log (crawler_name, visit_time, request_url, client_ip, user_agent)
         VALUES (?, ?, ?, ?, ?)"
    );
    $stmt->execute([$crawler, $visitTime, $requestUrl, $clientIp, $ua]);
} catch (PDOException $e) {
    error_log('Crawler log failed: ' . $e->getMessage());
}

接入方式

  1. 全局包含:在公共入口文件(如 common.php、框架 bootstrap.php)頂部 require 'robot.php';
  2. nginx access_log 分析:高流量站點建議離線分析 access.log,避免每請求寫 DB 影響性能;
  3. 異步寫入:將日誌推入 Redis List / Kafka,消費者批量入庫。

後台查看頁面

query("SELECT COUNT(*) FROM crawler_log")->fetchColumn();
$pages = ceil($total / $pageSize);

$stmt = $pdo->prepare("SELECT * FROM crawler_log ORDER BY visit_time DESC LIMIT ?, ?");
$stmt->execute([$offset, $pageSize]);
$logs = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

爬蟲日誌


搜索引擎爬蟲訪問記錄 (共 條)

時間蜘蛛IPURLUser-Agent
查看

性能優化建議

  1. 採樣記錄:高流量站點可按 1% 概率記錄,或僅記錄首次訪問;
  2. 分表/分區:按月分表 crawler_log_2024_01,或使用 MySQL 原生分區;
  3. ClickHouse / Elasticsearch:海量日誌分析建議接入專用 OLAP 數據庫;
  4. User-Agent 解析庫:使用 donatj/phpuseragentparser 或 ua-parser/uap-php 精準識別設備、瀏覽器、爬蟲版本。

安全提示

日誌中包含完整 URL 可能洩露後台路徑、參數敏感信息。展示頁面需做權限控制(僅管理員可見),並對 URL 參數進行脫敏處理。

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