蜘蛛池知识

蜘蛛池入口頁的 robots.txt:放行范围、Crawl-delay 與誤封排查

robots.txt 决定爬虫能不能抓,不决定内容能不能被收錄。本文梳理蜘蛛池入口頁的放行寫法、Crawl-delay 的實际作用邊界,以及多域名、多环境场景下最容易踩的誤封問题,並给出一份發布前可對照的自查清單。

蜘蛛池知识

蜘蛛池入口頁的 robots.txt:放行范围、Crawl-delay 與誤封排查

先分清:robots.txt 管的是抓取,不是收錄

robots.txt 是大多數爬虫在正式抓取前會先讀取的文件,它回答的問题只有一個:這個 URL 能不能被請求。它不决定索引,不决定排名,也不是保密工具——文件本身是公開的,寫進去的路径等于對外公示。蜘蛛池入口頁數量多、域名杂,這個文件经常被当成走過场,但因為寫错一條規則让整批入口頁白做的情况並不少见。

基础寫法:明确放行,精准封禁

如果入口頁的目标是让爬虫顺畅走完整站,最简寫法就是全站放行,再把确實不需要抓的目錄單獨挡掉。

  • User-agent: *Allow: / 明确放行,比只寫一個空的 User-agent 段更不容易被誤讀。
  • 後台、站内搜尋结果頁、购物车、带 session 參數的 URL,逐條 Disallow,不要图省事寫一條 Disallow: /。
  • 把入口頁的 sitemap 地址用 Sitemap 行寫出来,方便爬虫顺带發現更多 URL。

規則冲突时,路径更長、更具体的規則優先,這一点各家爬虫的實現基本一致。但通配符 * 和结尾的 $ 属于扩展语法,支持程度不统一,規則寫得越复杂,被小众爬虫誤讀的概率越高。入口頁這類需要稳定抓取的站点,規則宜简不宜繁。

Crawl-delay 要不要寫

Google 官方並不認 Crawl-delay,Googlebot 的抓取速度主要通過 Search Console 里的抓取频次設定来調整;Yandex、Bing 等對 Crawl-delay 有不同程度的支持。入口頁服務器资源紧張时,寫一個 Crawl-delay 有一定意义,但別指望它能约束所有爬虫。

更稳妥的做法是把限速放在服務端:按 IP 與 User-Agent 做並發控制,在 Nginx 层限制單 IP 连接數,再從訪問日誌里观察真實到訪节律,反過来决定限速阈值是否需要調整。

多域名、多环境最容易踩的坑

  • 測試站複製了线上 robots.txt,里面寫着 Disallow: /,上线时忘了删。
  • 泛解析域名共用一個 robots.txt:robots.txt 按主机名生效,子域需要各自放一份,共享逻辑在配置层面根本走不通。
  • 用脚本按 UA 返回不同内容,短期看似灵活,長期既容易被判定為異常行為,出問题时也极难复現排查。

誤封自查顺序

  1. 直接在浏览器訪問 https://域名/robots.txt,確認返回 200,且内容是最新版,而不是 CDN 或缓存里的舊副本。
  2. 用搜尋引擎官方的 robots 測試工具驗證目标 URL 到底是被放行還是被拦截。
  3. 检查是否存在 Disallow: / 之後又被 Allow 覆盖的規則冲突。
  4. 检查通配符與结尾 $ 的位置,例如 Disallow: /*? 會誤伤所有带參數的正常頁面。
  5. 確認文件不是持續返回 5xx:多數爬虫在長時間取不到 robots.txt 时會收紧甚至暫停抓取。
如果只是不想让某些頁面被索引,用 meta robots 或 X-Robots-Tag 更直接;robots.txt 解决的是抓取层面的問题,两者不要混着用。

發布前可對照的最小清單

  • 根目錄静態文件,200 返回,UTF-8 编碼,体积控制在几十 KB 以内。
  • User-agent: * 明确 Allow,内部目錄按路径 Disallow。
  • Sitemap 行指向入口頁對應的 sitemap 地址。
  • 每個獨立主机名(含子域)各配置一份,不共用。
  • 上线流程里加一步:發布前對比线上 robots.txt 與预期内容的差异。

一個寫错的 Disallow 不會立刻报错,只會让抓取量在某天悄悄掉下去。把它放進發布检查清單,成本很低,收益却相当直接。