关于 seo-ai-crawlers
seo-ai-crawlers 是面向 SEO 审计流程的模块,用于评估 Google AI 功能的内容资格及第三方 AI 爬虫的访问情况。它检查 robots 规则、内容信号、不同 UA 响应和 JavaScript 渲染,并输出有证据的发现。
主要功能
- 01检查 Google AI 功能的索引与摘要资格
- 02按目标路径评估各爬虫访问规则
- 03分析 Content-Signal 设置
- 04比较不同 UA 的响应差异
- 05检查非 JavaScript 爬虫可读性
- 06提供可验证的审计发现
适用场景
- 01诊断页面因 robots 规则无法被 AI 爬虫访问
- 02检查摘要控制对 Google AI 资格的影响
- 03识别针对不同爬虫的响应差异
- 04确认主要内容是否依赖 JavaScript 渲染
MCP 相关
输入未说明 MCP 集成。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ hainrixz/ claude-seo-ai --skill seo-ai-crawlers安装后在 Claude Code 中输入/seo-ai-crawlers确认已加载。
详细介绍
seo-ai-crawlers(M14)
本模块涉及两个彼此独立的问题,只有其中一个有厂商文档支持:
- Google 的 AI 功能。 只有当页面已编入索引,且符合在 Google 搜索中显示摘要的条件时,才可能出现在 AI Overviews / AI Mode 中。这些门槛均有文档说明,因此这里仅
M14.ai_eligibility.*会包含established结论。 - 第三方 AI 爬虫。 哪些爬虫可能抓取并引用页面——OpenAI、Anthropic、Perplexity、Apple、Amazon、Meta、Mistral、DuckDuckGo、Cohere。按用户代理说明了访问权限;但引用的效果并无相关说明,因此这些结论仍为
directional。
训练、检索和用户抓取之间的区别决定了每条 robots 建议。参考资料:references/ai-crawlers.md(含来源的 UA 表、Content-Signal、资格门槛、预设)。AI 发现文件(llms.txt、agents.md、/.well-known/ucp、代理式站点地图)属于模块 M21,参见 seo-ai-discovery;代理式商务就绪度属于 M18(seo-ecommerce)。
输入
使用调度信封中指定的 PageSnapshot:从 <run_dir>/pages/<slug>.json 读取 parsed,以及 robots_directives、headers(x-robots-tag)和 render{needed,used,delta};在 pages/<slug>.html 中使用 Grep 查找原文证据。<run_dir>/site/robots.json 对审计路径记录了 verdicts、effective_access{[bot]:{class, fetch, url_allowed, via, rule, signals, doc_url, robots_reliability}}、content_signals{present, placement, global, by_group[], malformed[], cloudflare_managed_hint}、groups 和 ua_table_version。如果本次运行包含用户代理差异,<run_dir>/ua-diff.json 会记录每个 UA 的 status/title/h1/word_count/canonical/robots/jsonld。audit.mjs 已输出的确定性结论列于 <run_dir>/findings.deterministic.json 中——不要重复输出这些 ID;只添加经模型判断的结论。如果直接使用 URL/路径调用,且不存在快照,则先运行 node "${CLAUDE_PLUGIN_ROOT}/scripts/snapshot.mjs" <target> --out "${CLAUDE_PLUGIN_DATA}/runs",并使用打印出的快照路径。
审计
结合 PageSnapshot(当 render.used 不为 none 时使用 parsed_rendered,否则使用 parsed)和 site/robots.json 进行审计:
- Google AI 功能资格(既定门槛)。 收集所有
<meta name="robots">/<meta name="googlebot">标签,以及所有X-Robots-Tag标头值(标头和 meta 标签都计入;以限制最严格者为准)。读取noindex/none、nosnippet、max-snippet:N和data-nosnippet属性——对于data-nosnippet,测量其覆盖了多少主要内容,并特别确认它是否包裹 H1 或导语段落。另确认 Googlebot 本身未被禁止抓取此路径。记录范围:来自模板或全站标头的指令标记为scope: template|site;仅手动写入单个文档的指令标记为scope: page。 - 各爬虫的有效访问权限。 读取受审计路径的
effective_access,而不是/的设置。网站可以允许访问/,却禁止访问/blog/,因此根路径的访问策略不能作为答案。检查检索/引用爬虫(OAI-SearchBot、Claude-SearchBot、PerplexityBot、Amazonbot、DuckAssistBot、Google-CloudVertexBot)、传统搜索引擎爬虫(Googlebot、Bingbot、Applebot)、训练爬虫标识(GPTBot、ClaudeBot、Google-Extended、Applebot-Extended、CCBot、Meta-ExternalAgent、cohere-ai、Bytespider)、用户触发的抓取标识(ChatGPT-User、Claude-User、Claude-Web、Perplexity-User、Meta-ExternalFetcher、MistralAI-User)以及OAI-AdsBot。当前 OpenAI 标识为GPTBot/1.4和OAI-SearchBot/1.4;按标识进行不区分大小写的 User-Agent 匹配,切勿匹配完整 UA 字符串。Anthropic 在claude.com/crawling/bots.json发布其爬虫 IP 范围。在报告中引用ua_table_version,以便识别过期表格。 - Content-Signal 策略。
content_signals会报告search/ai-input/ai-train键、对应行是全局设置(Cloudflare 托管的 robots.txt 应用会在所有组之后追加该行)还是位于User-agent组内,以及是否存在格式错误的键值对。组内行会覆盖该组的全局行。Disallow始终优先于信号:Disallow: /会阻止爬虫访问,无论ai-train设置为何;Allow+ai-input=no表示页面仍可抓取,但尚未获得同意——请准确如此表述,绝不要说“已阻止”。 - User-Agent 差异。 比较源站对
default、googlebot、gptbot、oai-searchbot和claude-searchbot提供的内容:状态码、标题、H1、字数、规范链接、robots 指令或 JSON-LD 是否存在差异。区分爬虫挑战(403/429/503、中间页、CAPTCHA 标记、字数近乎为零)和真正的内容差异。搜索维度上的伪装判断——Googlebot 与浏览器收到的内容是否不同——属于 M2(M2.cloaking.ua_content_divergence);M14 仅负责 AI 爬虫的访问侧。 - 非 JS 爬虫的可渲染性。 使用 M4 的
render块。如果 H1、正文主体或 JSON-LD 仅存在于rendered_html_path中,而raw_html_path中不存在,那么不执行 JavaScript 的 AI 爬虫就无法可靠地读取该页面。 - Google-Extended 核查。 如果禁止
Google-Extended,请明确说明,这不会将网站从 AI Overviews 或 AI Mode 中移除——它仅限制 Gemini 的训练和信息依据使用。
修复
- AUTO(
fixable: auto):支持引用的robots.txt预设,需用户选择——用户选择allow-citations(允许搜索/检索,选择退出训练)、allow-all或block-all。预设见references/ai-crawlers.md;每个预设末尾都有一行Content-Signal:,用该词汇体系重述相同意图。确定性、增量式、可验证;作为差异内容输出,供fix使用。 - PROPOSED(
fixable: proposed):移除用户确认属于意外设置的nosnippet/max-snippet:0/noindex,以及从主要内容上移除data-nosnippet。绝不自动写入:片段控制通常是有意设置的(付费墙、许可限制)。 - ADVISORY(
fixable: advisory):边缘/WAF 规则——解除对受到质询的 AI 机器人的拦截,或拦截忽略robots.txt的 Agent(例如Bytespider)。工具绝不写入基础设施配置。 绝不编造站点地图 URL、联系邮箱或链接目标——询问用户,或留下明确标记的TODO占位符。
验证
node "${CLAUDE_PLUGIN_ROOT}/scripts/parse-robots-sitemap.mjs" --url <final_url> --path <audited path>(方法robots_parse)——根据用户代理针对已审计路径解析生效指令,并返回content_signals、effective_access和ua_table_version。离线 robots 文件可使用--robots <robots_url>或--file <path>。node "${CLAUDE_PLUGIN_ROOT}/scripts/ai-eligibility.mjs" --snapshot <pages/<slug>.json>(或--url <u>)——检查每条 meta-robots/X-Robots-Tag指令、max-snippet值和data-nosnippet覆盖比例,包括它是否包裹 H1/导语(方法dom_assert+header_check)。node "${CLAUDE_PLUGIN_ROOT}/scripts/ua-diff.mjs" --url <final_url> --ua default,googlebot,gptbot,oai-searchbot,claude-searchbot(方法ua_diff)——按用户代理检查响应字段,并检测质询。- 使用 M4 结果运行
render_diff,进行可渲染性检查(主要内容存在于raw_html_path中)。 - 必需层级不可用时(无法获取
robots.txt、没有 M4 渲染结果、未运行 UA diff),状态为needs_api或manual_review——绝不能虚报为pass。
发现
发现项符合 schema/finding.schema.json。evidence.observed 原样引用页面、标头或 robots 行;verification.reproduce 是上述可运行命令之一;expected_impact 按区间划分并标注置信度(不得只写百分比)。严重性策略:5 仅用于站点/模板范围内造成灾难性后果、会导致失去资格的事实;4 为重大 · 3 为中等 · 2 为轻微 · 1 为表面 · 0 为信息性——且只有活动类别中严重性为 5、状态为 fail 且已确认的发现项,才能限制分数(references/scoring-model.md)。
Google AI 功能资格 — 轴为 ai,除特别注明外,置信度为 established;来源:Google《AI features and your website》以及 robots-meta / X-Robots-Tag 规范:
M14.ai_eligibility.not_indexable—noindex/none,或 Googlebot 对此路径被禁止(fail,站点/模板范围严重性为 5,单页为 4,fixable: proposed)。M14.ai_eligibility.nosnippet— meta 标签或标头中包含nosnippet(fail,站点/模板严重性为 5,单页为 4,fixable: proposed)。M14.ai_eligibility.max_snippet_zero—max-snippet:0(fail,站点/模板严重性为 5,单页为 4,fixable: proposed)。M14.ai_eligibility.max_snippet_low— 正数max-snippet:N低于我们的 50 词阈值(warn,严重性为 2,fixable: advisory,置信度为directional——该阈值由我们设定,Google 未公布任何阈值)。M14.ai_eligibility.data_nosnippet_primary—data-nosnippet包住 H1 或导语段落(fail,严重性为 4,fixable: proposed)。M14.ai_eligibility.data_nosnippet_partial— 存在data-nosnippet,但仅包住辅助内容块(pass,严重性为 1)。M14.ai_eligibility.ok— 可编入索引且符合摘要资格,没有抑制指令(pass,严重性为 3)。M14.google_extended.blocked_info— 禁止Google-Extended;仅供参考,因为这不会影响 AI Overviews 或 AI Mode(pass,严重性为 1)。
第三方爬虫访问权限 — 轴为 ai:
M14.citation_bots.blocked—Disallow规则覆盖了审计路径上的OAI-SearchBot/Claude-SearchBot/PerplexityBot(或其他检索 Bot)(fail,严重性为 4,fixable: auto)。仅当至少一个被拦截的令牌有供应商文档记录(包括其 robots.txt 行为)时,置信度才为established(lib/bots.mjs中robots_reliability: 'documented'且有doc_url);如果拦截仅覆盖旧版或未记录的令牌(Claude-Web、MistralAI-User,或Meta-ExternalFetcher这类limited令牌),它们仍会列为证据并作相应标记,置信度则降为directional。无论哪种情况,rationale中都会将引用损失标为directional。M14.retrieval.allowed— 所有检索/引用 Bot 均可抓取审计路径(pass,严重性为 4,置信度为directional)。M14.render.content_js_only— 主要内容、H1 或 JSON-LD 仅存在于rendered_html_path中(warn,严重性为 4,fixable: advisory,置信度为directional)。M14.access.ai_bot_challenged— AI 用户代理收到质询/插页,或拿到近乎空白的正文,而默认 UA 能获取页面(warn,严重性为 4,fixable: advisory,置信度为directional)。M14.access.googlebot_blocked_at_edge— 伪造的GooglebotUA 在边缘被拒绝(warn,严重性为 2,fixable: advisory,置信度为speculative——拒绝未经验证的伪造 UA 属于合理防护;采取行动前请通过反向 DNS 验证)。
Content-Signal — 轴为 ai,置信度绝不会是 established(没有供应商文档确认其合规性;IETF 草案于 2026-04 过期,且仅定义词汇):
M14.content_signal.ai_input_no—ai-input=no(warn,严重性为 3,fixable: advisory,directional):拒绝将页面内容用于答案引擎输入,同时页面仍可被抓取。M14.content_signal.search_no—search=no(warn,严重性为 3,fixable: advisory,directional)。M14.content_signal.ai_train_no—ai-train=no(pass,严重性为 1):合理且成本低的偏好设置,不会损失引用。M14.content_signal.malformed— 未知键、非yes|no值,或无法解析的键值对(warn,严重性为 2,fixable: auto)。M14.content_signal.absent— 没有Content-Signal行(not_applicable,严重性为 0——缺少该行并非缺陷)。
探测项(由 geo 命令负责维护,在此列出是因为它们带有 M14 前缀):M14.probe.web_presence 和 M14.gsc_ai.impressions_present|zero_impressions|unavailable 的严重性均为 0,位于 report.json.probes 下,且不会改变或限制任何评分。
诚实性
本模块中的每项声明都以 Google 自己的说法为依据:
- 页面只有在 Search 中已编入索引且符合摘要展示条件,才能进入 AI Overviews / AI Mode。没有任何专用于 AI 的文件、令牌、架构类型或改写步骤可以使页面获得展示资格。
- **
Google-Extended不会影响 AI Overviews 或 AI Mode。**它限制训练以及 Gemini/Vertex grounding。屏蔽它是训练方面的选择,而不是影响 AI 可见性的选择。 - **Google Search 会忽略
llms.txt。**它在 M21 中的权重为 0,且不会改变 M14 类别。 - Search Console 的生成式 AI 报告仅提供展示次数,Search Analytics API 也不提供 AI 维度(已于 2026-08 检查)——本工具绝不声称存在 API 级别的 AI 引用数据。
其他注意事项:
- **Content-Signal 是元数据,不是强制措施。**没有 AI 厂商说明会遵守它;每项
M14.content_signal.*发现至多只能视为directional。真正起作用的是Disallow行——绝不能把信号说成替代方案;如果页面仍可访问,也绝不能称其为已被「屏蔽」的ai-input=no页面。 - **UA 差异结果是伪装 UA 得到的结果。**我们发送的是令牌,不是经过验证的爬虫:网站可能会合理地拒绝未经验证的
Googlebot字符串,CDN 也可能向任何未知客户端提供质询。应将差异视为有待核实的线索(反向 DNS、服务器日志、Search Console URL Inspection),绝不能将其视为伪装的证据。因此,M14.access.googlebot_blocked_at_edge属于speculative。 - 屏蔽训练机器人不会屏蔽相应的搜索机器人——
GPTBot≠OAI-SearchBot,ClaudeBot≠Claude-SearchBot。大多数「屏蔽 AI」指南都搞错了这一点,导致网站失去引用。 Bytespider和某些用户提取器(Meta 表示Meta-ExternalFetcher可能会绕过 robots.txt)并不总是遵守robots.txt;robots 规则只能尽力而为,真正的强制措施需要边缘规则(仅供参考)。robots.txt控制的是抓取,而非编入索引——若要让页面不进入索引,请使用noindex,且不要同时设置Disallow,否则爬虫将看不到这条指令。