你的网站是不是总在“喘粗气”?打开后台一看,CPU又飙到90%了

别慌——这大概率不是服务器老化,而是有人正用脚本把你网站当数据库狂扒。用户点开慢、图片加载卡、半夜三点带宽突然见底……这些都不是玄学,是爬虫在你家后院挖矿。

如何判断你的网站正在被恶意抓取?

先别急着拉黑IP。封错一个Googlebot,搜索排名掉得比网速还快。真问题得靠日志说话——那是服务器最老实的嘴。

打开你的 Nginx 或 Apache 日志,盯住这四件事:

  • 同一个IP,一分钟内刷了上百条记录;
  • User-Agent 写着 python-requests/2.28.1curl/7.68.0,甚至直接是空的;
  • 请求全扎堆在 /api/product//search?q= 这类接口上;
  • 时间戳集中在凌晨2:17、3:04这种人类早该睡觉的点。

我们帮一个本地家居团购站查过日志:单个IP每秒调用商品详情接口12次,User-Agent 是 Mozilla/5.0 (compatible; DataGrabber/1.0)——连伪装都懒得换。一查IP归属地,是某家数据清洗公司的代理池。没日志,你连对手长什么样都不知道。

最基础的防线:正确使用 robots.txt

它不是锁,是块写着“闲人免进”的木牌。对守规矩的爬虫(比如百度蜘蛛、Googlebot)管用,对黑产来说,等于不存在。

在网站根目录放一个 robots.txt 文件,内容可以这样写:

User-agent: *
Disallow: /admin/
Disallow: /wp-admin/
Disallow: /cgi-bin/
Disallow: /search/
Disallow: /cart/

这几行能拦住搜索引擎反复刷后台、搜关键词、加购物车——省下不少服务器力气。但请记住:它只影响听话的爬虫,而坏人从不敲门。把它当交通协管员用,别指望它扛冲锋枪。

核心防御策略:从IP和频率上设卡

对付不讲规则的,就得上硬手段。重点不是“能不能访问”,而是“能不能这么快、这么疯地访问”。

Nginx 用户,打开配置文件,加两行就行:

limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_req zone=perip burst=20 nodelay;

意思是:每个IP每秒最多10个请求,超了就返回503。暴力扫库的脚本当场卡死。

Apache 用户可以用 mod_evasive,或者更省事——如果你用的是阿里云、腾讯云、华为云的ECS或轻量应用服务器,直接去控制台找「Web应用防火墙(WAF)」,打开「CC防护」和「爬虫管理」开关。规则里选“高频访问拦截”,阈值设成“单IP每分钟超60次即限流”。不用改代码,点几下就生效。

高级玩法:用验证码和动态规则增加爬取成本

代理池一开,IP封禁就成纸糊的。这时候得让机器“动脑子”——或者干脆让它动不了。

在商品列表页、搜索结果页、用户评论接口前,加一道滑动拼图验证码。不是所有访问都弹,而是当某个IP连续触发3次分页请求、或10秒内点了5个不同商品链接时,才出现。正常人觉得顺手,机器人得重写识别模块。

再进一步,给可疑行为“喂假料”。比如检测到某IP按 /product/1001/product/1002/product/1003 的规律扫号,就悄悄返回一个静态HTML页面,里面价格写成“¥99999”,库存标“已售罄”,连电话号码都换成虚构的。对方照单全收,爬走一堆废数据,还以为自己赢了。

我们帮一家法律文书查询站做过这事。他们把爬虫引向一个伪装成“判决书详情”的蜜罐页面,返回的全是法院已撤回的旧案文号。对方花了两周整理入库,最后发现90%的数据根本无法验证。

终极防护:架构层面的隔离与伪装

如果对手是专业团队,天天盯着你改策略,那就得动架构——不是修墙,是换个房子住。

第一招:API不裸奔。前端调用数据,必须带短期有效的Token,且每个Token绑定设备指纹+时间戳+签名。后端校验通不过,直接返回401。爬虫想复现请求,得先逆向你的JS加密逻辑。

第二招:敏感信息不落地。价格、手机号、联系地址,别直接写在HTML里。用 <img> 贴图,或让前端JS解密一段base64字符串再渲染。SEO会受点影响,但至少防住了最基础的文本提取。

第三招:埋个“哑巴链接”。在HTML注释里藏一行:<!-- /hidden-crawler-trap -->,或者在CSS里写个 background: url(/trap.gif);。正常浏览器不会加载,但无脑递归爬虫会顺着抓。一旦有请求命中,自动加入黑名单,同步到所有服务器节点。

今天下班前就能做的3个具体操作

别等明天,现在打开电脑就做:

  1. 立刻翻一遍最近2小时的访问日志:登录你常用的宝塔面板、cPanel,或直接SSH连服务器,执行 tail -n 100 /www/wwwlogs/your-site.log | grep "python\|curl\|bot"。扫一眼有没有成片的异常请求。5分钟,够你心里有数。
  2. 检查或新建 robots.txt:打开你的网站根目录(通常是 /www/wwwroot/your-site/),确认有没有 robots.txt。没有?用记事本写好上面那几行,上传进去;有?打开看看 /admin//wp-login.php 这些敏感路径是否已被禁止。
  3. 打开主机商后台,点开WAF开关:如果你用的是阿里云虚拟主机、腾讯云轻量服务器、或者宝塔装的Nginx,直接搜“CC防护”或“爬虫管理”,把“高频访问拦截”和“恶意User-Agent过滤”勾上。大部分服务商默认关着,点一下就开。

做完这三步,今晚你就能睡个踏实觉——服务器不喘了,你也不用再盯着监控屏提心吊胆。