做蜘蛛池时,入口页的任务很单纯:让搜索蜘蛛成功抓到页面,再顺着页面里的链接走到目标 URL。多数人检查入口页时只看状态码和页面内容,很少去看响应头里的 Content-Type。但恰恰是这个字段,会让一个看起来正常的入口页在抓取端被当成非 HTML 资源处理,链接也就不再被解析。
搜索蜘蛛是怎么判断这是个网页的
抓取器拿到一次响应,处理顺序大致是:先看状态码,判断能不能继续;再看响应头,判断这是什么类型的资源;最后才决定要不要做正文抽取和链接抽取。Content-Type 就是第二步的关键依据。
如果它声明的是 HTML,抓取端会按 HTML 解析,提取正文、链接、canonical 等信息。如果声明的是图片、CSS、JSON、纯文本或二进制流,多数情况下它只把响应体当作资源存下来,不会去里面找链接。各搜索引擎的实现细节不一样,但把 HTML 页面标成非 HTML 类型,属于明显会掉链子的写法。
三种常见的错误 Content-Type
text/plain
最常见的一种。Nginx 里 default_type 配置成 text/plain,或者脚本直接输出 HTML 却没有显式设置响应头,就会返回这个类型。浏览器容错性很强,照样把内容渲染成网页,肉眼看不出来,所以很容易被忽略。
application/json、text/xml
接口和页面共用一套输出逻辑时会出现。返回的明明是一段 HTML 片段,头里写的却是 JSON 或 XML。抓取端如果按 JSON 解析,遇到常见的 div 标签大概率直接失败或跳过,链接自然不会被发现。
application/octet-stream
下载类型。一般由文件下载、对象存储回源,或者服务器没识别出扩展名时产生。抓取器通常直接当二进制文件处理,不做解析。
还有一种不算错误的错误:响应头里的 charset 和页面 meta 里声明的编码不一致,导致中文链接、参数出现乱码,解析出来的 URL 也跟着跑偏。这类问题不会让抓取停下,但会让你以为链接放对了、实际却没抓到。
怎么确认入口页的类型对不对
自查不需要额外工具,命令行的 curl 就够:
- 用 curl -I 看响应头,重点确认 Content-Type 和状态码。
- 用 curl -s 拉一遍正文,确认返回的确实是 HTML,而不是错误页或空内容。
- 拿浏览器开发者工具的 Network 面板对比一次,排除 CDN、反向代理在你和目标之间改写了响应头。
- 检查服务端配置:Nginx 的 default_type、Apache 的 AddType、PHP 的 header 设置、框架的响应封装。
- 确认响应头里没有出现两个 Content-Type,多个同名头会让抓取端的行为变得不可预期。
修的时候注意这几点
- 动态输出的入口页,显式设置 Content-Type: text/html; charset=utf-8,不要依赖服务器默认值。
- Nginx 静态入口页,确认 default_type 是 text/html,而不是 text/plain。
- 如果用了 CDN,检查回源响应头和缓存策略,确认边缘节点没有把类型改掉或缓存成旧版本。
- sitemap 用 application/xml 没问题,但别和 HTML 入口页混在同一条输出逻辑里,容易一起写错。
- 改完后再用 curl 复核一次,别只看后台配置页面。
Content-Type 只是抓取链路上的一个环节。改对它能让链接有机会被发现,但不代表目标 URL 一定会被收录,收录还取决于内容质量、站点整体情况、抓取预算和重复度等多方面因素。
小结
入口页返回 200、内容也在,但搜索蜘蛛不跟链接,先别急着怀疑蜘蛛池策略出了问题。打开响应头看一眼 Content-Type,很多时候原因就出在这一个字段上。把它改成 text/html 并带上一致的 charset,是排查成本最低、也最容易被漏掉的一步。