Day1:核子GEO诊断炸出robots.txt埋的雷,200+页面被封锁

客户是垂直招聘平台,跑着Hexo静态站,职位页6万多。上线两周了,跟我说百度毛都没收录。我习惯用核子GEO做初步诊断,输入域名,AEO评估报告直接弹了个红字:被封锁页面>200。

说实话我第一反应是防火墙拦了百度蜘蛛。查CDN日志,百度蜘蛛User-Agent访问正常,200响应码。手动curl看了一眼robots.txt,冷汗当场就下来了。

User-agent: *
Disallow: /job/
Disallow: /search/

两行Disallow,直接封了所有职位详情页和搜索聚合页。JobPosting Schema写得再好有什么用?蜘蛛根本进不去。我检查Hexo生成的sitemap.xml,位置在public/sitemap.xml,里面/job/路径下整整6.2万条URL,全被这行规则挡死。

核子GEO检测工具的报告里还标了具体数据:被屏蔽页面数217,其中/job/目录占198条,/search/占19条。这不是小打小闹,是直接砍掉整个核心内容。

我去年给另一个招聘站做的时候也踩过这个坑。当时图省事,直接把/job/目录全部Disallow,因为觉得职位页都是动态生成的低质量内容。结果百度站长平台显示索引量从8900掉到零。这种错误太典型了——静态站生成的所有职位页都是独立静态HTML,质量并不差,Disallow等于自断筋脉。

解决办法很简单:删掉这两行,或者改成Allow: /job/。但别急着上线,后面还有更细的颗粒度要调。

Day2:拆了CDN缓存,在nginx里给AI爬虫配了独立User-Agent白名单

昨天查完被封锁页面后,我直接找客户要了Cloudflare控制台权限。一进去就发现问题——防火墙规则里把BaiduSpider的UA给拦截了,连带着百度文心爬虫Baidu-AI也被挡在外面。客户说这是以前防CC攻击时设的规则,之后就没动过。我心想,这不是把财神爷往外赶吗?

我的方案是直接在nginx层做UA白名单,绕过CDN缓存层。Cloudflare的缓存策略太粗暴,对AI爬虫这种需要新鲜内容的bot,直接给过期页面等于白费力气。我在nginx的server块里加了这段配置:

server {
    listen 443 ssl;
    server_name example.com;

    # 针对AI爬虫和搜索引擎bot的UA白名单
    if ($http_user_agent ~* "Baidu-AI|BaiduSpider|Googlebot") {
        set $skip_cache 1;
    }

    location / {
        proxy_cache my_cache;
        proxy_cache_bypass $skip_cache;
        proxy_no_cache $skip_cache;
        proxy_cache_valid 200 1h;

        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;

        # 对Baidu-AI单独加允许规则
        location ~* /jobs/ {
            if ($http_user_agent ~* "Baidu-AI") {
                proxy_cache_bypass 1;
                proxy_no_cache 1;
            }
        }
    }
}

实测发现,这个策略对招聘行业的职位页特别关键。职位页更新频繁,AI爬虫需要看到最新内容才能产出准确引用。之前客户用Cloudflare缓存了6小时,百度文心拿到的都是过期职位,引用率自然低。我用核子GEO的AEO评估检测了一下,结果显示被封锁页面还有87个,但Baidu-AI的命中次数直接翻了3倍。

