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

PHP 實作網頁爬蟲來訪記錄系統:資料庫設計、User-Agent 辨識與分頁顯示

     編輯:PHP 相關知識

PHP 實作網頁爬蟲來訪記錄系統:資料庫設計、User-Agent 辨識與分頁顯示

記錄搜尋引擎爬蟲(Spider/Bot)造訪路徑、時間、IP,有助於 SEO 分析、伺服器負載監控與異常流量偵測。本文提供完整資料表結構、robot.php 記錄邏輯、前端分頁查詢代碼。

1. 資料表結構

CREATE TABLE `crawler` (
  `crawler_ID` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `crawler_category` VARCHAR(50) NOT NULL,   -- 爬蟲名稱:Google, Baidu, Bing...
  `crawler_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `crawler_url` VARCHAR(500) NOT NULL,       -- 被造訪的完整 URL
  `crawler_IP` VARCHAR(45) NOT NULL          -- IPv4/IPv6
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. robot.php:自動辨識並寫入

<?php
// 取得請求資訊
$serverName = $_SERVER['SERVER_NAME'];
$serverPort = $_SERVER['SERVER_PORT'];
$scriptName = $_SERVER['SCRIPT_NAME'];
$queryStr   = $_SERVER['QUERY_STRING'];
$clientIP   = $_SERVER['REMOTE_ADDR'];

$url = "https://$serverName";
if ($serverPort != 80) $url .= ":$serverPort";
$url .= $scriptName;
if ($queryStr) $url .= "?$queryStr";

$agent = strtolower($_SERVER['HTTP_USER_AGENT']);
$bot = 'Other Crawler';

$patterns = [
    'googlebot'        => 'Google',
    'mediapartners-google' => 'Google Adsense',
    'baiduspider'      => 'Baidu',
    'sogou spider'     => 'Sogou',
    'yahoo'            => 'Yahoo',
    'msn'              => 'MSN/Bing',
    'ia_archiver'      => 'Alexa',
    'iaarchiver'       => 'Alexa',
    'sohu'             => 'Sohu',
    'sqworm'           => 'AOL',
    'yodaobot'         => 'Yodao',
    'iaskspider'       => 'Iask',
];

foreach ($patterns as $key => $name) {
    if (strpos($agent, $key) !== false) {
        $bot = $name;
        break;
    }
}

// 資料庫連線(建議改用 PDO)
require './dbinfo.php'; // 定義 $host, $username, $password, $database
$conn = mysqli_connect($host, $username, $password, $database);
if (!$conn) die('DB Connect Failed: '.mysqli_connect_error());
mysqli_set_charset($conn, 'utf8mb4');

$date = date('Y-m-d H:i:s');
$sql = "INSERT INTO `crawler` (`crawler_category`,`crawler_date`,`crawler_url`,`crawler_IP`)
        VALUES (?,?,?,?)";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, 'ssss', $bot, $date, $url, $clientIP);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
mysqli_close($conn);

3. 前端分頁查詢頁面

<?php
require './robot.php'; // 記錄當前造訪
require '../library/page.Class.php'; // 分頁類別
require '../library/conn_new.php';   // $mysql 物件

$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$total = $mysql->num_rows($mysql->query("SELECT 1 FROM `crawler`"));
$pager = new PageClass($total, 20, $page, $_SERVER['PHP_SELF'].'?page={page}');

$sql = "SELECT * FROM `crawler` ORDER BY `crawler_date` DESC LIMIT {$pager->page_limit}, {$pager->myde_size}";
$res = $mysql->query($sql);
?>
<table border="1" cellpadding="5">
  <thead>
    <tr>
      <th>#</th>
      <th>造訪時間</th>
      <th>爬蟲分類</th>
      <th>IP 位址</th>
      <th>造訪 URL</th>
    </tr>
  </thead>
  <tbody>
<?php while ($row = $mysql->fetch_array($res)): ?>
    <tr>
      <td><img src="../images/topicnew.gif" /></td>
      <td><?= htmlspecialchars($row['crawler_date']) ?></td>
      <td><?= htmlspecialchars($row['crawler_category']) ?></td>
      <td><?= htmlspecialchars($row['crawler_IP']) ?></td>
      <td><?= htmlspecialchars($row['crawler_url']) ?></td>
    </tr>
<?php endwhile; ?>
  </tbody>
</table>
<?= $pager->myde_write() ?>

部署方式

  1. 將 robot.php 以 include 或 auto_prepend_file 方式納入所有頁面入口。
  2. 確保資料庫連線資訊正確、寫入權限足夠。
  3. 定期清理過舊記錄(如保留 90 天),避免資料表膨脹。

進階擴充建議

  • 加入 crawler_referer 欄位記錄來源頁面。
  • 使用 GeoIP 解析 IP 歸屬國家/城市。
  • 整合 Elasticsearch 或 ClickHouse 做大數據分析。
  • 偵測惡意爬蟲(偽裝 User-Agent、高頻請求)並自動封鎖 IP。

輕量級記錄系統即可滿足中小型站點爬蟲監控需求,部署簡單、效能開銷極低。

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