你服务器又崩了?先别急着升级配置,看看是不是爬虫在啃你的根目录

上周三凌晨两点,一个做独立站的朋友发来微信语音:“我站挂了,监控全红,但流量没涨——是爬虫干的。”他打开日志一扫,某个 User-Agent 在十分钟里刷了六万次商品详情页。而他的 robots.txt 里只写了 Disallow: /

这根本不是禁止,是发邀请函。

爬虫协议从来不是锁,只是张纸条。写对了,搜索引擎会照做;写错了,连百度都可能把你首页从搜索结果里抹掉——更别说那些压根不认字的采集脚本。

你的 robots.txt 写对了吗?90%的人卡在第1步

很多人把 robots.txt 当成开关:一关全停,一开全放。结果要么封死了自己,要么形同虚设。

真实案例:有个知识付费平台在改版前想临时屏蔽百度,随手写了:

User-agent: BaiduSpider
Disallow: /

第二天发现,百度不仅没抓新内容,连老文章的快照都消失了。问题出在大小写——百度官方文档写得明明白白:它的爬虫叫 Baiduspider,不是 BaiduSpider,也不是 baiduspider。少一个字母,它就当没看见。

正确写法其实就两件事:
第一,先让所有爬虫进来,再挑人限制。用 User-agent: * 做默认规则。
第二,主动告诉搜索引擎你最在乎哪些页面。比如:

User-agent: *
Disallow: /admin/
Disallow: /tmp/

User-agent: Baiduspider
Disallow: /private/

Sitemap: https://yoursite.com/sitemap.xml

别小看最后一行。Sitemap 不是可选项,它是给爬虫画的重点题库。你指哪,它才重点抓哪,省得它满站乱翻。

为什么你的“禁止指令”形同虚设?3个常见漏洞

你写了 Disallow: /product/,爬虫却还是把商品页扒得干干净净。真相往往藏在这三个地方。

漏洞1:子域名被彻底遗忘。
你主站有 robots.txt,但图片放在 img.yoursite.com,静态资源在 cdn.yoursite.com。爬虫不走主站,直接冲子域名去。解决办法很简单:每个子域名的根目录下,都得放一份独立的 robots.txt。少一个,就少一道门。

漏洞2:静态文件成了后门。
你屏蔽了 /product/,但爬虫从 CSS 里扒出 background-image: url(/p/123.jpg),顺藤摸瓜找到商品 ID;或者从 JS 文件里解析出 window.productList = [...],直接拿到全部链接。这时候,你得在 robots.txt 里堵住这些入口:

Disallow: /*.json$
Disallow: /*.js$

(提醒一句:这不是万能药。有些爬虫压根不读这行,但它至少能拦住一批懒家伙。)

漏洞3:重定向等于开门放行。
你屏蔽了 /old/,但用户访问 /old/item-1.html 时,服务器返回 301 跳转到 /new/item-1.html。爬虫跟着跳,一步就进来了。要么你在 robots.txt 里也把 /new/ 加进 Disallow,要么在跳转页 <head> 里加上 <meta name="robots" content="noindex">——让它知道:这页别存,也别传。

除了 robots.txt,你还得用这3招“硬限制”

君子守约,小人抄近道。对付不打招呼就硬闯的爬虫,光靠纸条不够,得上工具。

第1招:在 Nginx 或 Apache 里拦 User-Agent。
比如那个叫 Python-urllib 的爬虫,十次有九次不看 robots.txt。你可以在 Nginx 配置里加一段:

if ($http_user_agent ~* "Python-urllib|curl|wget") {
    return 403;
}

注意:别一锅端。有些正规爬虫(比如 Bingbot 的某些请求)也会带 curl 字样,先查清楚再动手。

第2招:限速比封禁更聪明。
爬虫每秒请求超过 5 次,就让它等 3 秒再试。这招在 Cloudflare、腾讯云 CDN 或阿里云 CDN 里都能一键开——找「速率限制」或「Rate Limiting」功能就行。我们见过一个博客,开完之后服务器负载直接从“随时报警”降到“稳如老狗”。

第3招:IP 封禁要留余地。
真遇到疯狂扫站的 IP,封是必须的。但别一刀切。更好的做法是:对可疑 IP 返回 503 Service Unavailable,而不是 403 Forbidden。搜索引擎看到 503,会认为“网站暂时忙”,过段时间再来;看到 403,可能直接降低信任分。

怎么区分“好爬虫”和“坏爬虫”?看这1个细节

好爬虫(Googlebot、Baiduspider)会老实报备身份,User-Agent 清晰,IP 可反查。坏爬虫喜欢伪装,User-Agent 写着 Mozilla/5.0 (Windows NT 10.0; Win64; x64),结果 IP 查出来是某家 VPS 商的机房段。

怎么验?在服务器上跑一句:

host 203.208.60.123

如果返回 crawl-203-208-60-123.googlebot.com,那是真的;如果返回 vm-123-456.dedicated-server.net,基本可以拉黑。

真实案例:一个技术博客连续三天被“Googlebot”扫,但流量断崖下跌。查 IP 发现反解结果全是 unknown.isp-provider.net。封掉后,第二天自然流量就回来了。

进阶玩法:你可以让 Nginx 根据 User-Agent 返回不同的 robots.txt。比如对 Googlebot 放开 /api/,对其他爬虫继续屏蔽。不用改代码,只需几行配置,就能精准喂食。

当爬虫突破“协议”后,这2个止损动作必须做

服务器已经喘不过气?别重启,先做这两步。

第一步:立刻挡流量,不讲情面。
在 CDN 控制台打开「频率控制」,把非浏览器类请求(比如不含 Accept: text/htmlUser-Agent 里没有 bot 字样的)统一返回 429 Too Many Requests。再配个轻量级验证码(Cloudflare 自带的就行),绝大多数脚本就卡住了。

第二步:抢回内容主权。
如果爬虫已经把整站镜像到别的域名,马上检查每篇文章 <head> 里有没有 <link rel="canonical" href="https://yoursite.com/xxx">。没有?现在就加。然后去百度搜索资源平台、Google Search Console 提交盗链投诉。这不是求它,是通知它:这个内容,原作者是我。

今天就能执行的2个操作步骤

别等“下次上线”“等我学完再弄”,现在打开终端或浏览器,花五分钟搞定。

  1. 打开 https://yoursite.com/robots.txt,逐行看。
    如果发现 Disallow: /Disallow: /* 这种全局拦截,立刻删掉。改成只屏蔽 /admin//user/ 这类真实敏感路径。然后去 Baidu Spider 文档Google Robots 文档 核对 User-agent 名称,一个字母都不能错。

  2. 打开你的服务器日志或 CDN 日志(比如 Cloudflare 的 Analytics 页面),筛选最近24小时。
    搜索关键词 botcrawlspider,看排在前三位的是谁。如果是 Python-urllibGo-http-client 或一堆陌生 IP,复制它们,在 CDN 的「IP 访问控制」或 Nginx 的 deny 规则里直接封掉。如果某个 UA 请求频次明显异常,就在 CDN 里给它单独设一条速率规则:每分钟最多 30 次。

做完这两步,你会发现服务器响应快了,日志清爽了,半夜也不用被电话叫醒了。爬虫协议不是终点,是起点——但起点走稳了,后面才不用天天救火。