常见問题

入口頁的 Content-Type 不是 text/html,搜尋蜘蛛還會解析里面的連結吗

入口頁返回 200、内容也在,搜尋蜘蛛却不跟連結,問题可能出在响應头的 Content-Type 上。本文說明搜尋蜘蛛如何判断頁面類型,列出 text/plain、application/json、application/octet-stream 等常见错誤寫法,並给出用 curl 排查與修复的具体步骤。

常见問题

入口頁的 Content-Type 不是 text/html,搜尋蜘蛛還會解析里面的連結吗

做蜘蛛池时,入口頁的任務很單纯:让搜尋蜘蛛成功抓到頁面,再顺着頁面里的連結走到目标 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 就够:

  1. curl -I 看响應头,重点確認 Content-Type 和狀態碼。
  2. curl -s 拉一遍正文,確認返回的确實是 HTML,而不是错誤頁或空内容。
  3. 拿浏览器開發者工具的 Network 面板對比一次,排除 CDN、反向代理在你和目标之間改寫了响應头。
  4. 检查服務端配置:Nginx 的 default_type、Apache 的 AddType、PHP 的 header 設定、框架的响應封装。
  5. 確認响應头里没有出現两個 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,是排查成本最低、也最容易被漏掉的一步。