先分清: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 返回不同内容,短期看似灵活,長期既容易被判定為異常行為,出問题时也极难复現排查。
誤封自查顺序
- 直接在浏览器訪問 https://域名/robots.txt,確認返回 200,且内容是最新版,而不是 CDN 或缓存里的舊副本。
- 用搜尋引擎官方的 robots 測試工具驗證目标 URL 到底是被放行還是被拦截。
- 检查是否存在 Disallow: / 之後又被 Allow 覆盖的規則冲突。
- 检查通配符與结尾 $ 的位置,例如 Disallow: /*? 會誤伤所有带參數的正常頁面。
- 確認文件不是持續返回 5xx:多數爬虫在長時間取不到 robots.txt 时會收紧甚至暫停抓取。
如果只是不想让某些頁面被索引,用 meta robots 或 X-Robots-Tag 更直接;robots.txt 解决的是抓取层面的問题,两者不要混着用。
發布前可對照的最小清單
- 根目錄静態文件,200 返回,UTF-8 编碼,体积控制在几十 KB 以内。
- User-agent: * 明确 Allow,内部目錄按路径 Disallow。
- Sitemap 行指向入口頁對應的 sitemap 地址。
- 每個獨立主机名(含子域)各配置一份,不共用。
- 上线流程里加一步:發布前對比线上 robots.txt 與预期内容的差异。
一個寫错的 Disallow 不會立刻报错,只會让抓取量在某天悄悄掉下去。把它放進發布检查清單,成本很低,收益却相当直接。