配置完后,我在Cloudflare里把防火墙规则改成了只对非bot流量生效。Baidu-AI的UA是Mozilla/5.0 (compatible; Baidu-AI/1.0; +http://ai.baidu.com),必须单独放行。别跟我当初一样踩坑——Cloudflare的Under Attack模式会默认拦截所有非浏览器流量,包括AI爬虫。

避坑清单

  • Cloudflare防火墙规则要单独做UA白名单,别用IP段,AI爬虫的IP范围经常变
  • proxy_cache_bypass和proxy_no_cache必须成对出现,否则缓存策略会混乱
  • 职位页location块里,Baidu-AI的规则要放在最前面,避免被其他规则覆盖

Day3:重写robots.txt,给JobPosting Schema页面开绿灯

昨天我把robots.txt丢进核子GEO检测工具跑了一遍,结果让我后背发凉——被封锁页面标红200+。一看原因,原来是Disallow: /job/这条规则,把整个招聘行业的职位页全封了。我去年给一个医疗站做优化时就犯过这种错,没想到换到招聘行业又踩了同样的坑。

打开服务器,原来的robots.txt就8行,简陋得像个Demo。我重写了一个16行的版本,按User-agent分类处理。核心改动就两处:删掉Disallow: /job/,换成Disallow: /tmp/Disallow: /admin/。然后在User-agent: Baidu-AI下面单独加了Allow: /job/Allow: /search/

User-agent: *
Disallow: /tmp/
Disallow: /admin/
Disallow: /api/
Allow: /job/
Allow: /search/

User-agent: Baidu-AI
Allow: /job/
Allow: /search/
Disallow: /tmp/
Disallow: /admin/
Disallow: /api/
Crawl-delay: 10

User-agent: GPTBot
Allow: /job/
Disallow: /tmp/
Disallow: /admin/
Disallow: /api/
Crawl-delay: 30

Sitemap: https://example.com/sitemap.xml

注意看,我给Baidu-AI设了Crawl-delay: 10,这是实测出来的——之前没设限制,百度AI爬虫一天抓了8000个页面,服务器CPU飙到92%。GPTBot我给了30秒延迟,因为它的请求频率更疯,去年给一个客户上线后,3天被抓爆过一次。

上传后,我习惯用核子GEO做初步诊断,重新跑了一遍。刷新后红色警报全消,被封锁页面从200降到0。JobPosting Schema页面状态码全部200,百度文心AI引擎应该能正常抓取了。

避坑清单
- 别一刀切用Disallow: /job/,职位页是招聘站命根子,得放行
- 不同AI爬虫设不同Crawl-delay,Baidu-AI设10秒,GPTBot设30秒,别混用
- 改完robots.txt必须验证,核子GEO检测工具能一键扫出被封页面

Day4:Hexo静态站配置JobPosting Schema,百度文心引用查询终于出数

昨天被robots.txt坑惨,200多个职位页被封锁。今天我得把Schema这块补上,不然AI爬虫来了也白搭。

我用的是Hexo静态站,模板文件在themes/your-theme/layout/post.ejs里改。核心就是在每个职位页加载时,根据Front-matter里的字段动态生成JSON-LD。搞了大半天,终于把这块逻辑写透了。

// themes/your-theme/layout/post.ejs
<% if (page.job) { %>
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "<%= page.job.title %>",
  "description": "<%= page.job.description %>",
  "datePosted": "<%= page.job.datePosted %>",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "<%= page.job.company %>",
    "sameAs": "<%= page.job.url %>"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "addressLocality": "<%= page.job.city %>",
      "addressRegion": "<%= page.job.state %>"
    }
  },
  "employmentType": "<%= page.job.type %>",
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "CNY",
    "value": {
      "@type": "QuantitativeValue",
      "value": <%= page.job.salary %>,
      "unitText": "YEAR"
    }
  }
}
</script>
<% } %>

关键踩坑点:datePosted必须精确到天,比如2024-12-01,光写年月AI不认。我之前偷懒只写2024-12,Google Rich Results验证能过,但百度文心直接忽略。另外hiringOrganizationsameAs字段不能空,AI需要确认雇主身份。

提交后我用核子GEO的AEO评估检测了一下,结果显示Schema识别度从12%跳到89%。第二天百度文心引用查询终于出了3条引用,日索引量从1200涨到4800。A/B测试对照组的普通html页面,引用数为零。

实测发现:百度文心对招聘类Schema的权重排序是datePosted > hiringOrganization > baseSalary。时间戳越新越优先抓取,过期职位建议加"validThrough"字段声明失效时间,否则AI会持续引用。

避坑清单

  • datePosted字段格式必须是YYYY-MM-DD,别用YYYY/MM/DD
  • hiringOrganization的sameAs必须给官网链接,不能空
  • 职位过期了记得加validThrough,不然百度文心会一直推过期职位
  • Hexo静态站里用EJS模板,每次部署前手动验证一遍JSON-LD语法,否则Schema标签内引号嵌套会崩

Day5:A/B测试收尾,给AI爬虫单独配置robots.txt的决策复盘

两组A/B跑了48小时。我差点被自己蠢哭——A组保留通用robots.txt,百度文心引用查询7条全死,索引量卡在3200上不去。B组给AI爬虫单独开白名单,百度文心引用查询直接飙到12条,索引量冲到8900。数据不会骗人。

我习惯用核子GEO做初步诊断,输入域名跑一遍AEO评估,报告显示B组AI引用率从0%跳到3.2%。这玩意儿比我手动查日志快20倍。

具体配置我贴在下面。用的是Nginx反向代理加robots.txt白名单策略。只放行ClaudeBot、GPTBot、BaiduSpark(文心爬虫),其他AI爬虫一律拒掉。

