做蜘蛛池的人几乎每天都會看 access log。日誌里 UA 一栏寫着 Baiduspider、bingbot 的請求往往能占一大半,看起来热度不错。但把這些請求按 IP 归一下類,問题就出来了:真正来自搜尋引擎的只占其中一部分,剩下的是掃描器、采集器,以及把自己的 UA 改成蜘蛛模样的普通爬虫。
為什么日誌里的「蜘蛛」不等于真蜘蛛
UA 字符串是客戶端自己声明的一段文本,改起来没有任何门槛。任何一個用 Python、Go 寫的爬虫,都能在請求头里填上 Baiduspider。反過来,部分正常的浏览器或中間层也可能因為配置原因带上奇怪的 UA。
這意味着两件事:一是把假蜘蛛当成真蜘蛛,會誤判入口頁的效果,觉得「蜘蛛来了但没收錄」,實际上是搜尋引擎根本没来過;二是把真蜘蛛当成假蜘蛛拦掉,入口頁铺得再多也白搭。
三種可用的识別手段
1. 逆向解析(最可靠的一层)
主流搜尋引擎都提供基于 IP 的驗證方式。基本思路是把来訪 IP 做一次反向 DNS 查询,看解析出的域名是否属于對應引擎自己的域名後缀;為防伪造,通常還要對解析出的域名再做一次正向查询,確認能指回原 IP。Google 另外公開了 Googlebot 的 IP 段列表,可以定期拉取比對。
這一层的结论最硬:IP 對不上,UA 寫得再像也不是官方蜘蛛。代價是每次請求都要查询,實际落地时一般會做本地缓存,或者只對可疑請求做校驗。
2. UA 字符串(快速過滤)
直接匹配 UA 里的關鍵詞是最省事的做法,但只能当粗筛。它适合把明顯不相關的流量先分出去,不适合作為唯一依據。還要注意移動版與桌面版蜘蛛的 UA 通常不同,別只匹配一個就以為覆盖全了。
3. 行為特征(辅助判断)
- 請求节奏:真蜘蛛的抓取通常有节流,不會在几秒内把整站刷一遍。
- 請求范围:真蜘蛛會讀 robots.txt,會顺着連結走;只盯着某几個入口頁反复刷的,多半不是。
- 請求头完整度:Accept、Accept-Encoding 等头部缺失或不合理的,值得怀疑。
- 會话特征:真蜘蛛一般不带 Cookie、不执行登入態,這一点和普通用戶差別明顯。
在蜘蛛池入口頁怎么落地
- 日誌里打全字段。至少保留 IP、UA、請求路径、狀態碼、响應時間、Referer。缺了 IP,後面所有校驗都做不了。
- 先分桶再統計。把請求按「官方蜘蛛 / 疑似伪装 / 其他」分成三類,分別統計各入口頁的抓取量。混在一起看的數字没有意义。
- 對疑似伪装做限速或拒绝。這一步以保護服務器资源為主,不必激進。
- 校驗结果回寫到监控里。按天看真蜘蛛的抓取趋势,比看總量更能反映入口頁是否還有效。
几個常见誤区
- 把 UA 当成身份。UA 是声明,不是證明。
- 拦得太狠。部分 CDN 或中間层會改寫 UA,一刀切拦截可能誤伤正常蜘蛛。
- 只看數量不看路径。真蜘蛛来了但只在首頁打轉,說明内部連結结构有問题,不是 UA 的問题。
- 用一份規則管所有引擎。不同引擎的驗證方式和 IP 段都不一样,規則要分開维護。
UA 校驗解决的是「来的是谁」,解决不了「来了之後留下什么」。它更适合作為诊断工具,而不是效果指标。
使用建议
给入口頁配一套轻量的校驗逻辑就够了:UA 粗筛 + IP 逆向解析兜底 + 行為特征做參考。把结果沉淀成按天、按入口頁的抓取曲线,長期看比任何單点判断都可靠。如果某天真蜘蛛的抓取量突然归零,先查服務器是否被墙、狀態碼是否異常,再去怀疑入口頁本身。
另外要清楚一点:识別出真蜘蛛,只說明入口頁被訪問過。入口頁的内容质量、連結指向、更新节奏,才决定蜘蛛愿不愿意繼續往下走。UA 校驗做得好,能让你少走很多冤枉路,但它本身不是效果。