蜘蛛的抓取次數是一種有限资源。很多站点遇到的並不是“蜘蛛不来”,而是它把訪問額度花在了一批長期没有變化的頁面上——每次到訪都返回同样的内容,等于白跑一趟。减少這類空趟,條件請求和更新信号是两個可以立刻動手的地方。
為什么蜘蛛會反复抓取没有變化的頁面
搜尋引擎並不知道某個頁面什么时候改了内容,它只能靠两條线索:一是頁面自己给出的更新信号(Last-Modified、ETag),二是歷史抓取记錄里观察到的變化频率。如果頁面既不给更新信号,又曾经在某個時間段频繁變動過,蜘蛛往往會保持一段時間的較高訪問频率,直到多次確認“没什么變化”才慢慢降低。
所以問题通常不在爬虫,而在响應头里缺少判断依據。
條件請求在日誌里長什么样
当抓取端带上 If-Modified-Since 或 If-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,或者被大量内鏈反复指向。
核對清單
- 抽取一周日誌,統計同一地址的重复抓取次數與响應碼分布。
- 检查重点頁面的响應头里是否有稳定的 Last-Modified 或 ETag。
- 多节点环境下比對同一地址的 ETag 是否一致。
- 核對 Sitemap 中 lastmod 與内容實际改動日期是否吻合。
- 观察長期不變頁面是否仍被高频抓取,找出原因再决定是否調整。
這些調整不會立刻带来可见的變化,但它們影响的是抓取资源被用在了哪里。把重复抓取降下来,空出来的次數才有机會落到真正需要被發現的地址上。