ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AI爬虫与网站防御:从日志识别到robots.txt与Nginx拦截的实战指南

AI爬虫与网站防御:从日志识别到robots.txt与Nginx拦截的实战指南 这几个月如果你翻过自己服务器的 access.log大概率会看到一串以前没见过的名字GPTBot、ClaudeBot、CCBot、Bytespider。它们访问站点时并不像 Googlebot 那样“礼貌克制”而是连续把整篇文章正文、链接、图片地址、结构化数据全部拉走。最近一篇关于欧洲出版商的行业报告又把这个问题推到台前报告发现欧洲出版商站点的 AI bot scraping 压力正在明显加重。我的判断是这不只是新闻行业的麻烦也是所有 Web 内容运营者和后端工程师必须补上的一课。搜索引擎爬虫帮你带来流量而 AI 训练爬虫常常只带走内容、不给点击还要消耗你的带宽、CDN 流量和源站计算资源。对付它们不能沿用传统“谁封 IP 谁有理”的反爬思路——把所有机器人一刀切封死会误伤 AI 搜索带来的新曝光完全放行又等于把自己的语料无成本地送给大模型公司。这篇文章不打算只复述报告结论而是会聊清楚三件事AI 爬虫和传统搜索引擎爬虫到底有什么本质区别为什么内容型网站尤其是有高质量长文内容的站点会成为重灾区从日志识别、robots.txt 策略到 Nginx/CDN 拦截一条可落地的防御路径。如果你正在维护技术博客、内容平台、企业官网或者参与反爬/流量治理工作这篇文章适合收藏后照着做。1. AI 爬虫为什么突然值得每个网站认真对待先说一个容易被低估的事实AI 爬虫带来的不是一次性的访问量而是持续的“内容搬运成本”。传统爬虫比如 Googlebot、Bingbot、Baiduspider虽然也会频繁访问但它们的目标是建立索引。你的站点被收录后用户搜索到一个页面点击进来这个访问会变成 PV、广告曝光或者至少是品牌触达。爬虫消耗的资源和它带来的流量回报长期看是能算过来账的。AI 爬虫不一样。它的目标是把网页内容变成训练语料或者让 AI 搜索产品直接“阅读”你的页面后生成摘要。用户以后可能会在 ChatGPT、Perplexity 这类产品里看到对你文章的高度概括却不需要再点击你的站点。于是出现了这样的局面服务器为抓取付出了带宽和存储成本优质内容成为模型答案的组成部分原站却不一定拿到点击、订阅或广告收益。更麻烦的是AI 爬虫的访问行为往往比传统搜索引擎爬虫更“重”。很多模型训练爬虫会携带完整浏览器 UA、启用 JavaScript、抓取页面里所有可见文本并发量也不低。对于小站点来说这可能直接导致源站负载上涨、日志文件暴涨甚至影响真实用户体验。这正是报告里欧洲出版商格外痛的原因。他们手里最值钱的资产就是“高质量、结构化、有深度”的文本内容而这恰恰是大模型最需要的训练语料。过去内容网站只需要处理 SEO 和搜索收录的问题现在却要面对一个“既不送流量、又不容易绕开”的新爬虫群体。所以核心结论是AI bot scraping 不是一个“新闻行业问题”而是内容型 Web 站点普遍要面对的技术治理问题。2. 先从概念上把 AI 爬虫和搜索引擎爬虫分开很多同学第一次看到“AI bot scraping”这个词会以为它泛指所有用 AI 做的爬虫。实际上更准确的翻译是“面向 AI 场景的机器人抓取”它至少包含三种不同的类型模型训练抓取把网页内容下载下来用于预训练、微调或蒸馏。典型代表是 OpenAI 的 GPTBot、Anthropic 的 ClaudeBot、Common Crawl 的 CCBot。AI 搜索抓取用户在 AI 搜索产品里提问AI 需要实时索引网页来生成带引用的答案。典型代表是 OpenAI 的 OAI-SearchBot、PerplexityBot。交互式浏览抓取用户要求 ChatGPT 等产品“打开某个网页”产品代替用户抓取页面内容。典型代表是 ChatGPT-User。这三类里模型训练抓取对内容网站的商业价值伤害最大因为它完全不回传流量AI 搜索抓取虽然也消耗资源但至少还有机会让内容出现在答案引用中带来一部分曝光。交互式浏览抓取则更接近“用户在替身浏览你的网站”来源可控性更差。下表是现阶段公开文档里出现频率较高的 AI 相关爬虫供大家配置时参考爬虫名称主要归属/用途User-Agent 匹配片段GPTBotOpenAI 模型训练抓取GPTBotOAI-SearchBotOpenAI 搜索产品索引OAI-SearchBotChatGPT-UserChatGPT 用户交互式网页浏览ChatGPT-UserClaudeBotAnthropic 模型训练抓取ClaudeBotCCBotCommon Crawl 通用网页语料CCBotGoogle-ExtendedGoogle 控制 Gemini/AI 训练抓取Google-ExtendedPerplexityBotPerplexity AI 搜索抓取PerplexityBotBytespider字节跳动系文本/多模态训练抓取BytespiderAmazonbotAmazon 商品理解/AI 训练抓取AmazonbotApplebot-ExtendedApple 训练抓取Applebot-ExtendedMeta-ExternalAgentMeta AI 产品抓取Meta-ExternalAgent注意User-Agent 字符串会随各家策略调整上面的表只用于快速识别正式配置前建议到各爬虫官方文档确认最新值不要写死。把 AI 爬虫和搜索引擎爬虫区分开是制定策略的前提。我们可以用一张表说明它们的差异对比维度搜索引擎爬虫AI 训练爬虫核心目标建立搜索索引帮用户找到内容获取语料提升模型生成能力回报模式回传搜索点击流量通常不回传流量抓取深度按站点权重和 sitemap 决定倾向于尽可能多地抓取正文robots.txt 遵守度总体较好有明确的抓取配额参差不齐有的明确支持、有的含糊对站点影响CPU/带宽成本相对可控可能短时间高频并发日志和源站压力上升理解这些差异后你才会明白为什么防御 AI 爬虫不能简单套用“封 IP”的做法。大部分 AI 公司使用云厂商的大范围 IP 池UA 可以改IP 可以动态换。如果只封几个 IP等于没封。3. 欧洲出版商压力更大的原因不止是侵权问题抛开情绪不谈先看一个值得玩味的背景欧洲的内容市场和北美非常不同。欧洲有大量高质量、多语言的新闻和期刊站点。德语、法语、西班牙语、意大利语等非英语内容在全球互联网公开语料里本来就相对稀缺。大模型要做多语言能力就必须补充这些语言的文本。于是欧洲出版商的站点就会成为重点抓取对象。另外欧洲很多新闻媒体的商业模式依赖订阅制和广告。订阅制意味着正文通常有付费墙广告制则依赖页面浏览。AI 爬虫不会付费甚至很多训练爬虫不执行 JavaScript 广告代码等于白白拿走内容但不产生广告曝光。这种“成本和收益彻底分离”的局面对依赖内容的公司伤害是直接的。报告里提到“更严重”背后的另一个技术信号可能是欧洲出版商的站点虽然内容质量高但在工程防护上未必比大型科技平台强。很多媒体网站用的是成熟 CMS接入了一些 CDN但未必做了按 User-Agent 粒度的日志分析、机器人策略表和边缘拦截规则。面对几十个新出现的 AI 爬虫靠手工改配置是跟不上节奏的。这里要明确一点不是让你去和某个公司对抗而是要在自己的站点上建立一套“可识别、可决策、可拦截”的工程机制。这套机制欧洲媒体需要个人博客同样需要。4. 先别急着封用日志把 AI 爬虫“认出来”在做任何拦截之前第一步永远是观察。很多站长的第一反应是把所有陌生 UA 全封掉最后误伤了某个 AI 搜索产品导致自己的内容在 AI 答案里消失。更稳妥的做法是先在 Nginx 或 Apache 的 access.log 里看清流量结构。如果你的 Nginx 使用默认的 combined 日志格式一条日志会包含远程 IP、时间、请求方法、路径、状态码和 User-Agent。最简单的识别方式就是用 grep 把已知 AI 爬虫的日志行过滤出来# 查看最近包含 GPTBot/ClaudeBot/CCBot 的请求 grep -iE GPTBot|ClaudeBot|CCBot|Bytespider|PerplexityBot|Google-Extended \ /var/log/nginx/access.log | tail -20如果想知道某个 AI 爬虫到底带来了多少请求可以加上计数# 统计日志总量 wc -l /var/log/nginx/access.log # 统计 GPTBot 出现次数 grep -ic GPTBot /var/log/nginx/access.log # 统计所有已知 AI 相关爬虫的总次数 grep -icE GPTBot|ClaudeBot|CCBot|Bytespider|PerplexityBot|OAI-SearchBot|Google-Extended \ /var/log/nginx/access.log不过很多线上环境日志量很大纯命令行统计效率不高。下面是一个简单的 Python 分析脚本可以一次性输出所有已知 AI 爬虫的命中次数以及它们占日志总量的比例# analyze_ai_bots.py import re import sys from collections import Counter AI_BOT_PATTERN re.compile( r(GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|CCBot| rGoogle-Extended|PerplexityBot|Bytespider|Amazonbot| rApplebot-Extended|Meta-ExternalAgent), re.IGNORECASE ) path sys.argv[1] if len(sys.argv) 1 else /var/log/nginx/access.log counter Counter() total 0 with open(path, encodingutf-8, errorsignore) as f: for line in f: total 1 matched AI_BOT_PATTERN.search(line) if matched: counter[matched.group(1)] 1 ai_total sum(counter.values()) print(f总日志行数: {total}) print(fAI 爬虫命中: {ai_total}) if total 0: print(fAI 爬虫占比: {ai_total / total * 100:.2f}%) print(--- 各爬虫明细 ---) for name, count in counter.most_common(): print(f{name:20} {count})运行方式python3 analyze_ai_bots.py /var/log/nginx/access.log脚本会输出类似下面的结果总日志行数: 1200000 AI 爬虫命中: 36200 AI 爬虫占比: 3.02% --- 各爬虫明细 --- GPTBot 12840 ClaudeBot 9350 CCBot 7210 Bytespider 4900 OAI-SearchBot 1900如果某个 AI 爬虫的占比超过你的预期或者它总是集中访问某些正文页面那就说明它已经不是“偶尔路过”而是在系统化地扫描内容。接下来就要考虑策略了。另外识别日志里的 AI 爬虫访问了哪些路径也能帮你判断它是不是只盯着正文接口# 先取出日志行中的请求部分再提取路径统计 Top 20 awk -F {print $2} /var/log/nginx/access.log \ | grep -E ^(GET|POST|HEAD) \ | awk {print $2} \ | sort | uniq -c | sort -rn | head -20如果 AI 爬虫重点访问的是/article/、/news/、RSS 接口而不是首页和静态资源那基本可以确认它在做内容采集。反过来如果它只是偶尔访问首页那么对你的威胁未必很大可以先观察。第一个小结论管理员需要掌握的是“哪些 UA、哪些 IP、在什么时间、抓哪些路径”而不是一上来就封禁。没有日志分析的拦截等于蒙着眼打仗。5. 用 robots.txt 先定合作边界在谈 Nginx 拦截之前先不要跳过 robots.txt。虽然它对恶意爬虫没有强制力但它仍然是最快、最不容易误伤的“协议边界”。绝大多数正规 AI 公司都对外声明“我们遵守 robots.txt”包括 OpenAI、Anthropic、Common Crawl 等。这就意味着你在 robots.txt 里写的策略至少能挡住“守规矩的爬虫”。robots.txt 对 AI 相关爬虫的常见写法如下# 文件路径站点根目录 /robots.txt # 1. 允许所有搜索引擎建立常规索引 User-agent: * Allow: / # 2. 禁止多个 AI 模型训练爬虫 User-agent: GPTBot Disallow: / User-agent: ClaudeBot Disallow: / User-agent: CCBot Disallow: / User-agent: Bytespider Disallow: / User-agent: Google-Extended Disallow: / # 3. 对 AI 搜索爬虫给出差异化策略 # 比如允许 OAI-SearchBot 抓取文章页但禁止抓搜索接口 User-agent: OAI-SearchBot Allow: /article/ Allow: /news/ Disallow: /search/ Disallow: /api/ User-agent: PerplexityBot Allow: /article/ Allow: /news/ Disallow: /search/这段配置的逻辑是先用User-agent: *表示默认对所有机器人开放然后对明确不想提供训练语料的 AI 爬虫用Disallow: /禁止整站抓取对 AI 搜索类爬虫保留一部分路径因为它们可能会让你的内容出现在带引用的答案里。注意robots.txt 是“君子协定”不是访问控制系统。它不能防住伪造 UA 的爬虫也防不住故意忽略 robots.txt 的抓取者。但它能帮你在舆论和合规层面建立“我已明确声明禁止”的记录这个价值不能忽略。关于 robots.txt还有一个常见坑不要把私密页面放在被 Disallow 的目录里就以为安全。真正需要保护的内容必须走登录鉴权robots.txt 只是告诉搜索引擎“别收录”并不等于防火墙。6. 在 Nginx/CDN 层拦截与限流当你确认某个 AI 爬虫不遵守 robots.txt或者它的访问量已经明显影响源站就需要在服务端或边缘层做更硬的拦截。不建议在 PHP/Python/Java 应用层直接拦截因为请求已经到达后端浪费了计算资源。更合理的位置是 Nginx 层或 CDN 边缘。6.1 Nginx 按 User-Agent 拦截Nginx 可以用map指令把 User-Agent 归类然后在server块里统一处理。这样把规则集中在一个文件里便于维护和 review。# 文件路径/etc/nginx/conf.d/ai_bot_policy.conf map $http_user_agent $ai_bot_action { default ; ~*GPTBot deny;
返回列表