很多人在排查蜘蛛池為什么没動静时,先看連結、再看日誌,最後才想起 robots.txt。實际上這是最靠前的一环:抓取程序訪問一個域名时,通常會先請求根目錄下的 robots.txt,再决定要不要繼續往下走。這一步没走通,後面的入口頁、連結和内容都無從谈起。
先確認 robots.txt 的作用范围
robots.txt 只對同一個主机生效。子域名、不同协议、不同端口都各算各的:http 和 https 可能被当作两個站点,带 www 和不带 www 也常被视為两個主机。批量部署蜘蛛池时,模板往往只寫了一份文件,實际却有几十個訪問入口,漏配的情况很常见。
另外,這個文件必须放在根目錄。放在子目錄里不會被讀取,也不要用 302 把它跳到別處。
几種容易挡住蜘蛛的寫法
整站 Disallow
Disallow: / 是最常见的一處遗留問题。測試阶段為了防止抓取加上這一行,上线後忘了删。此时蜘蛛仍會讀取 robots.txt,但不會請求入口頁,日誌里自然什么也看不到。
User-agent 寫错
規則组里的 User-agent 值需要和爬虫声明的名字對應。主流爬虫一般只認自己的名字和通配符 *,寫成別的字样就匹配不上,那组規則會被整体忽略——如果那组里恰好是允许規則,等于白寫。
通配符與 $ 的支持差异
* 和 $ 並非所有抓取程序都支持。Google、Bing 等支持,一些小众或自建抓取程序會按字面處理,可能出現放過本该屏蔽的路径、或誤伤正常路径两種情况。当 Allow 與 Disallow 冲突时,Google 會取更長(更具体)的那條規則,不同爬虫的處理未必一致。
返回碼比文件内容更關键
- 200:正常讀取,按規則执行。
- 404:视為没有規則,預設允许抓取全部。临时刪除文件时要意识到這一点。
- 403:多數搜尋引擎會当作禁止抓取整個站点處理,影响范围比 Disallow: / 更大。
- 500 / 503:视為服務端不可用,短時間會重试;長期如此可能降低抓取频次甚至暫停。
如果 robots.txt 是程序動態輸出的,務必確認它不會因為超时、鉴權或 WAF 拦截返回 403。
別漏掉頁面級與响應头指令
robots.txt 允许抓取,不代表頁面本身没有額外限制。入口頁的 meta robots、以及响應头里的 X-Robots-Tag,都可能在抓取或後續處理环节起作用。X-Robots-Tag 對 PDF、图片這類非 HTML 资源同样有效,排查时很容易被忽略。
Crawl-delay 與實际抓取频次
Crawl-delay 只有部分爬虫支持,Google 明确不支持该指令。寫了不一定生效,寫了過大的數值還可能让本就有限的抓取變得更慢。真正影响抓取频次的是站点响應速度、错誤率和内容更新情况,這一点在蜘蛛池场景里尤其明顯:通路响應慢,放出去的 URL 再多也消化不了。
上线前的检查清單
- 直接訪問 /robots.txt,確認返回 200 且内容符合预期;http 與 https、带與不带 www 分別检查。
- 搜尋 Disallow 中是否出現 /,是否誤伤了入口頁所在目錄。
- 查看入口頁的 meta robots 與响應头中的 X-Robots-Tag。
- 確認 crawl-delay 的數值没有夸張到让抓取接近停滞。
- 用抓取工具或更換 UA 請求一次入口頁,確認返回正常,再到訪問日誌里看是否出現蜘蛛請求。
robots.txt 只能表達允许或不允许抓取,它不决定收錄,也不保證蜘蛛一定會来。把它当成通路检查的一部分,而不是優化手段。
對批量投放来说,更實际的做法是把 robots.txt 检查放進上线流程,而不是出問题後再回头找。同一套模板複製到多個域名时,一個错誤配置會被放大很多倍;定期抽查几個域名,比事後逐個排查省事得多。