PHP判断搜索引擎蜘蛛(爬虫)的两种实现方法

苏见山
苏见山
发布时间:2026-10-15| 5人浏览过
原创

在PHP开发中,识别访客是否为搜索引擎蜘蛛通常通过解析HTTP_USER_AGENT请求头实现。本文介绍两种常见思路:一是维护包含主流爬虫标识的全面匹配列表;二是基于通用关键词进行快速检测。代码展示了如何读取服务器变量并进行字符串匹配,适用于SEO优化、反爬策略或统计访问来源场景。

实现目标

通过PHP脚本准确判断当前请求是否来自搜索引擎的爬虫程序(Spider/Crawler/Bot),以便对这类访问执行特殊逻辑,如返回简化页面、记录特定统计或直接拒绝。

准备条件

  • 环境:支持PHP 5.3+的运行环境(如Apache/Nginx + PHP)。

  • 关键参数:需要获取 $_SERVER['HTTP_USER_AGENT'] 字段,这是浏览器和爬虫发送的身份标识。

  • 基础能力:了解字符串查找函数 strpos() 的基本用法及数组遍历。

真实操作顺序

第1步:使用全面匹配列表判断(推荐用于精确控制)

目的:通过列举已知的主流搜索引擎爬虫User-Agent片段,确保不漏掉知名站点(如百度、Google、必应等)。

操作说明:

  1. 入口:定义一个函数,例如 isCrawler()。

  2. 动作:

    • 获取当前请求的UA信息:$agent = strtolower($_SERVER['HTTP_USER_AGENT']);,转为小写以忽略大小写差异。
    • 建立一个包含所有已知爬虫特征串的数组 $spiderSite。
    • 遍历该数组,使用 strpos($agent, $str) 检查UA中是否包含对应特征串。
    • 若发现匹配项,立即返回 true。
  3. 重要参数:以下数组涵盖了常见的搜索引擎和广告爬虫:


/**
 * 判断是否为搜索引擎蜘蛛
 *
 * @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)来大幅减少代码量。

操作说明:

  1. 入口:定义函数 is_spider()。

  2. 动作:

    • 初始化标志位 $robot = 0。
    • 获取并转为小写的 $USER_AGENT。
    • 依次检测是否存在 "bot", "spider", "slurp", "mediapartners-google" (AdSense) 等关键词。
    • 只要命中任意一个,将 $robot 设为 1。
    • 根据标志位决定后续业务逻辑(代码中标注 //do something)。
  3. 可观察的完成状态:函数返回空字符串,实际使用中通常在调用处判断返回值或修改为返回布尔值。


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爬虫检测的资料请关注本站其它相关文章!

相关标签:

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

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 算法库。