你花钱租了服务器,结果流量没来,先被爬虫干趴了

网站刚上线,CPU突然飙到100%,页面卡成PPT——你刷新三次才加载出首页。后台日志一拉,全是陌生IP在狂刷商品页、详情页、API接口……根本不是用户,是机器。

这些爬虫不帮你引流,也不替你做SEO,它们只干一件事:把你的价格、库存、评论、甚至未发布的草稿,打包搬走。

别急着骂“谁这么缺德”,先稳住服务器。下面这些方法,我帮几十个中小站实操过,今天就能用上。

为什么你的网站会被爬虫“盯上”?

爬虫不会挑网站大小,只挑有没有“好拿的东西”。它不看你DAU多少,只看你的<title>里有没有“最新报价”、/api/prices是不是没加鉴权、robots.txt里是不是连/admin/都没屏蔽。

三个最常见原因:

  • 你发了别人想抄的数据:比如二手平台的成色描述、教育机构的课程大纲、本地服务商的报价单——这些内容一上线,就被同行爬走当竞品素材。
  • robots.txt写得太客气Disallow: /像在说“请进”,真正该写的是Disallow: /api/, Disallow: /wp-admin/, Disallow: /logs/。爬虫只认白纸黑字,不读你的心思。
  • 服务器太“老实”:Nginx/Apache默认不限流,一个IP每秒发200个请求,它照单全收,直到内存爆掉。

真实案例: 一个卖中古包的客户,网站每天几千UV,但服务器总在下午三点开始卡顿。查日志发现,某个IP在12分钟内扫了1.8万次商品页,User-Agent写着Mozilla/5.0,IP归属地是某回收平台的技术部。加了一条Nginx限流后,负载回落,客服收到的真实咨询量反而涨了。

怎么区分“好爬虫”和“坏爬虫”?

你不能把百度蜘蛛和谷歌机器人一起封了——它们是你免费流量的入口。关键不是“拦”,而是“验”。

第一步,看User-Agent。
打开Nginx或Apache日志,搜BaiduspiderGooglebotbingbot。这些是正规军,有明确标识。如果一个IP自称Mozilla/5.0 (Windows NT 10.0; Win64; x64),又在30秒内刷了50个不同URL,基本可以判“可疑”。

第二步,反查IP域名。
在服务器终端跑这句:

nslookup 123.123.123.123

真正的百度蜘蛛IP,会返回*.baiduspider.com;谷歌的会带googlebot.com。如果返回unknown、乱码、或者指向越南/俄罗斯的域名,直接记入观察名单。

真实案例: 一个知识付费社区,总被同一网段反复抓取。那个IP的User-Agent伪装成Googlebot/2.1,但nslookup查出来解析到一个柬埔寨注册的域名。我们把它整个C段加入Nginx deny列表,一周后日均爬取量掉了七成,收录反而更稳了。

3个方法,让爬虫“排队”而不是“冲撞”

封IP是堵漏,限流才是修水管。下面三个动作,按你手头权限选:

方法一:在Nginx里加一行限流(推荐新手先做)

不用改代码,不用装插件,就改Nginx配置。在http{}块里加:

limit_req_zone $binary_remote_addr zone=perip:10m rate=2r/s;

然后在server{}location{}里调用:

limit_req zone=perip burst=10 nodelay;

意思是:每个IP每秒最多2个请求,允许临时攒10个排队。超了就返回503。

电商站可以调到5r/s,博客类建议1r/s起步。试两天,看正常用户是否卡顿——不卡,说明设对了。

真实案例: 一个旅游攻略站,之前每月CDN流量超配,账单总超标。加了rate=3r/s后,流量降了近一半,但百度搜索结果里的快照更新频率完全没变。因为正经爬虫会重试,而脚本爬虫超时就放弃。

方法二:用robots.txt“礼貌提醒”

很多站长以为robots.txt没用。其实百度、必应、Yandex都认这一套。在根目录的robots.txt里加:

User-agent: *
Crawl-delay: 15

这个15代表“每次抓完,至少等15秒再抓下一条”。对正经爬虫有效,对黑产无效——但它本来就是给“守规矩的人”看的。

注意:别写Crawl-delay: 300(5分钟),否则百度可能降低抓取频次,影响新内容收录。

方法三:IP黑名单“点名处理”

当你已经确认某个IP段持续作恶(比如连续三天,每天刷5000+次),再动手封。在Nginx里:

deny 192.168.200.0/24;
deny 203.123.45.0/24;

但先做两件事:

  1. whois 203.123.45.0查这个段是不是云厂商的出口IP(比如阿里云、腾讯云的ECS公网段);
  2. 在日志里确认它没混着CDN节点(比如Cloudflare的IP段是104.16.0.0/12,千万别误封)。

封错一个CDN IP,整站可能打不开。

为什么“限流”比“封IP”更靠谱?

爬虫换IP比换袜子还勤快。你封100个,它起1000个。但限流是“认人不认IP”——只要它还是用同一个IP来刷,就永远卡在每秒2个请求的队列里。

更关键的是:爬虫脚本通常设了3秒超时。你让它排队10秒才响应,它等不及就断开,下次重试又进队列……几次下来,脚本自己就放弃了。

真实案例: 一家法律咨询网站,被一个Python脚本轮着换代理IP扫案例库。运营团队手动封了上万IP,结果Nginx配置臃肿,重启一次要2分钟。后来换成limit_req_zone全局限流,配合burst=5,那个脚本三天后彻底消失——它没被封,只是“饿”跑了。

怎么监控爬虫行为?别等到被干趴才去看

你不需要24小时盯屏,但得养成两个小习惯:

  • 每天早上去服务器敲一行命令:

    awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
    

    这能立刻看到最近请求最多的10个IP。如果第一名叫你10倍以上,截图存档,准备下一步动作。

  • 在云控制台开个基础告警:
    阿里云/腾讯云后台,把“CPU使用率 > 85% 持续5分钟”设成短信告警。告警一响,立刻去查access.log最后100行,比等用户投诉快得多。

  • 留意“非人类访问模式”:
    比如凌晨2点,某个IP在1分钟内请求了37个不同文章页,且全部是GET、无Cookie、无Referer——这就是典型脚本行为。

真实案例: 一个在线教育平台,总在凌晨被扫课程视频地址。我在crontab里加了个脚本:每5分钟跑一次netstat -an | grep :443 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -5,自动记录连接数TOP5的IP。一旦发现异常,脚本直接调用nginx -s reload加载新的deny列表。现在他们再也不用半夜爬起来救火了。

今天就能执行的1个操作

现在,打开你的服务器终端(或者宝塔面板的SSH终端),复制粘贴这行命令:

tail -100 /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10

看输出结果。如果第1名的数字远高于第2名(比如128 vs 7),那就把它记下来。

接着,打开你的Nginx配置文件(通常是/etc/nginx/conf.d/default.conf或站点配置),在server{}块里加:

limit_req zone=perip burst=5 nodelay;

再运行:

nginx -t && nginx -s reload

搞定。不用重启服务,不用买新工具,5分钟,最猛的那个爬虫就从“暴徒”变成“排队群众”。

剩下的事,明天再做:把今天揪出来的IP,加到deny列表;后天再优化robots.txt。爬虫控制不是打仗,是养习惯——你坚持两周,就会发现,服务器安静了,日志清爽了,连你自己刷新页面都快了。