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

PHP 記錄搜尋引擎蜘蛛爬行記錄完整實作

     編輯:PHP 相關知識

前言

記錄搜尋引擎蜘蛛 (Spider/Bot) 的爬行行為,有助於 SEO 分析、伺服器負載監控與異常流量偵測。本文提供完整的安裝腳本、資料表建立、蜘蛛辨識邏輯與部署方式。

系統架構

  • 安裝介面 (setup.html):設定資料庫連線與管理員帳號
  • 安裝處理 (setup.php):建立資料表、寫入設定檔
  • 記錄核心 (zz.php):辨識蜘蛛、寫入資料庫
  • 部署方式:include 或 JS 引入

1. 安裝介面 (setup.html)

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>蜘蛛記錄系統安裝</title>
</head>
<body>
  <form action="setup.php" method="post">
  <table>
    <tr><td>資料庫主機:</td><td><input name="server" value="localhost"></td></tr>
    <tr><td>資料庫用戶:</td><td><input name="sqluser" value="root"></td></tr>
    <tr><td>資料庫密碼:</td><td><input type="password" name="sqlpass"></td></tr>
    <tr><td>資料庫名稱:</td><td><input name="sqldb" value="spider_log"></td></tr>
    <tr><td>管理員帳號:</td><td><input name="adminname" value="admin"></td></tr>
    <tr><td>管理員密碼:</td><td><input type="password" name="adminpass" value="admin"></td></tr>
    <tr><td colspan="2"><input type="submit" value="開始安裝"></td></tr>
  </table>
  </form>
</body>
</html>

2. 安裝處理 (setup.php)

<?php
$server = $_POST['server'] ?? '';
$sqluser = $_POST['sqluser'] ?? '';
$sqlpass = $_POST['sqlpass'] ?? '';
$sqldb = $_POST['sqldb'] ?? '';
$adminname = $_POST['adminname'] ?? '';
$adminpass = md5($_POST['adminpass'] ?? '');

$conn = @mysql_connect($server, $sqluser, $sqlpass);
if (!$conn) die("<script>alert('資料庫連線失敗');history.back();</script>");

@mysql_select_db($sqldb) or die("<script>alert('資料庫不存在');history.back();</script>");

// 建立蜘蛛記錄表
$sql = "CREATE TABLE IF NOT EXISTS `robots` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `robotsname` VARCHAR(200) DEFAULT NULL,
  `robotsip` VARCHAR(200) DEFAULT NULL,
  `riqi` DATE DEFAULT NULL,
  `shijian` TIME DEFAULT NULL,
  `robotspage` VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";

if (mysql_query($sql, $conn)) {
  // 寫入設定檔 (建議改用 JSON 或 .env 格式)
  $config = "<?php\n";
  $config .= "\$db_host = '$server';\n";
  $config .= "\$db_user = '$sqluser';\n";
  $config .= "\$db_pass = '$sqlpass';\n";
  $config .= "\$db_name = '$sqldb';\n";
  $config .= "\$admin_user = '$adminname';\n";
  $config .= "\$admin_pass = '$adminpass';\n";
  $config .= "?>";
  file_put_contents('../config.php', $config);
  
  rename('setup.php', 'setup.lock');
  echo "<script>alert('安裝成功!');location.href='../index.html';</script>";
} else {
  echo "<script>alert('建立資料表失敗');history.back();</script>";
}
?>

3. 核心記錄邏輯 (zz.php)

<?php
require_once 'config.php';

// 建立資料庫連線 (建議改用 PDO/MySQLi)
$conn = mysql_connect($db_host, $db_user, $db_pass);
mysql_select_db($db_name, $conn);
mysql_query('SET NAMES utf8', $conn);

// 取得訪客資訊
$uri = $_SERVER['REQUEST_URI'] ?? '';
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
$ref = $_SERVER['HTTP_REFERER'] ?? '';
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
$date = date('Y-m-d');
$time = date('H:i:s');

// 蜘蛛辨譽邏輯 (依 User-Agent 關鍵字)
$spiders = [
  'baidu' => 'Baiduspider',
  'google' => 'Googlebot',
  'soso' => 'Sosospider',
  'youdao' => 'YoudaoBot',
  'bing' => 'Bingbot',
  'sogou' => 'Sogou web spider',
  'yahoo' => 'Yahoo! Slurp',
  'yandex' => 'YandexBot',
  '360' => '360Spider',
  'byte' => 'Bytespider', // 字節跳動
];

$spiderName = null;
foreach ($spiders as $key => $agent) {
  if (stripos($ua, $agent) !== false) {
    $spiderName = $key;
    break;
  }
}

// 記錄已識別的蜘蛛
if ($spiderName) {
  $sql = "INSERT INTO `robots` (robotsname, robotspage, robotsip, riqi, shijian) "
    . "VALUES ('" . mysql_real_escape_string($spiderName, $conn) . "', "
    . "'" . mysql_real_escape_string($uri, $conn) . "', "
    . "'" . mysql_real_escape_string($ip, $conn) . "', "
    . "'{$date}', '{$time}')";
  mysql_query($sql, $conn);
}

mysql_close($conn);
?>

4. 部署方式

方式一:PHP include (推薦,效能最好)

<?php
// 在每個頁面最頂端引入
include_once 'path/to/zz.php';
?>

方式二:JavaScript 引入 (適用於靜態頁/無法修改 PHP)

<script src="path/to/zz.php"></script>

zz.php 需輸出 JS 內容 (如 document.write('')) 避免錯誤。

資料庫查詢與分析範例

<?php
// 統計各蜘蛛造訪次數
$sql = "SELECT robotsname, COUNT(*) as cnt FROM robots GROUP BY robotsname ORDER BY cnt DESC";
// 近 7 天蜘蛛活動趨勢
$sql = "SELECT riqi, robotsname, COUNT(*) as cnt FROM robots WHERE riqi >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY riqi, robotsname";
// 特定蜘蛛爬取的頁面
$sql = "SELECT DISTINCT robotspage FROM robots WHERE robotsname = 'google' ORDER BY riqi DESC LIMIT 100";
?>

安全性與效能優化建議

  • 資料庫連線:改用 PDO/MySQLi + 預處理語句,防止 SQL 注入
  • 寫入效能:高流量網站建議使用非同步寫入 (Redis 隊列 + 背景 Worker)
  • 資料清理:定期刪除舊記錄 (如保留 90 天),避免資料表過大
  • 索引優化:為 `robotsname`, `riqi`, `robotsip` 加上索引
  • 偽裝蜘蛛防護:可結合 IP 反查驗證 (如 Googlebot IP 範圍驗證)
  • 設定檔安全:config.php 放在公開目錄外,或用 .env 檔案

現代化重構方向

  1. 使用 Laravel/ThinkPHP 等框架的 Middleware 自動記錄
  2. 整合 Elasticsearch 做全文檢索與視覺化 (Kibana)
  3. 使用 User-Agent 解析庫 (如 ua-parser) 提高辨識準確度
  4. 加入 GeoIP 記錄蜘蛛來源國家/地區
  5. 建立 儀表板 即時監控蜘蛛活動
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved