蜘蛛池知识

蜘蛛池里的真假蜘蛛:用反向 DNS 和 IP 段把爬虫認准

入口頁每天都會收到大量訪問,其中不少請求自称搜尋引擎爬虫。本文讲清楚 UA 為什么不能單獨作為判断依據,介绍反向 DNS 双向校驗、官方 IP 段比對與行為特征三種方法,並說明日誌需要保留哪些字段、识別结果该怎么用于統計與限流。

蜘蛛池知识

蜘蛛池里的真假蜘蛛:用反向 DNS 和 IP 段把爬虫認准

為什么先要分真假

蜘蛛池的入口頁每天會产生大量訪問日誌,其中一部分来自搜尋引擎爬虫,另一部分来自各種采集器、掃描器和普通用戶。如果只按 User-Agent 里有没有 Googlebot 之類的字样来統計,很容易把抓取量算高,進而誤判入口頁是否真的在被搜尋引擎發現。把真假蜘蛛分開,目的是让統計口径更接近事實,而不是去對抗某一類流量。

UA 只是對方的一句话

User-Agent 由請求方自己填寫,任何脚本都能寫成一模一样的字符串。所以 UA 可以作為篩選條件,但不能作為结论。日誌里看到 Googlebot,只能說明“有請求自称是 Googlebot”。

三種可以叠加使用的驗證手段

1. 反向 DNS 双向校驗

主流搜尋引擎的爬虫通常有可反解的主机名,例如以 googlebot.com、search.msn.com 這類域名结尾。做法是拿訪問来源 IP 做一次反解,得到主机名後,再對主机名做一次正向解析,看结果是否回到同一個 IP。两次都能對上,可信度才比較高。只做反解而不回头驗證,容易被伪造的 PTR 记錄骗過。

2. 官方 IP 段比對

各大搜尋引擎會公布爬虫使用的 IP 段,可以定期拉取並入库,用来源 IP 直接比對。這種方式在 CDN 回源、代理轉發的场景要特別注意:日誌里记錄的可能是代理 IP 而不是真實来源,需要在服務端配置里保留真實 IP 字段,否則比對结果没有意义。

3. 行為特征

  • 抓取路径:真爬虫通常會沿着站点已有的連結走,路径分布有一定規律;掃描器更倾向于遍歷常见後台路径和敏感文件名。
  • 請求频率與並發:真爬虫一般有相對稳定的节奏,不會在几秒内把同一個入口頁打成上百次。
  • 請求头完整性:Accept、Accept-Encoding 等字段的组合方式也有參考價值,但它只是辅助證據。
  • 對 robots.txt 的响應:可以观察對方是否先取 robots.txt、是否遵守其中的限制,同样不能單獨下结论。

日誌里應该保留哪些字段

如果日誌只留了 UA 和路径,後面很难做驗證。建议至少保留:時間、来源 IP、請求方法、完整 URL、狀態碼、响應時間、UA、Referer,以及服務端透传的真實 IP。字段齐全之後,真假判断可以在离线分析里做,不必在入口服務器上實时處理,對性能影响也更小。

把识別做在分析层而不是拦截层,誤伤真爬虫的概率會低很多。

認出来之後怎么處理

對確認的搜尋引擎爬虫,可以單獨統計它抓取入口頁的數量、狀態碼分布和平均响應時間,用来判断入口頁是否真的在被發現。對確認的假爬虫,先看它消耗了多少带宽和连接數,再决定是限速、加缓存還是拒绝。直接按 UA 封禁風險較大:規則寫得太宽,可能把真爬虫和正常用戶一起挡掉;寫得太细,维護成本又會持續上升。

一個简單的落地顺序

  1. 先保證日誌字段完整,尤其是真實来源 IP。
  2. 再建立官方 IP 段與反解校驗的比對脚本,按天跑一次。
  3. 把结果分成“確認真爬虫”“疑似”“確認非爬虫”三档,分別統計。
  4. 最後才考虑對第三档做流量层面的處置。

真假蜘蛛的识別不會一次到位,IP 段和反解規則都會變。把它当成一項定期维護的基础工作,比追求一套永遠有效的名單更實际。