PHP判断搜索引擎蜘蛛(爬虫)的两种实现方法
在PHP开发中,识别访客是否为搜索引擎蜘蛛通常通过解析HTTP_USER_AGENT请求头实现。本文介绍两种常见思路:一是维护包含主流爬虫标识的全面匹配列表;二是基于通用关键词进行快速检测。代码展示了如何读取服务器变量并进行字符串匹配,适用于SEO优化、反爬策略或统计访问来源场景。
实现目标
通过PHP脚本准确判断当前请求是否来自搜索引擎的爬虫程序(Spider/Crawler/Bot),以便对这类访问执行特殊逻辑,如返回简化页面、记录特定统计或直接拒绝。
准备条件
环境:支持PHP 5.3+的运行环境(如Apache/Nginx + PHP)。
关键参数:需要获取
$_SERVER['HTTP_USER_AGENT']字段,这是浏览器和爬虫发送的身份标识。基础能力:了解字符串查找函数
strpos()的基本用法及数组遍历。
真实操作顺序
第1步:使用全面匹配列表判断(推荐用于精确控制)
目的:通过列举已知的主流搜索引擎爬虫User-Agent片段,确保不漏掉知名站点(如百度、Google、必应等)。
操作说明:
入口:定义一个函数,例如
isCrawler()。动作:
- 获取当前请求的UA信息:
$agent = strtolower($_SERVER['HTTP_USER_AGENT']);,转为小写以忽略大小写差异。 - 建立一个包含所有已知爬虫特征串的数组
$spiderSite。 - 遍历该数组,使用
strpos($agent, $str)检查UA中是否包含对应特征串。 - 若发现匹配项,立即返回
true。
- 获取当前请求的UA信息:
重要参数:以下数组涵盖了常见的搜索引擎和广告爬虫:
/**
* 判断是否为搜索引擎蜘蛛
*
* @author Eddy
* @return bool
*/
function isCrawler() {
$agent = strtolower($_SERVER['HTTP_USER_AGENT']);
if (!empty($agent)) {
// 收录了国内外主要搜索引擎及常见爬虫的标识
$spiderSite = array(
"TencentTraveler",
"Baiduspider+", // 百度
"BaiduGame",
"Googlebot", // Google
"msnbot", // Bing (原MSN)
"Sosospider+", // Soso (现搜狗)
"Sogou web spider", // 搜狗
"ia_archiver", // Wayback Machine
"Yahoo! Slurp", // Yahoo
"YoudaoBot", // 有道
"Yahoo Slurp",
"MSNBOT",
"Java (Often spam bot)",
"BaiDuSpider",
"Voila",
"Yandex bot", // Yandex
"BSpider",
"twiceler",
"Sogou Spider",
"Speedy Spider",
"Google AdSense",
"Heritrix",
"Python-urllib", // Python爬虫库
"Alexa (IA Archiver)",
"Ask",
"Exabot",
"Custo",
"OutfoxBot/YodaoBot",
"yacy",
"SurveyBot",
"legs",
"lwp-trivial",
"Nutch",
"StackRambler",
"The web archive (IA Archiver)",
"Perl tool",
"MJ12bot", // Majestic SEO
"Netcraft",
"MSIECrawler",
"WGet tools",
"larbin",
"Fish search"
);
foreach ($spiderSite as $val) {
$str = strtolower($val);
// strpos !== false 表示找到子串
if (strpos($agent, $str) !== false) {
return true;
}
}
}
return false;
}
第2步:使用关键词快速检测(适用于轻量级过滤)
目的:当不需要区分具体是哪一家爬虫,只需知道"是不是机器人"时,可通过检测UA中的通用关键词(如bot, spider, slurp)来大幅减少代码量。
操作说明:
入口:定义函数
is_spider()。动作:
- 初始化标志位
$robot = 0。 - 获取并转为小写的
$USER_AGENT。 - 依次检测是否存在
"bot","spider","slurp","mediapartners-google"(AdSense) 等关键词。 - 只要命中任意一个,将
$robot设为1。 - 根据标志位决定后续业务逻辑(代码中标注
//do something)。
- 初始化标志位
可观察的完成状态:函数返回空字符串,实际使用中通常在调用处判断返回值或修改为返回布尔值。
function is_spider(){
$robot = 0;
// 获取用户代理并统一转小写
$USER_AGENT = strtolower($_SERVER['HTTP_USER_AGENT']);
// 检测常见爬虫关键词
if(strpos($USER_AGENT,"bot")) $robot = 1;
if(strpos($USER_AGENT,"spider")) $robot = 1;
if(strpos($USER_AGENT,"slurp")) $robot = 1;
if(strpos($USER_AGENT,"mediapartners-google")) $robot = 1;
if(strpos($USER_AGENT,"fast-webcrawler")) $robot = 1;
if(strpos($USER_AGENT,"altavista")) $robot = 1;
if(strpos($USER_AGENT,"ia_archiver")) $robot = 1;
if($robot == 1){
// do something
}
return '';
}
完成判断
结果验证:你可以将上述函数嵌入到你的PHP入口文件或特定页面顶部。在实际访问测试中,可以通过模拟不同的User-Agent字符串(或使用浏览器的开发者工具修改Header)来验证函数是否能正确返回预期结果。对于第一种方法,请确保数组随着时间推移补充新增的爬虫标识;对于第二种方法,请注意避免误判含有"bot"单词的正常用户描述。
原文有依据的排错
- 大小写问题:搜索引擎UA并不总是保持一致的大小写格式(例如 "Googlebot" vs "GOOGLEBOT"),因此在比较前务必使用
strtolower()进行标准化处理。 - 部分匹配风险:
strpos是子串匹配。如果你的网站名字里恰好包含 "bot" 或 "spider" 字样且被写在UA中,可能会产生误判。但在实际爬虫UA中,这种情况极为罕见,因此通常影响不大。 - 空值处理:部分客户端可能不发送UA或UA为空,代码中已包含
!empty($agent)或非空检查,防止因未定义变量产生的警告。
简要总结
本文提供的两种PHP代码片段分别是针对精准控制和快速过滤的两个典型应用场景。
第一种 isCrawler() 通过白名单模式列出具体爬虫品牌,适合需要对不同搜索引擎做差异化处理的场景;
第二种 is_spider() 则采用黑名单关键词模式,代码更简洁,适合仅需要屏蔽所有非人类访问的场景。
你可以根据实际需求选择其中一种或结合使用。
以上就是PHP判断访客是否为搜索引擎蜘蛛的详细内容,更多关于PHP爬虫检测的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









