先给结论 :判断一个页面对 AI 是否可见,不能用浏览器打开看 。浏览器会执行 JS、会渲染结构化数据、会用你的登录态;而 AI 的抓取工具通常什么都不做------它拿到 HTML,剥掉 <script>,读剩下的可见文本。
这中间的落差,能让一个在你眼里内容丰富的页面,在 AI 眼里是一张白纸。
下面三类是实测中最常见的,每类都给判别命令。
一、JSON-LD 结构化数据:SEO 的资产,AI 的盲区
很多站为了 SEO 会在页面里塞 JSON-LD:
html
<script type="application/ld+json">
{"@type": "FAQPage", "mainEntity": [
{"@type": "Question", "name": "怎么配置端点?",
"acceptedAnswer": {"text": "设置两个环境变量......"}}]}
</script>
搜索引擎认这个,会拿它生成富摘要。但AI 的抓取工具通常只提取可见文本,直接丢弃 <script> 标签的内容------包括 JSON-LD。
所以会出现这种情况:你的 FAQ 在 Google 上有富摘要展示,但 AI 完全不知道你回答过这些问题,因为那些问答只存在于 <script> 里,页面上没有对应的可见文本。
判别方法
把页面抓下来,剥掉 <script> 和 <style>,看剩多少字:
bash
curl -sSL -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0" \
"https://你的页面" -o p.html
python3 - <<'EOF'
import re, html
s = open('p.html', encoding='utf-8', errors='ignore').read()
b = re.sub(r'(?is)<(script|style)[^>]*>.*?</\1>', '', s)
txt = re.sub(r'\s+', ' ', html.unescape(re.sub(r'(?s)<[^>]+>', ' ', b))).strip()
print(f"HTML 总大小: {len(s)} 字符")
print(f"去掉 script 后的可见文本: {len(txt)} 字符 ← AI 能看到的量")
print(f"前 200 字: {txt[:200]}")
EOF
如果第二个数字远小于第一个,问题就在这里。
正确做法:两者都给
不是把 JSON-LD 删掉------它对搜索引擎仍然有用。而是同一份内容,可见文本和 JSON-LD 各给一份:
- 页面上用正常的
<h3>问题</h3><p>答案</p>把问答写出来 - 同时保留 JSON-LD 给搜索引擎
一份内容两种表达,两边都能读到。
二、客户端渲染:HTML 里没有正文
这一类更隐蔽,因为你用浏览器看一切正常。
实测过一个内容平台的文章页:HTML 有 63KB,看起来内容很多。但去掉 <script> 之后,可见文本只剩 2200 字符,全是导航和页脚,正文一个字都没有。
正文在哪?在 __NEXT_DATA__ 那个 <script> 里,等着 JS 把它渲染出来。
bash
# 同样的检测命令,这类页面的特征是:
# HTML 很大,但去 script 后的可见文本极少
这意味着什么
搜索引擎爬虫会执行 JS ,所以它们能看到正文,页面照样能被收录。但多数 AI 抓取工具不执行 JS。
所以这类页面走的是「搜索引擎索引」这条路,不是「实时抓取」那条路。两个推论:
- 发完不会立刻见效,要等搜索引擎先索引,再等 AI 通过搜索拿到
- 如果某个渠道铺了很久没进 AI 信源池,先查它是不是 CSR 且没被索引
三、robots.txt 白名单:从规则上就被排除
前两类是技术实现问题,这一类是规则问题,而且改不了。
有些平台的 robots.txt 是白名单制------只放行少数几个指定的爬虫,末尾一条通配规则把其他所有的都挡掉:
bash
User-agent: 某搜索引擎爬虫
Allow: /某路径
User-agent: *
Disallow: /
这意味着:不在白名单里的抓取工具,从规则上就不该访问。而 AI 用的抓取工具,绝大多数不在那几个名字里。
判别方法
bash
curl -s https://某平台/robots.txt | tail -20
看最后有没有 User-agent: * + Disallow: / 这种通配拦截。有的话,再看上面放行了哪几个具名爬虫。
如果放行列表里只有几个搜索引擎,那么在这个平台发内容,对 AI 可见性的贡献是结构性的零------不是「发得不够多」,是发多少都一样。
这个判断能帮你省掉大量无效投入。我就是靠这条排除掉了一个粉丝量很大、看起来很值得做的平台。
四、还有一类:你自己看得见,是因为你登录着
这一类最容易误判,因为症状和「页面正常」完全一样。
排查时我遇到过:一个页面在浏览器里内容完整,但 AI 抓不到。用未登录的环境测才发现------未登录访问会被 302 到登录页。
bash
# 关键是加 -L 看最终落点,不能只看第一个状态码
curl -sS -o /dev/null -w "%{http_code} → %{url_effective}\n" -L \
-A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0" \
"https://你的页面"
如果 url_effective 变成了登录页,那这个页面对任何未登录访问者(包括所有 AI 抓取工具)都是不可见的。
⚠️ 验证这一类必须用「干净」的环境:不带 cookie、不带登录态。用你日常的浏览器测,测出来的永远是「正常」。
五、一套完整的自检流程
按顺序跑,每一步都能排除一类问题:
bash
URL="https://你的页面"
UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0"
# ① 未登录能不能访问,最终落在哪
curl -sS -o p.html -w "HTTP %{http_code} → %{url_effective}\n" -L -A "$UA" "$URL"
# ② 去掉 script 后还剩多少可见文本
python3 -c "
import re,html
s=open('p.html',encoding='utf-8',errors='ignore').read()
b=re.sub(r'(?is)<(script|style)[^>]*>.*?</\1>','',s)
t=re.sub(r'\s+',' ',html.unescape(re.sub(r'(?s)<[^>]+>',' ',b))).strip()
print(f'HTML {len(s)} → 可见文本 {len(t)}')
print('前 200 字:', t[:200])"
# ③ 关键内容在不在可见文本里(换成你自己的关键词)
grep -c "你的核心关键词" p.html
判读:
| 结果 | 结论 |
|---|---|
| ① 落到登录页 | 对 AI 完全不可见,先解决访问权限 |
| ② 可见文本 < HTML 的 5% | 大概率是 CSR,正文在 <script> 里 |
| ③ 关键词只在 script 里出现 | 内容只存在于 JSON-LD 或数据块,AI 读不到 |
| 三项都正常 | 技术层没问题,剩下的是内容和权重问题 |
六、一条容易搞反的因果
最后说一个我自己犯过的错。
看到某个域名在 AI 的引用来源里出现频率很高,很容易得出「在这个平台发内容效果好」。
但域名级的数据不等于账号级的可达性。
我曾经因为某平台在信源统计里排第四,判断它是个明显的机会,于是把发布链路做通、文章发出去,事后才发现:那个账号的内容未登录根本访问不了(第四类问题)。域名有价值,但我们发的内容不可达,贡献是零。
→ 开一个新渠道时,先验证「我们发的东西能不能被访问」,再谈这个域名值不值。 顺序反了,前面所有工作都是空转。
小结
| 类型 | 症状 | 判别 | 能不能解决 |
|---|---|---|---|
| JSON-LD 只在 script 里 | 有富摘要但 AI 不知道 | 去 script 后文本量 | ✅ 同时给可见文本 |
| 客户端渲染 | HTML 大但可见文本少 | 同上 | ⚠️ 靠搜索引擎索引,慢 |
| robots 白名单排除 | 发多少都进不了 | 看 robots.txt 的通配规则行 | ❌ 结构性的,换平台 |
| 未登录不可访问 | 自己看正常,AI 看不到 | 干净环境 + -L 追踪落点 |
✅ 但要平台侧解决 |
一句话:别用你的浏览器判断 AI 能看到什么。 你的浏览器执行 JS、渲染结构化数据、带着登录态------这三样 AI 的抓取工具一样都没有。