很多人做蜘蛛池入口页时,把精力都花在“链接怎么写、写多少条”上,却忽略了一个更底层的问题:服务器返回的 Content-Type 是否正确。这个响应头决定了抓取程序把页面当成“网页”还是“一段文本”。如果它不对,页面里写得再清楚的链接,也可能只是普通字符串。
Content-Type 决定了页面被当成什么解析
浏览器和搜索蜘蛛拿到一个 URL,第一步先看响应头里的 Content-Type,再决定用哪种方式解析内容。常见几种情况:
- text/html:正常网页,a 标签里的 href 会被当作链接解析和跟进。
- text/plain:按纯文本处理,链接只是普通文字,通常不会被当成可抓取的 URL。
- application/xhtml+xml:按 XHTML 解析,链接一般仍然有效。
- application/json、application/xml、text/xml:按数据文件处理,里面的 a 标签不会被识别成链接。
- 缺少 Content-Type 或没带 charset:中文容易出现乱码,解析结果不稳定,链接也容易被截断。
入口页最常见的三种踩坑
1. 伪静态规则把 .html 指到了错误的后端
很多入口页是伪静态的。如果 rewrite 规则把 .html 请求转发给了一个返回 JSON 或纯文本的接口,响应头就会变成 application/json。页面看着有内容,实际对抓取端来说是一份数据文件。
2. 动态脚本没有显式设置头部
PHP、Python 等脚本默认输出 text/html,但如果前面有额外的输出,或者用了框架自带的 JSON 响应方式,头就变了。建议在输出 HTML 之前显式声明一次,不要依赖默认值。
3. 模板文件后缀不常见,被服务器按默认类型返回
有些站点把入口页存成 .tpl、.txt、.dat 再通过规则输出。如果服务器没配好对应类型,返回的可能是 text/plain。这种情况下浏览器里看到的是一堆带标签的纯文本,链接自然也不会被跟进。
怎么快速自查
- 用命令行只看响应头,确认状态码是 200,且 Content-Type 是 text/html。
- 浏览器打开入口页,查看网页源代码或响应信息,看类型和编码是否正常。
- 把入口页和一个正常页面做对比:如果入口页返回 200,但抓取日志里始终没有目标 URL 的记录,就要怀疑解析环节。
- 检查源码里的链接是不是真的写成了 a 标签,而不是按钮、脚本或注释里的文字。
修正方向
- 静态页:确认 .html、.htm 后缀被正确映射成 text/html。
- 动态页:在输出前显式设置头部和字符集,避免和模板里的 meta charset 冲突。
- 反向代理或 CDN:检查是否改写了 Content-Type,尤其是启用了“自动转换”类功能时。
- 改完后重新抓一次,先确认头部正确,再观察链接是否被跟进。
头部正确了,链接还是没被跟进怎么办
按顺序排除:页面是否有 noindex、链接是否带了 nofollow、链接是否靠 JavaScript 动态插入、链接是否写在注释或脚本块里、页面是否必须登录才能看到。这些属于“能不能解析”的问题;而抓取频次、抓取预算属于“愿不愿意抓”的问题。两类问题最好分开排查,不要在同一个环节反复改。
提醒:Content-Type 是最容易被忽略、也最容易验证的一项。排查抓取问题时,先花两分钟确认头部,往往比反复调整链接写法更有效。