入口頁明明加了新的連結,服務器日誌里也能看到蜘蛛来抓,可過了一周目标 URL 依然没有任何抓取记錄。這種情况下先別急着怀疑連結寫法,很多时候問题出在你看到的 HTML 和蜘蛛拿到的 HTML 不是同一份。
為什么會出現“日誌有抓取、連結却不更新”
搜尋蜘蛛抓取入口頁时,拿到的是 CDN、反向代理或缓存层返回的那份 HTML。如果這份 HTML 是几天前的舊版本,里面自然没有你新加的連結,蜘蛛也就無從發現新的目标 URL。日誌只會记錄“蜘蛛来過”,不會告诉你它拿到的是哪一版内容。
常见的三類缓存来源
- CDN 层缓存:HTML 被当作静態资源缓存,回源频率低于你的更新频率。
- 反向代理缓存:proxy_cache 之類的配置 TTL 較長,或者缓存規則没有按實际更新节奏調整。
- 站点自身静態化:入口頁由定时任務生成,改了源文件却没有触發重新生成。
用三步確認是不是缓存問题
- 用带時間戳參數的地址强制回源訪問入口頁,看返回的 HTML 里有没有新連結。
- 再用不带參數的普通地址訪問一次,看返回的是哪一版。两份内容不一致,基本可以确定是缓存层在起作用。
- 查看响應头里的缓存相關字段,確認 HTML 是否被标记為可缓存,以及缓存有效期有多長。
如果第一步有、第二步没有,說明源站已经更新,問题在缓存;如果第一步也没有,先去检查源站文件和静態化流程。
為什么蜘蛛拿到的内容和浏览器不一样
部分 CDN 會按 User-Agent 或請求头区分缓存,可能對爬虫請求直接回源、對普通用戶返回缓存副本,也可能反過来。所以“我在浏览器里能打開新連結”並不能說明蜘蛛也能看到。要驗證就用和蜘蛛相同的方式訪問,而不是只看浏览器结果。
處理时容易踩的两個坑
1. 用随机參數绕開缓存
有人為了避開缓存,把入口頁連結改成每次都带随机參數。這會让同一個入口頁产生大量不同 URL,抓取预算被分散,反而更慢。更稳妥的做法是刷新缓存、缩短 HTML 的缓存時間,而不是改變 URL 本身。
2. 只改了連結,没改缓存策略
如果入口頁需要经常增删連結,建议把 HTML 设為較短的缓存時間或不缓存,图片、CSS 等静態资源繼續長缓存。也可以在發布流程里加一步:更新入口頁後主動刷新對應地址的 CDN 缓存。
驗證是否恢复
- 观察入口頁的抓取日誌,看蜘蛛下一次抓取返回的字节數是否發生變化。
- 用相同的訪問方式(同样的 UA、同样的路径)對比源站與 CDN 返回的内容。
- 给新加的目标 URL 一段观察期,不要因為一天没動静就反复改動入口頁。
蜘蛛能否發現目标 URL,取决于它實际收到的那份 HTML,而不是你在後台或源文件里看到的那份。
缓存問题排查起来並不复杂,难的是先意识到它的存在。当你確認連結寫法、狀態碼、robots 規則都没問题时,缓存层值得優先检查一次。