# AI 爬虫政策研究 v2.0：方法与数据字典

本版本保留原 1,000 域名队列，重新采集 2026-11-10 01:04:31.278 至
01:18:54.938 UTC 的 robots.txt、根目录 llms.txt 和主页。共 3,045 次资源尝试、
5,443 次 HTTP 请求（含重定向），没有调用付费 AI API。

## 样本来源与可比性

已恢复原 Tranco 永久榜单 ID 94P72，榜单日期为 2026-11-07；永久下载的 CSV 与原榜单
归档逐字节相同，最终队列的全部域名和排名均核对一致。来源、指纹及 v1.1 CSV 校验值
记录在 provenance.json 中。保留原有筛选偏差，不称为随机样本、1,000 家公司或全部
真实内容网站，不根据新政策结果换站。按相同最终 robots URL 的分组只作别名敏感性检查。

## 请求和解析

统一研究 UA，10 个线程，同一主机最多一个并发请求，socket 超时 10 秒；最多跟随五次
正式重定向，对临时错误或网络问题最多重试一次，尊重 Retry-After。超过 60 秒的等待
延期处理，不提前重试。不使用浏览器 UA 回退、不绕过挑战、不以独立 HTTP 请求替代
HTTPS 政策；正式重定向的 HTTP 终点会单独计数。传输及解压正文各限 1 MiB，截断保持未知。
使用客户端现有网络/代理路由，未独立确认出口地域或直连源站行为。

分离请求结果、正文分类、根路径声明规则及 RFC 默认处理。4xx 允许访问的协议默认，
以及 5xx/网络不可达时假定禁止的协议默认，均不计为主动声明的 Allow/Disallow。
成功的 HTML、明确错误文本、未知编码、截断及无法识别文本不进入主要分母；空文件、
纯注释和仅有已知扩展记录的文件可以分析。JSON 含冒号不等于有效 robots 文件。

产品标识完整匹配且不区分大小写；同名分组合并，找不到具名组才回退通配组；支持
百分号编码与 UTF-8 归一化、BOM、*、$、最长模式及同长度 Allow 优先。无效 User-agent
仍建立分组边界，防止它的规则泄漏到前一个通配或具名组。只有无效标识的文件保持未知。
规则要求以 / 开头。twitter.com、x.com 的 Google-Extended 使用非标准 Disallow: *，
严格解析不将该行算作受支持的根路径禁止，Google 宽松解析器则禁止。这两个差异完整
披露；两种实现的主指标均为 249/854（29.2%）。对照覆盖 11,956 个判定，不等于所有
供应商行为一致或完整 RFC 认证。

采集时分类是临时值，最终脚本对所有归档正文统一重算，不修改原始记录。
metrics.json 的 collector_to_analysis_reclassifications 列出所有分类、分组及政策变化。

## llms.txt 与分类边界

正文保留并核对根目录响应，将成功返回、可读文本及最低 H1 结构候选分别处理；
MIME 不是唯一判据，HTML 和错误页不算候选。H1 只是所核对提案的最低要求，不代表
完整格式有效、供应商采用、全网采用率或引用提升。未测子路径文件。交叉表只用本次
窗口；未知组不并入未检出组，也不推导因果关系。

全部域名采集主页，补齐此前四个缺失审计。自动 content_candidate 等标签只是待复核
观察，不是资格判断。sample-review.csv 专门审核历史 12 个全标识受限域名及四个替换
域名，保留拒绝访问、脚本门槛和空白站的未解决状态。这不是代表性的站点类别分布。
不会机械删除原先审计的 326 个非 content_site 域名。成人站启发式只检查完整标签，
不会因为 Essex、Sussex、Middlesex 含 sex 子串而排除。

## 数据字典

- domain/rank：冻结域名和原始排名；不重新排名。
- robots/llms_status：选中尝试的 HTTP 状态，网络失败为 0。
- robots/llms_fetch_state：success、not_found（404/410）、other_4xx、server_error、
  network_error、redirect_limit、other_status。
- robots/llms_body_kind：规则、部分无效规则、空/纯注释、已知扩展、HTML/挑战、错误文本、
  截断、编码异常、无法识别文本，或 llms 最低 H1 候选/非候选；不覆盖非成功状态。
- selected_attempt/final_url/body_sha256/content_type：同一次最终尝试的编号和元数据。
- robots_analyzable：主要分母标记；146 个不可分析域名仍保留在 CSV 中。
- protocol_default：请求结果的 RFC 默认处理，与声明规则分开。
- 各标识_policy：allow、disallow、no_applicable_rule、no_file、unknown；仅 disallow 进入
  受限分子。未命中规则不代表实际已访问；_source 为 named、wildcard 或 none。
- llms_observation：minimum_h1_candidate、observed_non_candidate、root_not_found、unknown。
- home_observation/home_title/home_final_url：主页观察标签及响应元数据，不等于已确认业务分类。
- adult_label_review_flag：完整标签启发式，仅作待复核提示，不排除固定样本。

__usage_ai-training、Content-Signal、旧 Claude token 的字符串出现和语法记录分别统计，
不把出现次数当作对所有供应商有效的证明。供应商元数据的原核对日期继续保留，未核对
的日期仍为空，不伪造本轮重新验证记录。

## 证据与离线复算

公开 ZIP 含所有 robots/llms 尝试的传输和解压正文、时间、重定向、重试原因及哈希；
相同传输/解压文件通过 body-aliases.json 去重，分析器读取时仍验证各自哈希。原采集配置
保留为 collection-run-original.json，公开 run.json 明确标注主页仅提供元数据。
主页 HTML 留在本地研究归档；公开标签可重复计数，但不能用公开 ZIP 独立审查主页正文。

解压后运行（Python 3.10+，无网络请求）：

```
python3 analyze.py --run evidence --output ../rebuilt-v2.0
```

metrics.json 与 sites.csv 应逐字节一致。输入证据有独立 manifest，公开 manifest 则包含
数据包等所有发布文件的哈希（不包含 manifest 自身）。派生测量数据为 CC BY 4.0，
第三方正文保留其原有权利；分析代码采用 MIT。

v1.1 保持冻结：261/891（29.3%）；v2.0 为新窗口：249/854（29.2%）。时间、UA 和校验方法
都发生变化，即使固定共同可分析域名，也不能把差异全部归因为网站主动改变政策。

方法来源：[RFC 9309](https://www.rfc-editor.org/rfc/rfc9309)、
[Google robots 解析器](https://github.com/google/robotstxt)、[Tranco](https://tranco-list.eu/)、
[llms.txt 提案](https://llmstxt.org/)。供应商逐项来源见 bots.json。
