AI 爬虫月度 SEO 巡检不是统计“这个月来了多少 bot”,而是每月用同一批核心 URL 和同一套证据,确认 robots、状态码、页面正文、安全拦截和配置变更有没有异常。没有访问记录,不等于被拦;有访问记录,也不等于已经被引用。
这篇只讲 AI 爬虫月度 SEO 巡检流程。
它是已上线外贸站的周期性复查,不是上线前一次性验收,也不是 AI 可见性效果报表。
先确定巡检周期和触发式加查
月度是企业内部运维建议,不是 Google、OpenAI、Perplexity 或 Anthropic 规定的统一频率。
可以固定一个时间范围,例如:
统计周期:
2026-08-01 00:00:00 +08:00
至
2026-08-31 23:59:59 +08:00
以下变化发生后,不要等到下个月:
| 触发事件 | 为什么要立即加查 |
|---|---|
| 更换主题或模板 | HTML、导航、Schema 可能变化 |
| 修改安全插件、CDN 或 WAF | 公开页可能被新规则挑战 |
| 修改 robots.txt 或 sitemap | crawler 入口发生变化 |
| 域名、语言目录或 URL 迁移 | 旧入口和新入口可能断开 |
| 新增产品目录或资料页 | 公开内容范围发生变化 |
| 出现 403、429、5xx 或挑战页 | 可能已经影响访问 |
第一步:固定一批核心 URL
每月不要临时挑 URL。固定一份样本,才能和上月比较。
https://www.example.com/
https://www.example.com/products/
https://www.example.com/products/industrial-valve/
https://www.example.com/faq/
https://www.example.com/case-studies/
https://www.example.com/about/
https://www.example.com/request-a-quote/
https://www.example.com/de/products/industrial-valve/
https://www.example.com/fr/products/industrial-valve/
建议至少覆盖:
| 类型 | 样本要求 |
|---|---|
| 首页 | 1 个 |
| 产品分类 | 1 个 |
| 产品详情 | 2 至 3 个不同系列 |
| FAQ / 案例 | 各 1 个 |
| About / Factory | 1 个 |
| RFQ 说明页 | 1 个 |
| 多语言 | 每种主要语言至少 1 个公开页面 |
固定样本不等于全站审计。它的作用是快速发现本月变化。
第二步:查 robots.txt 和 sitemap
先把线上文件保存为证据,不要只看后台插件预览。
SITE="https://www.example.com"
REPORT_DIR="/tmp/seo-ai-monthly-$(date '+%Y-%m')"
mkdir -p "$REPORT_DIR"
curl -sS \
-o "$REPORT_DIR/robots.txt" \
-w 'robots_http_code=%{http_code}\n' \
"$SITE/robots.txt" |
tee "$REPORT_DIR/robots-status.txt"
curl -sS \
-o "$REPORT_DIR/sitemap.xml" \
-w 'sitemap_http_code=%{http_code}\n' \
"$SITE/sitemap.xml" |
tee "$REPORT_DIR/sitemap-status.txt"
再做人工对照:
| 项目 | 本月检查 |
|---|---|
| robots.txt | 是否可访问、是否出现新规则 |
| 公开目录 | 产品、FAQ、案例、多语言路径是否被误挡 |
| sitemap | 地址、状态、规范 URL 是否变化 |
| 测试和私密路径 | 是否意外进入公开 sitemap |
robots 规则只能作为抓取偏好,不是客户资料的访问控制。
第三步:批量查核心 URL 状态
URLS="core-urls.txt"
while IFS= read -r url; do
[ -z "$url" ] && continue
case "$url" in \#*) continue ;; esac
curl -sS -L \
-o /dev/null \
-w '%{url_effective}\t%{http_code}\t%{num_redirects}\t%{content_type}\t'"$url"'\\n' \
"$url"
done < "$URLS"
重点不是追求所有页面都 200,而是按页面类型判断:
| 结果 | 公开产品页 / FAQ / 案例 | 后台 / 提交 / 私密文件 |
|---|---|---|
200 |
通常继续看正文 | 不代表应该公开 |
301 |
检查是否为预期永久迁移 | 检查是否泄露目标 |
403 / 401 |
查是否误拦公开页 | 可能是正常保护 |
429 |
查限速是否误伤 | 需看业务动作 |
5xx |
进入故障处理 | 进入故障处理 |
不能把“公开页返回 200”写成“已经被 AI 引用”,也不能把“本月没有 bot 日志”写成“平台一定没来访问”。
第四步:查页面正文,不只查状态码
同样是 200,可能是产品正文,也可能是挑战页、空壳模板或错误提示。
URL="https://www.example.com/products/industrial-valve/"
BODY="/tmp/monthly-page.html"
curl -fsSL \
-A "Mozilla/5.0" \
"$URL" \
-o "$BODY"
grep -Ein \
'model|material|specification|application|certification|moq|lead time|rfq|quote' \
"$BODY" |
sed -n '1,40p'
if grep -Eqi 'access denied|challenge|enable javascript|checking your browser' "$BODY"; then
printf 'ANOMALY\tchallenge_or_js_marker\t%s\n' "$URL"
fi
每月可以只检查几个稳定的正文标记:
| 页面类型 | 标记示例 |
|---|---|
| 产品页 | 型号、材质、应用、规格 |
| FAQ | 问题标题、答案段落 |
| 案例页 | 行业、项目背景、产品名称 |
| RFQ 页 | 产品范围、提交说明、响应流程 |
标记要按实际页面改,不要把示例关键词当成所有外贸站的固定标准。
第五步:从日志和安全事件找变化
日志是证据来源之一,不是平台引用报告。
ACCESS_LOG="/var/log/nginx/access.log"
AI_UA_REGEX='GPTBot|OAI-SearchBot|ClaudeBot|PerplexityBot|Googlebot|bingbot'
rg -Eai "$AI_UA_REGEX" "$ACCESS_LOG" |
awk -F'"' '{
split($2, req, " ");
split($3, res, " ");
print res[1] "\t" req[1] "\t" req[2];
}' |
sort |
uniq -c |
sort -nr
单独筛异常状态:
rg -Eai "$AI_UA_REGEX" "$ACCESS_LOG" |
awk -F'"' '{
split($2, req, " ");
split($3, res, " ");
if (res[1] ~ /^(401|403|406|429|500|502|503)$/)
print res[1] "\t" req[1] "\t" req[2];
}' |
sort |
uniq -c |
sort -nr
安全插件或 Cloudflare Security Events 里要对照:
| 字段 | 月度记录 |
|---|---|
| 动作 | Block、Challenge、Rate Limit、Allow |
| 规则 ID | 是否本月新增或变更 |
| URL | 是否命中公开核心页 |
| 状态码 | 边缘和源站是否一致 |
| User-Agent | 只作为线索 |
| 请求 ID / Ray ID | 是否能和其他日志串联 |
Security Events 可能是事件视图或抽样数据,不能替代完整访问日志。没有事件,也不等于没有请求。
第六步:把“巡检结果”分成五类
不要只写“正常 / 异常”,否则下个月无法复盘。
| 结果类型 | 解释 |
|---|---|
| 访问正常 | 请求到达,公开页返回预期内容 |
| 公开页被拦 | 公开 URL 出现 403、429、挑战或空 HTML |
| 受保护路径被拦 | 后台、提交、上传等路径出现预期拒绝 |
| 本月未观察到访问 | 当前日志范围未发现线索,不推断平台行为 |
| 请求成功但内容异常 | 状态正常,正文、语言、canonical 或模板异常 |
其中“受保护路径被拦”不应自动开白名单;它可能正是安全策略正常工作的证据。
第七步:做月度记录和责任分工
CSV 表头可以直接作为团队月报或工单附件:
检查日期,责任人,站点,环境,URL,页面类型,语言,robots状态,sitemap状态,状态码,响应类型,AI爬虫线索,安全动作,规则ID,正文是否存在,异常描述,处理人,处理期限,复测日期,复测结果,证据位置
一行记录至少要回答:
- 哪一天、谁检查的
- 检查哪个 URL、属于什么页面
- 看到了什么请求线索
- 哪一层做了什么动作
- 这是应该保护的路径,还是误伤了公开页
- 谁负责处理、什么时候复测
可以把责任分成三类:
| 角色 | 负责什么 |
|---|---|
| SEO | 样本 URL、页面类型、正文和 robots/sitemap |
| 安全负责人 | 插件、WAF、规则 ID、动作和风险 |
| 开发 / 运维 | 源站响应、模板、日志和回滚 |
第八步:建立月度对比,而不是追求漂亮 KPI
每月只对比自己站点的基线:
| 对比项 | 记录方式 |
|---|---|
| 新增异常 | 本月第一次出现 |
| 持续异常 | 上月未解决,本月仍存在 |
| 已复测 | 修复后同一 URL 再查 |
| 配置变更 | 主题、插件、CDN、WAF、robots、sitemap |
| 需要加查 | 是否触发专项复查 |
不要把访问次数、User-Agent 数量或 AI 搜索出现次数当成统一 KPI。它们的统计口径、平台行为和日志覆盖范围都可能不同。
常见错误
| 错误做法 | 更稳的做法 |
|---|---|
| 每月临时换一批 URL | 固定核心样本,变化时再加查 |
| 只看 User-Agent 次数 | 和状态码、规则、路径、正文一起看 |
| 没有访问记录就判定被拦 | 标记为“本月未观察到访问” |
| 公开页和后台用同一判断标准 | 按页面风险分层 |
| 修复后不留复测日期 | 每条异常必须有处理人和复测结果 |
| 把巡检结果写成 AI 引用报告 | 把日志证据和可见性监测分开 |
AI 爬虫月度 SEO 巡检的价值,是让一次性的访问问题变成可追踪的运维记录。每个月检查同一批页面、保留同一类证据,团队才知道问题是新出现、持续存在,还是已经复测通过。
参考资料
- Cloudflare: Verified bots
- Cloudflare: Security Events
- Cloudflare: HTTP requests logs
- Google: Verify Googlebot and other Google crawlers
- Google: Introduction to robots.txt
- Google Search Console: Crawl Stats report
- OpenAI: Overview of OpenAI crawlers
- Perplexity Docs: Perplexity crawlers
- Anthropic Help Center: Anthropic crawlers and robots.txt