蜘蛛池知识

蜘蛛池入口頁的响應头:Content-Type、字符集與 Last-Modified 怎么设

入口頁調通的标准常常是“浏览器能打開”,但蜘蛛拿到的第一手信息其實是 HTTP 响應头。字符集寫错會讀出乱碼,Last-Modified 與 ETag 设得随意會让蜘蛛誤判頁面没變,Cache-Control 配错則可能让它一直抓到舊版本。本文梳理几個最值得检查的响應头字段,以及常见寫法和排查顺序。

蜘蛛池知识

蜘蛛池入口頁的响應头:Content-Type、字符集與 Last-Modified 怎么设

很多人在調入口頁时,判断标准是“浏览器打開正常”。但蜘蛛抓取时拿到的第一手信息其實是 HTTP 响應头——頁面還没開始解析,头信息已经决定了它用什么编碼讀這段字节、要不要重新抓一遍、以及把返回内容当成 HTML 還是纯文本。头信息出错,正文寫得再規整也可能白費。

响應头是蜘蛛拿到的第一手信息

蜘蛛的流程通常是:建立连接、讀响應头、根據头信息决定是否繼續讀正文、按声明的编碼解碼、再進入解析。也就是说,编碼和缓存相關的判断都發生在正文解析之前。入口頁數量多、模板复用度高的时候,一個模板的头寫错,往往是整批頁面一起出問题,而不是單頁。

Content-Type 與字符集:乱碼多半從這儿来

最常见的寫法是 Content-Type: text/html; charset=utf-8。如果只寫了 text/html 而没带 charset,蜘蛛就得靠頁面里的 meta 声明或自行猜测,猜测失敗就是乱碼。乱碼不只是“看着难看”,它會直接影响正文提取:分词失敗、關鍵詞匹配不上,蜘蛛可能判断這一頁没有有效内容。

HTTP 头與 meta 冲突时听谁的

当 HTTP 头声明 UTF-8、頁面 meta 却寫着 GBK,两者冲突时,多數爬虫會優先采信 HTTP 头。所以出現“浏览器正常、蜘蛛乱碼”的情况,往往是因為浏览器做了更宽松的容错,而蜘蛛嚴格按头信息解碼。排查时先看头,再看 meta,两邊保持一致最省事。

几個容易踩的寫法

  • charset 寫成 utf8 或大寫 UTF8:部分解析器能容错,但没有必要冒險,規范寫法是 utf-8。
  • 文件實际是 GBK,头却声明 utf-8:這是最典型的乱碼来源,改头或改文件必须同步。
  • 把 HTML 頁面的 Content-Type 寫成 text/plain:蜘蛛可能直接跳過解析,只当成一段文本。
  • 動態頁面忘记輸出头,让服務器預設值接管:不同中間件預設值不一样,容易时好时坏。

Last-Modified 與 ETag:判断“變没變”的依據

蜘蛛不一定會每次重讀全文。它會參考 Last-Modified 和 ETag 判断這一頁是否值得重新抓取。如果模板更新了内容,但這两個字段没跟着變,蜘蛛就可能認為頁面没動,繼續沿用舊快照。

  • Last-Modified:應该反映正文最後一次實际變化的時間。用服務器目前時間或固定寫死,都會让這個字段失去意义。
  • ETag:适合做内容指纹。注意多台後端机器生成的 ETag 如果算法不一致,同一頁面在不同机器上會给出不同值,反而让蜘蛛频繁判定“已變化”。
  • 两者不是必须都设,但至少要有一個能真實反映内容變化。

Cache-Control 與 Vary:別让蜘蛛拿到舊版本

入口頁如果经過 CDN 或反向代理,Cache-Control 决定缓存多久、谁能缓存。把 HTML 頁面设成長期强缓存,内容改了但缓存没到期,蜘蛛讀到的就是舊版。Vary 則影响按什么维度区分缓存版本,配置不当可能出現给蜘蛛返回了带登入態或移動端版本的頁面。

比較稳妥的思路是:能反映内容更新的頁面用較短的缓存時間,或者配合 Last-Modified、ETag 让客戶端和爬虫有机會拿到新版本;不要把整站 HTML 都设成一年過期。

一份自查清單

  1. 用 curl -I 直接看响應头,不要只看浏览器開發者工具里被加工過的版本。
  2. 確認 Content-Type 带 charset,且與文件真實编碼一致。
  3. 確認 Last-Modified 會随正文變化而變化,而不是固定值或永遠等于目前時間。
  4. 確認 HTML 的缓存策略不會让更新長期滞後。
  5. 抽查几台後端机器返回的 ETag 是否一致。
  6. 把入口頁和普通内容頁各抽一两個样本,避免只测了其中一類。

常见誤区

  • “浏览器正常就等于蜘蛛正常”——两者容错程度不同,浏览器會猜,蜘蛛更嚴格。
  • “响應头是运维的事,和内容無關”——编碼和缓存直接决定蜘蛛能不能正确讀到内容。
  • “字段越多越保險”——寫错或互相矛盾的字段比不寫更容易出問题。
响應头不决定内容质量,但它决定了蜘蛛能不能正确讀到你的内容。先把這一层對齐,再谈结构和内容,排查效率會高很多。