PHP记录爬虫来访:数据库设计与代码实现

码头散步
码头散步
发布时间:2026-10-13| 4人浏览过
原创

通过PHP脚本监听HTTP请求中的User-Agent字段,结合MySQL数据库,可以精确记录各类网络爬虫的访问行为,包括所属平台、访问地址、时间及IP,帮助网站管理者掌握搜索引擎抓取情况。

结果或目标

建立一套基于PHP和MySQL的爬虫访问监控系统,能够自动识别主流搜索引擎(如Google、百度、Yahoo等)及其他爬虫,并将访问详情持久化存储,以便后续查看和分析。

准备条件

  1. 运行环境:已安装PHP解释器和MySQL数据库服务的环境。
  2. 数据库权限:拥有创建数据库及表的权限。
  3. 配置文件:需要准备一个包含数据库连接信息(主机、用户名、密码、库名)的文件,例如 dbinfo.php。

真实操作顺序

第1步:创建记录爬虫的数据库表

首先在MySQL中创建用于存储爬虫信息的表。该表需包含自增主键、爬虫类别、访问时间、访问URL以及来源IP。

注意:原文中的 varchar() 缺少长度定义,实际创建时建议指定足够长度,如 varchar(255)。同时,datetime 的默认值建议调整为当前时间。

CREATE TABLE crawler (
  crawler_ID bigint unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  crawler_category varchar(100) NOT NULL COMMENT '爬虫分类',
  crawler_date datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '访问时间',
  crawler_url varchar(1024) NOT NULL COMMENT '访问URL',
  crawler_IP varchar(50) NOT NULL COMMENT '来源IP'
) DEFAULT CHARSET=utf8mb4;

第2步:编写核心记录脚本 robot.php

创建一个名为 robot.php 的文件,该文件负责解析当前请求的来源UA,判断是否为爬虫,并写入数据库。

实现逻辑:

  1. 获取请求信息:从 $_SERVER 超全局数组中获取服务器名称、端口、脚本名称、查询字符串及客户端IP。
  2. 组合完整URL:将上述信息拼接成完整的访问链接。
  3. 识别爬虫类别:提取 HTTP_USER_AGENT 并转为小写,通过 strpos 函数匹配关键词来确定爬虫归属(如Google、Baidu等)。
  4. 连接数据库:引入数据库配置,建立连接。
  5. 插入数据:执行SQL插入语句,记录爬虫分类、时间和IP。
<?php
// 1. 获取基础信息
$ServerName = $_SERVER["SERVER_NAME"] ; 
$ServerPort = $_SERVER["SERVER_PORT"] ; 
$ScriptName = $_SERVER["SCRIPT_NAME"] ; 
$QueryString = $_SERVER["QUERY_STRING"]; 
$serverip = $_SERVER["REMOTE_ADDR"] ; 

// 构建完整URL
$Url="http://".$ServerName;
if ($ServerPort && $ServerPort != "80") {
    $Url = $Url.":".$ServerPort ;
}
$Url=$Url.$ScriptName;
if ($QueryString !="") {
    $Url=$Url."?".$QueryString;
}  
$GetLocationURL=$Url ;

// 2. 识别 User-Agent
$agent = $_SERVER["HTTP_USER_AGENT"]; 
$agent=strtolower($agent);
$Bot ="";

// 根据 UA 关键词判断爬虫类型
if (strpos($agent,"googlebot") !== false) {
    $Bot = "Google";
} elseif (strpos($agent,"mediapartners-google") !== false) {
    $Bot = "Google Adsense";
} elseif (strpos($agent,"baiduspider") !== false) {
    $Bot = "Baidu";
} elseif (strpos($agent,"sogou spider") !== false) {
    $Bot = "Sogou";
} elseif (strpos($agent,"yahoo") !== false) {
    $Bot = "Yahoo!";
} elseif (strpos($agent,"msn") !== false) {
    $Bot = "MSN";
} elseif (strpos($agent,"ia_archiver") !== false || strpos($agent,"iaarchiver") !== false) {
    $Bot = "Alexa";
} elseif (strpos($agent,"sohu") !== false) {
    $Bot = "Sohu";
} elseif (strpos($agent,"yodaoBot") !== false) {
    $Bot = "Yodao";
} else {
    // 其他含 bot 的或非明确匹配的通用爬虫
    if (strpos($agent,"bot") !== false) {
        $Bot = "Other Crawler";
    } else {
        $Bot = "Human or Unknown"; // 非爬虫标记
    }
}

