搜尋抓取

條件請求與更新信号:304 响應如何减少重复抓取

蜘蛛的訪問次數有限,很多站点的問题不是蜘蛛不来,而是它反复抓取長期未變的頁面。本文從日誌里的 304 响應说起,讲清 Last-Modified、ETag 的寫法细节、多节点一致性、Sitemap lastmod 與實际改動對齐,以及如何核對抓取节奏與更新节奏的错位。

搜尋抓取

條件請求與更新信号:304 响應如何减少重复抓取

蜘蛛的抓取次數是一種有限资源。很多站点遇到的並不是“蜘蛛不来”,而是它把訪問額度花在了一批長期没有變化的頁面上——每次到訪都返回同样的内容,等于白跑一趟。减少這類空趟,條件請求和更新信号是两個可以立刻動手的地方。

為什么蜘蛛會反复抓取没有變化的頁面

搜尋引擎並不知道某個頁面什么时候改了内容,它只能靠两條线索:一是頁面自己给出的更新信号(Last-Modified、ETag),二是歷史抓取记錄里观察到的變化频率。如果頁面既不给更新信号,又曾经在某個時間段频繁變動過,蜘蛛往往會保持一段時間的較高訪問频率,直到多次確認“没什么變化”才慢慢降低。

所以問题通常不在爬虫,而在响應头里缺少判断依據。

條件請求在日誌里長什么样

当抓取端带上 If-Modified-SinceIf-None-Match 請求头,而服務器判断资源未變化时,會返回 304。這類记錄在日誌里很有辨识度:

  • 304:资源未變化,服務器不回传正文,抓取成本最低。
  • 200 且带 Last-Modified 或 ETag:正常回传内容,同时给出了下次判断的依據。
  • 200 且没有任何缓存相關响應头:每次都要完整回传正文,重复抓取的成本最高。
核對时不必追求 304 比例多高,只要確認重要頁面的响應头里确實存在可用的更新信号即可。完全没有信号的站点,才需要優先處理。

Last-Modified 與 ETag 的寫法细节

Last-Modified

時間要真實反映内容改動的時間。常见的問题有两類:一是由程序在每次請求时動態生成目前時間,導致這個字段永遠在變,等于告诉蜘蛛“頁面刚刚改過”;二是内容明明更新了,字段却不動,让蜘蛛誤判頁面静止。前者會造成高频回訪,後者會让新内容迟迟不被重抓。

ETag

ETag 是内容指纹。多节点部署时尤其要注意:如果同一份内容在不同节点上算出不同的 ETag,抓取端每次拿到都不一样,就會一直走 200 全量回传,條件請求形同虚设。核對方法是分別向不同节点請求同一地址,比對响應头里的 ETag 是否一致。

Sitemap 的 lastmod 要與實际改動對齐

把整站的 lastmod 批量刷成当天,短期看似“提醒了蜘蛛”,實际會让這個字段失去參考價值——当所有地址都顯示同一時間,抓取端無法区分谁真的更新了。更稳妥的做法是按栏目维護:更新频繁的列表頁、詳情頁如實填寫,長期不變的規則頁、關于頁保留原始時間即可。

更新节奏與抓取频次的错位

日誌里经常能看到一種错位:栏目頁一周更新多次却很少被抓,而某個几年没動過的說明頁每周都被訪問若干次。

  • 高频更新頁面:值得让蜘蛛多来,需要清晰的更新信号與稳定的内鏈入口。
  • 長期不變頁面:可以让它安静待着,不必人為制造變動迹象。

如果發現低價值頁面占用明顯偏多的抓取次數,可以先检查它是否带上了動態的 Last-Modified,或者被大量内鏈反复指向。

核對清單

  1. 抽取一周日誌,統計同一地址的重复抓取次數與响應碼分布。
  2. 检查重点頁面的响應头里是否有稳定的 Last-Modified 或 ETag。
  3. 多节点环境下比對同一地址的 ETag 是否一致。
  4. 核對 Sitemap 中 lastmod 與内容實际改動日期是否吻合。
  5. 观察長期不變頁面是否仍被高频抓取,找出原因再决定是否調整。

這些調整不會立刻带来可见的變化,但它們影响的是抓取资源被用在了哪里。把重复抓取降下来,空出来的次數才有机會落到真正需要被發現的地址上。