做蜘蛛池的人常遇到一個矛盾:入口頁不想被普通訪客或搜尋蜘蛛直接看到,于是用 robots.txt 把入口頁 Disallow 掉,過一段時間回头看,里面的目标 URL 一條抓取记錄都没有。這时候要先問自己一個問题:你屏蔽的到底是入口頁,還是入口頁加上里面的目标 URL?在 robots.txt 的規則体系里,這是两件完全分開的事。
robots.txt 的拦截發生在抓取之前
搜尋蜘蛛在請求某個 URL 之前,會先讀取该站点的 robots.txt(通常會缓存一段時間)。如果某條規則匹配上了這個 URL,蜘蛛一般就不再發出請求。由此可以推出:
- 入口頁被 Disallow,蜘蛛大概率不會去抓入口頁,讀不到它的 HTML,自然也就讀不到頁面里的連結。
- 目标 URL 没有被 Disallow,它本身仍然是可抓取的,只是少了一條被暴露出去的通道。
所以最常见的實际情况是:入口頁被屏蔽後,目标 URL 並不是被禁止了,而是失去了主要的發現路径。
几個容易混淆的点
誤区一:以為 robots.txt 只影响收錄
robots.txt 控制的是抓取,不是收錄。一個 URL 被 Disallow 之後,蜘蛛不能抓取它,也就無法讀取頁面内容来判断它是什么。但它仍然可能通過外部連結、sitemap 等渠道被记錄成一個「已知但未抓取」的 URL。反過来说,允许抓取也不等于會被收錄。
誤区二:以為屏蔽入口頁會连坐目标 URL
robots.txt 的規則是按 URL 路径逐條匹配的,不會向被連結的頁面传递「禁止」。入口頁被屏蔽,不代表它指向的目标 URL 也被屏蔽;目标 URL 被屏蔽,也不影响入口頁本身被抓取。
誤区三:以為把 URL 放進 sitemap 就能绕過 Disallow
sitemap 里的 URL 如果同时命中 robots.txt 的屏蔽規則,蜘蛛一般還是不會去抓。sitemap 更像是一份推荐清單,robots.txt 更像门禁,门禁優先。
四種组合下的實际表現
- 入口頁允许、目标 URL 允许:最正常的情况。蜘蛛抓入口頁,解析出連結,再按調度去抓目标 URL。
- 入口頁屏蔽、目标 URL 允许:蜘蛛不會讀入口頁,里面的連結等于没寫。目标 URL 只能靠其它入口、外部連結或 sitemap 重新被發現。
- 入口頁允许、目标 URL 屏蔽:蜘蛛能發現這些連結,但請求會被挡下来,目标 URL 會長期停留在「已發現、未抓取」的狀態。
- 两邊都屏蔽:發現和抓取两條路都断了,入口頁在整條鏈路里基本等于不存在。
如果确實需要屏蔽入口頁,可以這样調整
- 把目标 URL 放到另一個可抓取的頁面上,让發現路径不再依赖被屏蔽的那個入口頁。
- 检查 Disallow 規則的寫法,避免用過于宽泛的前缀把目标 URL 的路径一起罩進去。
- 如果只是不想让入口頁被正常展示,但希望連結能被讀到,可以考虑保留抓取、改用其它方式處理入口頁内容。這類做法需要结合自身站点评估,不存在通用的稳妥方案。
- 用官方或第三方的 robots.txt 測試工具,逐個驗證入口頁和目标 URL 各自命中哪條規則,不要凭感觉判断。
建议的排查顺序
如果入口頁有抓取记錄、目标 URL 却完全没有動静,可以按下面的顺序逐條看:
- 入口頁和目标 URL 分別命中 robots.txt 的哪一條規則,是否存在誤伤。
- 入口頁响應是否正常,返回的 Content-Type 是不是 text/html。
- 連結是否真實存在于 HTML 源碼中,而不是靠脚本渲染後才出現。
- 目标 URL 自身返回的狀態碼是否可抓取。
- 服務端日誌里,目标 URL 有没有被請求過的痕迹。
robots.txt 拦的是「抓不抓」,不是「好不好」。把入口頁屏蔽掉,通常只是让目标 URL 少了一條被發現的路,並不會让它在別的地方更快被處理。
最後提醒一句:不同搜尋引擎的抓取調度策略並不一致,同一套配置在不同站点上的表現也可能有差別。上面的内容是常規規律,具体還是以自己站点的抓取日誌和後台資料為准。