為什么要先分清真蜘蛛和假蜘蛛
蜘蛛池入口頁的日誌里,每天都會出現大量带着蜘蛛 UA 的請求。有些是真的搜尋引擎爬虫,有些是采集脚本、掃描器或者竞争對手的探测。如果不加区分就一律当成“蜘蛛来了”,很容易得出错誤的结论:以為抓取量在涨,實际只是噪声;以為某個入口頁被反复抓取,其實只是別人在批量掃描你的連結。
更麻烦的是反向問题——為了防掃描,不少站長直接用 UA 關鍵詞封禁,结果把真蜘蛛也挡在了门外。识別蜘蛛真伪的意义,就是让放行和拦截都有依據,而不是凭感觉。
三種驗證手段,優先級並不相同
第一层:User-Agent 只能做初筛
UA 是最容易看到、也最容易伪造的字段,任何脚本都能把 UA 改成 Googlebot 或 Bingbot。所以 UA 只适合做第一层過滤:先把明顯不是蜘蛛的請求排除掉,剩下带蜘蛛 UA 的,再進入下一层驗證。
實操上建议把 UA 匹配寫成白名單而不是黑名單,同时记錄完整的 UA 字符串,方便後續和官方公布的 UA 列表比對。搜尋引擎會不定期更新 UA,注意別把舊版本的 UA 直接判成假蜘蛛。
第二层:反向 DNS 双向驗證
主流搜尋引擎的官方文档里通常會說明驗證方式,其中最常见的是反向 DNS:對来源 IP 做一次 PTR 查询,看解析出的域名是否属于官方網段(例如 Googlebot 對應的 googlebot.com / google.com,Bingbot 對應的 search.msn.com)。
關键在于要做双向驗證:先反查 IP 得到域名,再對這個域名做一次正向解析,確認解析结果能回到同一個 IP。只做單向反查,容易被伪造的 PTR 记錄骗過去。
第三层:IP 段比對
搜尋引擎一般會公布爬虫使用的 IP 段列表,可以定期拉取並與日誌中的来源 IP 比對。這一层最准,维護成本也最高,因為 IP 段會變動。它更适合抓取量較大、需要精细区分来源的场景。
三层驗證不必全上。入口頁數量不多、日誌量不大时,UA 白名單加一次反向 DNS 通常就够用;只有当誤封會带来明顯损失时,才值得投入精力维護 IP 段。
常见的几個誤区
- 只看 UA 就封 IP。共享 IP、CDN 回源、代理轉發都可能让真蜘蛛的請求带上非官方 IP,直接按段封禁容易誤伤。
- 把反向 DNS 失敗等同于假蜘蛛。部分中小搜尋引擎或新爬虫没有公開的驗證方式,反查失敗並不代表一定是伪造。
- 忽略 CDN 與反向代理。入口頁前面如果挂了 CDN,日誌里记錄的可能是 CDN 节点 IP,必须從 X-Forwarded-For 等头部取原始地址,否則整套驗證都建立在错誤的 IP 上。
- 只拦不记。被拦掉的請求如果不留日誌,後面想复盘“是不是誤杀了”就没有依據。
落地建议
- 日誌中至少保留:時間、来源 IP、完整 UA、請求 URL、狀態碼、响應時間。
- 寫一個每日任務,把带蜘蛛 UA 的請求抽出来做反向 DNS 驗證,结果分成“確認蜘蛛”“待定”“疑似伪造”三档。
- “待定”這一档先別急着封,观察它的行為:是否遵守 robots.txt、是否只抓入口頁、請求频率是否異常。
- 確認為真蜘蛛的 IP 段,可以在限速規則里單獨放行,避免统一的频率限制影响正常抓取。
- 每隔一段時間复核白名單,清理已经失效的 UA 與 IP 段。
把识別這一步做扎實之後,日誌里的數字才可信,後續判断入口頁该扩還是该收,才有站得住脚的依據。