直接答案:同一批 30 家装备企业里,24 个站点可测。9 家(37.5%)在 robots.txt 里声明了 sitemap;最终 13 份 sitemap 可用(12 份 urlset + 1 份 sitemapindex,54.2%),9 份返回 404,还有 2 份返回 200 却不是 sitemap——一个是空响应,一个是 HTML 页面。12 份 urlset 的 URL 数中位 206.5 条(107–1,098),13 份可用文件全部带 lastmod。这是 pilot,不是行业基准。
前几期看的是页面本身:robots 政策、产品入口页、询盘路径。这一期看“站点如何把 URL 清单交给爬虫”。它是发现层最容易被忽略的一环,也最适合用状态码和 XML 根元素做可复核判定。
方法:每站只发两个请求
样本框沿用第 4 期:2024 年常州市首台(套)重大装备名单第 71–100 位共 30 家。30 家中 4 家未识别到官网,1 家 robots.txt 返回 502;扫描当天另有 1 家 robots.txt 返回 503,按保守规则跳过,24 家进入统计。
每站先取 /robots.txt,读出所有 Sitemap: 行;有声明就抓第一条,没有就回落 /sitemap.xml。只抓 1 个 sitemap,不递归 sitemapindex 的子文件。UA 为 LingyiResearchBot/1.0,请求间隔 6 秒、20 秒超时、不执行 JS。原始响应只存站外。
| 判定 | 规则 |
|---|---|
| 声明 | robots.txt 中 Sitemap: 行数 > 0;大小写不敏感,取冒号后第一个 token |
| 可用 | HTTP 200 且能被 XML 解析,根元素为 urlset 或 sitemapindex |
| URL 数 | urlset 下 url 节点数;index 只记子 sitemap 数,不记页面数 |
| lastmod | url 的直接子节点中是否存在 lastmod |
| 同站 | 所有 loc 的 host 与站点一致;空列表记 false |
结果一:声明与可用不是一回事
| 链路 | 数量 | 说明 |
|---|---|---|
| robots.txt 200 | 16 / 24 | 8 家 robots.txt 返回 404 |
| robots.txt 声明 sitemap | 9 / 24 | 其中 1 家一次声明 20 条(sitemapindex 的子文件) |
| 声明的 sitemap 可用 | 8 / 9 | 1 家声明了但返回 404——写了地址不等于文件存在 |
| 未声明、回落 /sitemap.xml 后可用 | 5 / 15 | 不写声明也可能有文件,但概率明显更低 |
| 回落 200 但不是 sitemap | 2 / 15 | 1 个空响应、1 个 HTML 页面 |
| 回落 404 | 8 / 15 | 直接没有这个文件 |
只看 robots.txt 会高估。声明了 9 家,可用 8 家;只看状态码又会低估——回落请求里有 2 个 200 是空响应或 HTML。两个口径都要看:声明了什么,以及拿回来能不能解析。
另一个细节:8 家没有 robots.txt 的站点里,只有 1 家仍能在 /sitemap.xml 取到可用文件。robots.txt 缺失与 sitemap 缺失高度重叠,但这不是因果——样本只能说明这批站点上两者常一起缺席。
结果二:13 份可用文件长什么样
| 特征 | 结果 |
|---|---|
| 可用文件 | 13 份:12 份 urlset + 1 份 sitemapindex |
| urlset URL 数 | 中位 206.5,最少 107,最多 1,098 |
| sitemapindex | 1 份,含 20 个子 sitemap;按方法不递归,页面数未知 |
| 带 lastmod | 13 / 13 |
| loc 全部同站 | 12 / 13;1 份全部指向同一站点的另一个域名 |
| 响应体积中位 | 27.8 KB(200 响应) |
lastmod 13/13 是一个有意思的对比:文件能取到、字段也写了,但“有 lastmod”不等于“lastmod 是新的”。本期只记录有无,不判断新旧,也不从版权年份推断——那会把“模板年份”当成“内容更新时间”。
那个全部指向另一个域名的 sitemap 也值得单独说:站点主域名与 sitemap 里列出的域名不一致时,搜索引擎会按 URL 实际所在域处理;如果两个域都能访问同一内容,就可能出现重复内容或抓取分散。本期只记录“不同站”,不判断是否配置错误。
结果三:两种“假 sitemap”
- 空响应。HTTP 200、Content-Type 写着
text/xml,但响应体 0 字节。监控只看状态码会把它算成正常。 - HTML 页面。HTTP 200、返回 10 KB 的
text/html——多半是 404 页面被软处理或前端路由兜底。解析 XML 会直接失败。
这两种情况在自动检查里最容易漏,因为“200 = 正常”几乎是默认假设。判定 sitemap 至少要看三件事:状态码、Content-Type、根元素。
五个可执行结论
- 在 robots.txt 写 Sitemap。本期声明组 8/9 可用,未声明组只有 5/15 能回落到可用文件。
- 声明后自己取一次。有 1 家声明了 404 地址;上线时没验证,爬虫也不会替你验证。
- 用 XML 根元素判定。200 +
text/xml仍可能是空文件;必须解析并检查urlset/sitemapindex。 - 检查 loc 的域名。13 份里有 1 份全部指向另一个域名,配置问题不会报错,只会分散抓取。
- 别把 lastmod 当新鲜度。全部文件都带 lastmod,但本期没有验证其真实性。
局限
- 样本非随机:单一名单、单一城市、按名单顺序抽取,24 家可测;称 pilot,不外推行业。
- 只取第一个声明:站点可能有多个分区 sitemap,本期不穷举。
- 不递归 index:
sitemapindex只记子文件数,页面数未知。 - 单次抓取:扫描当天 1 家 robots.txt 返回 503 被跳过;这类临时状态会改变分母。
- 不判断收录:可用 sitemap 与“被搜索引擎抓取/收录”无关;本期也不关联流量。
- 不点名:公开数据只有 sample_id 与字段,没有企业名、域名与文件路径。
数据与复算
匿名数据:equipment-sitemap-scan-2026.csv(24 行、15 字段,含 sample_id 与采样时间)。仓库内同时保留 docs/research/2026-11-sitemap-scan.csv。
抓取与判定脚本:scripts/sitemap_probe.py;单元测试 scripts/test_sitemap_probe.py(16 项,无网络)。运行:
python -m unittest scripts.test_sitemap_probe
配套阅读:30 家装备企业 robots 扫描(同一样本框)、robots.txt 分 bot 匹配器、12 条验收条款模板;四组数据的交叉结果见 24 个站点的四层观察。
数据来源与口径
- Sitemap 协议(sitemaps.org):sitemaps.org。
- robots.txt 与 Sitemap 声明:RFC 9309:rfc-editor.org。
- 采样时间:2026-11-01 20:41–20:46(Asia/Shanghai),UA
LingyiResearchBot/1.0,每站 2 个请求、间隔 6 秒。