做蜘蛛池和站点运营的人,几乎每天都會看訪問日誌。日誌里出現 Baiduspider、Googlebot、bingbot 之類的 UA 时,很多人的第一反應是“搜尋蜘蛛来了”。但 UA 只是一個 HTTP 請求头字段,任何人寫几行代碼就能伪造。僅凭 UA 判断,很容易把普通爬虫、采集程序甚至掃描工具当成搜尋蜘蛛,從而對抓取情况做出错誤判断。
為什么 UA 不能單獨作為判断依據
User-Agent 由客戶端自行填寫,服務端無法强制约束。常见的誤判有几種:
- 采集工具直接照抄搜尋引擎 UA,日誌里看起来和真蜘蛛一模一样;
- 安全掃描器為了降低被拦截概率,也會伪装成搜尋引擎;
- 某些 CDN、监控、预渲染服務同样會带上類似 UA。
反過来也成立:真蜘蛛有时會使用移動版 UA 或带版本号後缀的 UA,如果只匹配固定字符串,反而會漏判。
第一步:反向 DNS 回查
主流搜尋引擎都支持用反向 DNS 驗證来源。做法是先拿訪問日誌里的 IP 做一次反向解析,看域名是否属于對應搜尋引擎的官方域;再把解析出来的域名做一次正向解析,確認能回到同一個 IP。
- Baiduspider:反向解析结果一般落在 baidu.com 相關域下;
- Googlebot:一般落在 googlebot.com 或 google.com 下;
- Bingbot:一般落在 search.msn.com 相關域下。
两步都通過,才基本可以確認。只做反向解析、不做正向回查,仍然可能被伪造的 PTR 记錄骗過。可以用 host、dig -x、nslookup 等命令手工驗證,規模大时再考虑脚本批量處理。
第二步:看 IP 段归属
搜尋引擎官方通常會公布自己的爬虫 IP 段,以 JSON 或文本形式提供。把日誌 IP 和官方段做比對,比逐個反查更快。需要注意的是,IP 段會更新,最好定期重新拉取,不要用一份几年前的副本長期比對。
如果服務器前面有 CDN 或反向代理,日誌里记錄的可能是 CDN 节点 IP,而不是真實来源 IP。這时要先確認是否讀取了 X-Forwarded-For 之類的头部,否則校驗的對象就错了。
第三步:看行為特征
IP 和 DNS 都难以確認时,行為特征可以作為辅助參考:
- 真蜘蛛通常有相對稳定的抓取节奏,請求間隔比較規律,不會在短時間内把全站打一遍;
- 會讀取 robots.txt 並遵守其中的 Disallow 規則;
- 請求头比較完整,一般會带 Accept、Accept-Encoding 等字段;
- 不會主動提交表單、登入、点击广告,也不會掃描常见後台路径。
行為特征只能作為參考,不能單獨下结论,尤其是流量小的站点,样本太少时判断容易失真。
發現伪装爬虫之後怎么處理
先分清影响:如果只是普通抓取,占用带宽有限,可以直接忽略;如果频率高到影响服務器,再考虑處理。
- 在 WAF 或 Nginx 层按 IP、频率、UA 组合做限速;
- 對確認伪造搜尋引擎 UA 的 IP 單獨封禁,別誤伤真蜘蛛 IP 段;
- 保留一段時間的日誌,方便回溯封禁是否誤伤;
- 不要因為出現伪造 UA 就整体屏蔽搜尋引擎 UA,那样會连带把真蜘蛛挡在外面。
對蜘蛛池运营的實际意义
蜘蛛池的效果判断,很大程度上依赖日誌。如果把伪装爬虫当成搜尋蜘蛛,很容易得出“入口頁被抓了很多次”的结论,但目标 URL 迟迟不收錄;反過来,如果把真蜘蛛誤判為伪装,又可能封掉真正带来抓取的机會。所以校驗這一步值得做扎實,而不是只看 UA 字符串。
日誌是判断抓取情况的基础,但日誌里的 UA 只是线索之一。IP、DNS、行為三者交叉驗證,结论才更可靠。