PHP记录爬虫来访:数据库设计与代码实现
通过PHP脚本监听HTTP请求中的User-Agent字段,结合MySQL数据库,可以精确记录各类网络爬虫的访问行为,包括所属平台、访问地址、时间及IP,帮助网站管理者掌握搜索引擎抓取情况。
结果或目标
建立一套基于PHP和MySQL的爬虫访问监控系统,能够自动识别主流搜索引擎(如Google、百度、Yahoo等)及其他爬虫,并将访问详情持久化存储,以便后续查看和分析。
准备条件
- 运行环境:已安装PHP解释器和MySQL数据库服务的环境。
- 数据库权限:拥有创建数据库及表的权限。
- 配置文件:需要准备一个包含数据库连接信息(主机、用户名、密码、库名)的文件,例如
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,判断是否为爬虫,并写入数据库。
实现逻辑:
- 获取请求信息:从
$_SERVER超全局数组中获取服务器名称、端口、脚本名称、查询字符串及客户端IP。 - 组合完整URL:将上述信息拼接成完整的访问链接。
- 识别爬虫类别:提取
HTTP_USER_AGENT并转为小写,通过strpos函数匹配关键词来确定爬虫归属(如Google、Baidu等)。 - 连接数据库:引入数据库配置,建立连接。
- 插入数据:执行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爬虫监控的资料请关注本站其它相关文章!免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