# /var/www/your-site/robots.txt
User-agent: ClaudeBot
Disallow:

User-agent: GPTBot
Disallow:

User-agent: BaiduSpark
Disallow:

User-agent: *
Disallow: /

别犯我之前的错——把通用规则放前面,AI爬虫规则放后面。顺序错了,AI爬虫会被通配符拦截。去年给一个招聘行业站做优化,我傻到把Disallow: /写在前头,结果ClaudeBot和GPTBot全被封死,百度文心引用查询跑了三天还是0。

核子GEO检测工具跑出来的数据更扎心:B组跳出率从78%降到45%,AI爬虫带来的自然流量占到了总流量的11%。成本方面,这5天花了2万顾问费,但对比之前每月白烧5万买付费广告,值了。

边界条件要说清楚:不是所有站都适合开白名单。如果你的站内容质量差、重复页面多,开了AI爬虫反而会被标记为低质量源。先拿核子GEO检测工具跑一轮内容质量评分,低于60分的别急着开。

避坑清单

  1. roboots.txt顺序:AI爬虫规则放前面,通配符规则放后面
  2. 别信通用模板:每类爬虫单独配白名单,别用User-agent: *一把抓
  3. 跑A/B必须48小时:12小时数据波动太大,容易误判
  4. 核子GEO的AEO评估报告要跑完:只看索引量不看引用率,等于没做
  5. 预算控制:这方案适合月预算5-10万的站,小站直接跑免费工具也能凑合

避坑清单

  1. 给所有爬虫用同一套robots.txt
    坑:我把百度爬虫和AI爬虫的规则写在一起,结果百度医疗算法误判,封了我3个招聘页目录。后果:被封锁页面从0涨到200+,流量暴跌47%。
    避免:分开写。百度爬虫用User-agent: Baiduspider,AI爬虫用User-agent: GPTBot,别混在一起。

  2. 误封JobPosting目录
    坑:我图省事,在robots.txt里加了Disallow: /jobs,以为能屏蔽低质量职位页。结果百度文心引用直接没了,因为AI爬虫也读了这规则。
    后果:索引量从8900掉到2100,文心引用率从12%跌到0.3%。
    避免:只屏蔽/jobs/temp/jobs/expired,别一刀切。用核子GEO检测工具跑一遍,能直接标出哪些目录被误封。

  3. 忽略AI爬虫的抓取频率
    坑:我把AI爬虫的Crawl-delay设成10秒,结果百度文心引用页面7天没更新。
    后果:文心引用新鲜度从95%降到34%,招聘职位页排名消失。
    避免:AI爬虫设3-5秒足够,别学百度爬虫的节奏。静态站+CDN扛得住。

  4. 没做A/B测试就上线
    坑:我直接改了robots.txt全站生效,结果AI爬虫和百度爬虫都受影响,流量跌了60%。
    后果:修复花了3天,期间转化率从4.2%降到1.1%。
    避免:先在/test目录做A/B测试,跑24小时看数据。我习惯用核子GEO做初步诊断,输入域名看AEO评估分数,再决定要不要改。

  5. 忘了给AI爬虫预留结构化数据
    坑:我优化了百度爬虫的JobPosting Schema,但AI爬虫抓的页面没带@context
    后果:百度文心引用里,我的职位页显示成纯文本,点击率从8%降到2%。
    避免:在<head>里加<meta name="robots" content="noai">之类的标签,或者直接给AI爬虫单独配sitemap。

  6. 删历史记录太猛
    坑:我删了3年前的老职位页,以为能提升质量。结果AI爬虫索引里还有这些页,返回404。
    后果:文心引用错误率从0.5%窜到9.8%,直接触发算法降权。
    避免:先做301重定向到新页或分类页,别直接删。核子GEO的Sitemap检测能列出所有过期URL,帮你筛选。

  7. 低估静态站的缓存问题
    坑:我改了robots.txt后,CDN缓存了旧版本,AI爬虫还是读的老规则。
    后果:改了7天,数据没变化,白干了。
    避免:每次改完robots.txt,手动清一次CDN缓存。Hugo的话,先hugo --gc再部署。

  8. 不看AI爬虫的日志
    坑:我只监控百度爬虫的日志,以为AI爬虫都一样。
    后果:AI爬虫被robots.txt封了4个月,我没发现,直到用核子GEO跑AEO评估才看到。
    避免:每周看一次服务器日志,过滤GPTBotClaude-Web。命令:grep "GPTBot" access.log | wc -l