做蜘蛛池的时候经常遇到這種情况:入口頁能正常打開,里面指向的目标 URL 却迟迟没有被抓。排查到最後,問题出在 robots.txt 上——有人為了挡住後台、站内搜尋這類無價值路径,寫了一條很宽的 Disallow 規則,顺手把目标 URL 也一起挡了進去。這篇文章把這條鏈路上的几個關键点拆開说清楚。
先確認被屏蔽的到底是哪一层
robots.txt 的生效范围是「同一個协议 + 同一個主机名 + 同一個端口」,也就是常说的同源。所以要先分清三種情况:
- 入口頁本身被屏蔽:搜尋蜘蛛根本不會請求入口頁,頁面里有多少條連結都讀不到,鏈路在第一层就断了。
- 入口頁可抓,目标 URL 所在路径被屏蔽:入口頁能被讀取,蜘蛛也能看到連結,但走到目标 URL 时會被規則拦住,不會去請求正文。
- 目标 URL 在另一個域名:入口頁的 robots.txt 管不到對方,這时候要看目标站自己的 robots.txt 有没有屏蔽搜尋蜘蛛。
搜尋蜘蛛遇到 Disallow 时具体會做什么
需要区分「發現 URL」和「抓取 URL」两件事。搜尋蜘蛛在別的頁面看到一條被 Disallow 的連結时,通常仍可能把這個 URL 记錄下来,但它不會去請求這個 URL 的内容。對蜘蛛池来说,後果很直接:
- 目标 URL 的内容讀不到,頁面里的下一层連結也就無從發現;
- 入口頁里如果大量連結都落在被屏蔽的路径下,入口頁本身的抓取價值會被明顯稀释;
- robots.txt 不是保密工具,它只是抓取指令,不保證 URL 不出現。想要内容不被看到,應该用權限控制,而不是 Disallow。
几個常见的誤判
- 規則顺序誤区:很多人以為 robots.txt 是從上往下匹配第一條。實际生效的是匹配程度,規則更具体、更長的通常優先,所以不要靠調換顺序来「覆盖」。
- 通配符誤伤:像 /go/* 這種寫法會把所有以 go 開头的路径全挡住,包括你本来想放行的目标 URL。
- robots.txt 本身異常:如果這個文件返回 5xx,多數搜尋引擎會保守處理,可能短時間内减少對该主机的抓取;返回 404 一般视為没有限制;但如果返回 200、内容却是一個错誤頁,解析结果就不可预料了。
一條實用经驗:寫完 robots.txt 別只看语法對不對,要實际拿目标 URL 去跑一遍抓取測試,看结果里有没有「被 robots.txt 屏蔽」的提示。
想保留入口頁、只屏蔽無關目錄,怎么做
- 先列出真正無價值的路径,比如後台、站内搜尋、參數化篩選頁,只對這些路径寫規則。
- 逐條核對目标 URL 的完整路径,確認不在任何 Disallow 的前缀里,尤其注意结尾有没有通配符。
- 用搜尋引擎提供的抓取測試工具,分別测入口頁和目标 URL,確認两者都不被拦。
- 過几天回到服務器日誌里,搜目标 URL 的請求记錄,看是否有来自搜尋蜘蛛的訪問。日誌比任何推测都可靠。
目标 URL 在別的域名时
跨域的情况下,两邊的 robots.txt 各自獨立。入口頁放行不等于目标站放行,反過来也一样。實际排查时经常见到入口頁一切正常、目标站自己寫了 Disallow,或者整站被 WAF 拦掉,抓取断点其實在後面那一段。所以跨域投放时,两邊的 robots.txt 和訪問控制都要過一遍。
怎么快速驗證
- 直接訪問 你的域名/robots.txt,確認返回 200 且内容是規則文本,不是首頁也不是错誤頁。
- 把目标 URL 粘進抓取測試工具,看是否提示被 robots 屏蔽。
- 检查服務器日誌里入口頁的抓取次數與目标 URL 的請求次數,两者的差距往往就是断点位置。
- 如果入口頁被大量抓取而目标 URL 一條請求都没有,優先怀疑 robots 規則、重定向鏈以及目标站的拦截策略。
小结一下:robots.txt 决定的是「能不能抓」,不是「會不會被收錄」。入口頁與目标 URL 之間只要有一层被 Disallow,發現與抓取的鏈路就會断開。排查顺序建议是:robots.txt 規則 → 抓取測試工具 → 服務器日誌 → 目标站自身的訪問控制,一层层往下定位,比盲目堆連結有效得多。