mcpField
S
seo-ai-crawlers

seo-ai-crawlers

github.com/hainrixz营销与增长79208 次安装4 天前更新
代码仓库

关于 seo-ai-crawlers

seo-ai-crawlers 是面向 SEO 审计流程的模块,用于评估 Google AI 功能的内容资格及第三方 AI 爬虫的访问情况。它检查 robots 规则、内容信号、不同 UA 响应和 JavaScript 渲染,并输出有证据的发现。

主要功能

  1. 01检查 Google AI 功能的索引与摘要资格
  2. 02按目标路径评估各爬虫访问规则
  3. 03分析 Content-Signal 设置
  4. 04比较不同 UA 的响应差异
  5. 05检查非 JavaScript 爬虫可读性
  6. 06提供可验证的审计发现

适用场景

  1. 01诊断页面因 robots 规则无法被 AI 爬虫访问
  2. 02检查摘要控制对 Google AI 资格的影响
  3. 03识别针对不同爬虫的响应差异
  4. 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)

本模块涉及两个彼此独立的问题,只有其中一个有厂商文档支持:

  1. Google 的 AI 功能。 只有当页面已编入索引,且符合在 Google 搜索中显示摘要的条件时,才可能出现在 AI Overviews / AI Mode 中。这些门槛均有文档说明,因此这里仅 M14.ai_eligibility.* 会包含 established 结论。
  2. 第三方 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 进行审计:

  1. 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。
  2. 各爬虫的有效访问权限。 读取受审计路径的 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,以便识别过期表格。
  3. Content-Signal 策略。 content_signals 会报告 search / ai-input / ai-train 键、对应行是全局设置(Cloudflare 托管的 robots.txt 应用会在所有组之后追加该行)还是位于 User-agent 组内,以及是否存在格式错误的键值对。组内行会覆盖该组的全局行。Disallow 始终优先于信号:Disallow: / 会阻止爬虫访问,无论 ai-train 设置为何;Allow + ai-input=no 表示页面仍可抓取,但尚未获得同意——请准确如此表述,绝不要说“已阻止”。
  4. 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 爬虫的访问侧。
  5. 非 JS 爬虫的可渲染性。 使用 M4 的 render 块。如果 H1、正文主体或 JSON-LD 仅存在于 rendered_html_path 中,而 raw_html_path 中不存在,那么不执行 JavaScript 的 AI 爬虫就无法可靠地读取该页面。
  6. 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 — 伪造的 Googlebot UA 在边缘被拒绝(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,否则爬虫将看不到这条指令。

评论

支持 Markdown