// 如果识别出是特定爬虫才记录(可选优化:只记录已知爬虫)
if ($Bot === "Human or Unknown") exit();

// 3. 连接数据库
require("./dbinfo.php"); // 假设此文件定义了 $host, $username, $password, $database
date_default_timezone_set('PRC'); 
$shijian=date("Y-m-d H:i:s", time());

// 使用 mysqli 或 PDO 替代已废弃的 mysql_connect
// 以下为示例代码结构,请根据实际使用的扩展调整
$connection = new mysqli($host, $username, $password, $database);
if ($connection->connect_error) {
    die('Connection failed: ' . $connection->connect_error);
}

// 4. 插入数据
$query = $connection->prepare("INSERT INTO crawler (crawler_category, crawler_date, crawler_url, crawler_IP) VALUES (?, ?, ?, ?)");
$query->bind_param("ssss", $Bot, $shijian, $GetLocationURL, $serverip);
$query->execute();
$query->close();
$connection->close();
?>

重要修正说明:原文使用了已废弃的 mysql_* 系列函数,在现代PHP版本(PHP 7及以上)中已移除。请务必改用 mysqli 或 PDO 扩展,并注意使用预处理语句防止SQL注入。

第3步:在目标页面引入监控

在网站需要记录的页面顶部(如 index.php 或公共头部文件)引入 robot.php,这样每次页面加载都会执行记录逻辑。

<? php include './robot.php'; ?>

第4步:查看爬虫访问记录

编写一个简单的管理页面,从数据库中读取记录并以表格形式展示。此处仅提供核心查询与展示逻辑,原代码中的分页类 PageClass 为第三方封装,使用时需确保其存在或替换为标准分页逻辑。

<?php
// 连接数据库(复用之前的配置)
include '../library/conn_new.php'; // 假设包含 $mysql 对象

// 获取当前页码
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$limit_per_page = 10; // 每页显示数量
$start_limit = ($page - 1) * $limit_per_page;

// 查询总数
$count_result = $mysql->query("SELECT COUNT(*) as total FROM crawler");
$count_row = $count_result->fetch_assoc();
$total_count = $count_row['total'];

// 查询当前页数据
$sql = "SELECT crawler_date, crawler_category, crawler_IP, crawler_url 
        FROM crawler 
        ORDER BY crawler_date DESC 
        LIMIT {$start_limit}, {$limit_per_page}";
$result = $mysql->query($sql);
?>

<!DOCTYPE html>
<html>
<head><title>爬虫访问日志</title></head>
<body>
    <table border="1" width="100%">
        <thead>
            <tr>
                <th>爬虫访问时间</th>
                <th>爬虫分类</th>
                <th>爬虫IP</th>
                <th>访问URL</th>
            </tr>
        </thead>
        <tbody>
        <?php
        while($myrow = $result->fetch_assoc()){
        ?>
            <tr>
                <td><? echo htmlspecialchars($myrow["crawler_date"]) ?></td>
                <td><? echo htmlspecialchars($myrow["crawler_category"]) ?></td>
                <td><? echo htmlspecialchars($myrow["crawler_IP"]) ?></td>
                <td><? echo htmlspecialchars($myrow["crawler_url"]) ?></td>
            </tr>
        <?php
        }
        ?>
        </tbody>
    </table>
    <p>共  条记录</p>
</body>
</html>
<?php $result->free(); ?>

完成判断

当网页被Google、Baidu等爬虫访问后,登录数据库或使用管理页面查看,若能看到对应的 Google 或 Baidu 分类记录及准确的时间、IP和URL,即表示爬虫记录功能部署成功。

简要总结

通过自定义PHP脚本拦截并分析用户代理(User-Agent),可以低成本实现对网站爬虫流量的精细化监控。这不仅有助于了解搜索引擎对站点的覆盖情况,也能为SEO分析和安全防护提供数据支持。在实际生产环境中,建议进一步考虑日志轮转、大数据量下的查询性能优化以及使用更专业的Web日志分析工具。

以上就是PHP代码实现爬虫记录的详细内容,更多关于PHP爬虫监控的资料请关注本站其它相关文章!
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。