蜘蛛池跑不起来,很多人第一反应是服务器、IP、域名出了问题,但实际排查下来,相当一部分情况是 robots.txt 或 meta robots 把蜘蛛挡在门外。这两处配置看着是小事,却直接决定蜘蛛能不能读到入口页、能不能顺着链接继续走。下面按实际使用场景,把该开放的、该屏蔽的理一遍。
先定位:入口页是通道还是页面
不同做法对索引的要求不一样。如果入口页只承担把蜘蛛引向目标站的作用,它本身收不收录并不是重点;如果入口页还想有一部分聚合展示的用途,那就需要被正常索引。这个定位决定了后面 robots 和 meta 该松还是该紧。
但无论哪种定位,有一条是共通的:不能把入口页整个屏蔽掉。屏蔽之后蜘蛛连页面都读不到,后面的链接发现自然无从谈起。
robots.txt:写得越少越不容易出错
入口页所在服务器上的 robots.txt,建议保持最小化。下面几类是实践中容易翻车的写法:
- Disallow: /。全站屏蔽是最常见的误操作,有些是建站模板默认带的,上线时没人检查。
- 整段目录被连带屏蔽。Disallow 是按前缀匹配的,写 Disallow: /a/ 会同时挡掉 /abc/ 这类同前缀路径,目录命名要留个心眼。
- 把不想公开的路径写进去。robots.txt 是公开可读文件,写进去等于顺带说明了这里有什么。
- 写 crawl-delay。主流搜索引擎对这个指令的支持并不一致,控制抓取节奏靠服务器响应速度和访问日志判断更实际。
相对稳妥的做法,是只挡掉确实不希望被抓的路径,例如后台入口、统计脚本、带参数的筛选页、内容高度重复的列表页。入口页本身,以及它通向目标站链接所在的区域,都要保持开放。
如果站点本来就配了 sitemap,可以在 robots.txt 里补一行 Sitemap 地址,方便蜘蛛顺路取到,但这不是必须项,也不该指望它解决抓取问题。
meta robots:index 和 follow 要分开判断
入口页的 meta robots 常见几种组合,含义差别不小:
- index,follow:页面可被索引,页内链接可被跟随。多数入口页用这一组就够了。
- noindex,follow:页面不进索引,但链接仍会被跟随。只把入口页当作链接发现通道时可以考虑,代价是页面本身长期没有索引记录,蜘蛛的回访意愿可能变低。
- index,nofollow:页面进索引,但页内链接不被跟随。用在入口页上等于切断了通向目标站的路径,通常不合适。
- noindex,nofollow:基本等于告诉蜘蛛这页不用看,入口页用它没有意义。
nofollow 更适合用在页面里那些不想让蜘蛛浪费抓取预算的链接上,比如登录、注册、分页尾页、外部无关站点,而不是用在整页级别。把 nofollow 加在整页的 meta 上,往往会把自己最需要被跟的那几条链接一起封掉。
另外,robots.txt 屏蔽和 meta 指令是两个层面的控制,不要在同一批页面上同时使用互相矛盾的配置。robots.txt 挡住之后,蜘蛛根本读不到页面的 meta,此时写 noindex 还是 index 都没有意义。
X-Robots-Tag:头里的指令要注意位置
除了 HTML 里的 meta,响应头里的 X-Robots-Tag 也能起到同样作用,对非 HTML 文件尤其方便。但要注意它只对当前这个响应生效:如果入口页做了跳转,指令写在跳转响应和写在最终页面响应上,效果并不相同。排查时不要只看 HTML,也顺手看一眼返回头。
上线前的检查顺序
- 直接访问域名下的 /robots.txt,确认能返回 200,没有被 CDN 或 WAF 拦成挑战页或 403。
- 抓取一条入口页,看实际返回的 meta robots 和 X-Robots-Tag,而不是看模板文件里写了什么。
- 翻访问日志,确认蜘蛛对 robots.txt 和入口页都有请求记录,而不是只来取了一次 robots 就走。
- 抽查几条入口页,确认通向目标站的链接是普通可跟随的 a 标签,没有被脚本包裹或默认隐藏。
- 配置调整分批放,先改小部分入口页观察几天,再决定是否铺开。
robots 和 meta 是允许被抓的开关,不是保证被抓的手段。把它们放开只是必要条件,实际抓取多少还要看响应速度、内容质量、域名历史这些因素。
简单说,入口页的配置原则是:该被读到的全部放开,不该被读到的明确挡掉,剩下的交给自己去观察日志判断。