为什么入口页的爬虫规则容易被忽略
搭入口页的时候,大部分精力都花在域名、IP、跳转链和内容填充上,robots.txt 和 meta robots 往往是从旧模板里直接复制的。于是就会出现一边在想办法引蜘蛛、一边用一行 Disallow 把整站挡住的尴尬局面。这类问题排查起来很不直观:日志里看不到蜘蛛,第一反应通常是怀疑 IP 被封或者 DNS 有问题,而真正的原因可能只是一条写错的规则。
入口页的 robots.txt 要处理什么
对大多数入口页来说,robots.txt 只需要承担三件事:告诉蜘蛛哪些目录可以抓、给出 sitemap 的位置、避免误伤无关的抓取路径。它不是一个需要精心设计的东西,放行是默认动作。入口页本身没有私密数据,也没有需要保护的接口,通常不需要做目录级屏蔽。真正值得屏蔽的是后台路径、测试目录、带参数的筛选页这类不产生价值的 URL。
User-agent 分组最容易写错
一个高频错误是把通配分组和具体蜘蛛分组混着写。比如写了一条 User-agent: Baiduspider 加 Disallow: /,本意可能只是临时测试,上线时忘了删;同时在 User-agent: * 分组里写着 Allow: /。两条规则互相打架,实际效果取决于搜索引擎怎么解析优先级。规则越复杂,冲突概率越高。如果只是想让蜘蛛正常抓取,最省事的写法就是保留必要的 Allow 和一条 Sitemap,其余交给默认行为。
不要把 Allow 和 Disallow 当成优先级游戏
不同搜索引擎对 Allow 与 Disallow 冲突的处理细节并不完全一致,通常路径越长、越具体的规则优先级越高,但这一点不能想当然。与其靠写复杂规则去押注命中结果,不如在写 Disallow 时就把想放行的目录排除在外,规则越少越不容易出错。
meta robots 与 X-Robots-Tag 怎么选
robots.txt 管的是能不能来抓,meta robots 管的是抓了之后能不能收录、能不能跟链接,两者层次不同,混用是最常见的误区。
- 入口页需要被抓取,页面上不要出现 noindex、nofollow 这类标签;
- 如果入口页由程序统一生成模板,要检查模板里有没有沿用旧站的 meta robots;
- X-Robots-Tag 写在响应头里,CDN 或反向代理层可能缓存或覆盖,排查时要看实际响应头,而不是只看源站配置。
还有一种情况是页面代码本身没问题,但线上返回的 HTML 里带着缓存下来的旧 meta 标签,改了源站却没生效。遇到代码明明改了、蜘蛛还是不抓的情况,值得拉一次线上实际返回的内容做比对。
排查蜘蛛不来的先后顺序
- 确认 robots.txt 能被正常访问,返回 200,且返回的是纯文本而不是 HTML 页面;
- 检查是否有 Disallow 通配符挡住了入口页所在目录;
- 看页面 HTML 中是否存在 noindex;
- 看响应头里是否带有 X-Robots-Tag;
- 以上都没问题,再去查 DNS、IP、防火墙和访问日志。
把这几步放在前面,能省掉大量在服务器层面的无效排查。不少“入口页没什么反应”的反馈,最后定位到的就是第一、第二步。
几条实操建议
- 入口页的 robots.txt 尽量简短,只在确实需要时写 Disallow;
- 批量上线时统一使用同一份模板,避免个别站点漏改;
- 改动规则后,隔一段时间观察访问日志里的蜘蛛请求路径有没有变化;
- 不要用 robots.txt 去做内容保护,它只是约定,不是访问控制。
robots.txt 能影响蜘蛛来不来,但决定不了蜘蛛抓完之后做什么。把规则写对只是把路打开,后面的内容、链接结构和更新节奏才是长期要盯的部分。
规则层面的事情本身不复杂,难的是统一和坚持。入口页数量一多,模板、缓存、副本之间很容易出现规则不一致,定期抽查比事后返工划算得多。