先说结论:大多数情况下,搜索蜘蛛会先看 HTTP 响应头里的 Content-Type(以及 charset)。如果返回的不是 text/html 或 application/xhtml+xml,即使响应体里写着完整的 a 标签链接,被当作链接解析的概率也会明显下降。也就是说,入口页的链接写得再工整,内容类型标错了,前面的功夫可能白费。
为什么 Content-Type 会影响链接解析
抓取和解析大致分两步:抓取器先把 URL 取回来,再交给解析器决定用哪种方式处理响应体。解析器在很大程度上依赖 Content-Type 来判断“这是什么内容”,再决定是走 HTML 解析、XML 解析,还是只当一段文本收下。链接提取只发生在 HTML 解析这条路径上,走其他路径时,页面里长得像链接的字符串通常不会被当成待抓取的 URL。
常见的几种内容类型
- text/html:正常网页,按 HTML 解析,链接会被提取。
- application/xhtml+xml:一般也会按 HTML 处理,但要注意 XML 的严格语法,标签未闭合可能导致解析中断。
- text/plain:多数抓取器会当成纯文本,不做链接提取。
- application/json、text/xml、application/xml:通常按数据接口处理,里面的 URL 不会自动变成可抓取的链接。
- 缺失 Content-Type:不同蜘蛛、不同版本的兜底策略不一样,有的会猜成 HTML,有的直接跳过,属于不可控状态。
容易踩坑的几种情况
- 后端统一返回 application/json,正文里塞了一段 HTML 字符串,浏览器看着像页面,蜘蛛看到的只是数据。
- 服务器没有为某些扩展名配置默认 MIME 类型,返回 application/octet-stream,蜘蛛会把它当成待下载的文件。
- CDN 或反向代理改写了响应头,源站是对的,到蜘蛛这边变成了 application/json。
- 入口页是静态文件但没有扩展名,服务端默认给了 text/plain。
- 用 XML 语法写 XHTML,却声明成 application/xhtml+xml,一个未闭合标签就可能让解析停在半路。
怎么判断自己的入口页有没有问题
- 用 curl 或能查看响应头的工具请求入口页,重点看 Content-Type 这一行。注意单纯用 HEAD 请求时,有些服务器返回的头和 GET 不一致,最好直接看 GET 的完整响应头。
- 如果返回的不是 text/html,先确认是代码里手动设置的,还是服务器或网关的默认行为。
- 检查 charset 是否与实际编码一致,编码错乱也可能让解析器放弃提取链接。
- 改完后再用同一工具复测,确认响应头已经变成 text/html 且编码正确。
除了 Content-Type,还要顺带看这几项
- Content-Encoding:声明了 gzip 或 br,实际返回的却是未压缩内容,或反过来,蜘蛛都可能拿到乱码。
- Content-Length:与实际长度不符时,部分抓取器会截断响应体,排在后面的链接自然读不到。
- 状态码:Content-Type 再正确,如果是 403、404、410 或 5xx,链接解析都无从谈起。
- X-Robots-Tag:这个头一般不影响链接解析,但会影响页面本身是否被索引,别把两件事混为一谈。
入口页的核心任务是“被正确解析”,而不是“被索引”。把 Content-Type 当成第一道闸门来检查,比事后反复猜测蜘蛛为什么不抓要省事得多。
小结
入口页里的链接能不能被发现,前提是蜘蛛把它当成 HTML 来读,而 Content-Type 就是最直接的判断依据。建议把“响应头是否为 text/html 加正确 charset”加入上线前的常规检查项,尤其是入口页由后端动态输出、又经过 CDN 或网关转发时,更要留意响应头有没有被中途改写。它不保证任何收录或排名结果,但至少能保证蜘蛛看到的内容,就是你希望它看到的那些链接。