做外贸独立站这几年,后台最恶心的事情莫过于:一早起来看一眼服务器监控,CPU直接飙到100%,内存爆满,MySQL被拉死,甚至连订单提醒邮件都发不出去。去翻Nginx的access.log,密密麻麻全是几毫秒打一次的垃圾请求。很多新手站长以为是流量爆发,其实99%都是同行雇的采集脚本、野鸡SEO工具或者扫描漏洞的僵尸网络在狂刷。今天我就结合这几年踩坑踩出来的经验,聊聊一套切实落地的跨境独立站防恶意爬虫策略,不玩虚的概念,直接教你怎么把这帮吸血的爬虫掐死在服务器大门之外。
Array在动手封禁前,千万别脑子一热全站套个五秒盾。你做的是外贸独立站,是做生意的,如果把真正的买家和搜索引擎蜘蛛(Googlebot、Bingbot)挡在门外,你的SEO和转化率就直接归零了。
我把爬虫分为四种,策略完全不同:
| 爬虫类型 | 典型代表 | 危害程度 | 处理手段 |
|---|---|---|---|
| 搜索引擎蜘蛛 | Googlebot, Bingbot, YandexBot | 核心资产 | 必须无条件放行,保证抓取频次 |
| 商用SEO爬虫 | Ahrefs, Semrush, DotBot | 中度(偷数据、占带宽) | 限流或直接封死(看你是否依赖它们的数据) |
| 同行采集器 | Scrapy, Requests, 无头浏览器 | 极高(抄Listing、扒图、比价) | 严厉封杀,全链条识别阻断 |
| 恶意扫描器 | Sqlmap, Zgrab, 针对WP的扫描脚本 | 极高(找漏洞、挂黑链) | IP级秒封,甚至送蜜罐封ASN |
很多站长喜欢在WordPress或者Shopline插件里搞防抓取,这其实很蠢。因为请求一旦到了PHP或者Node.js应用层,你的内存和CPU就已经被消耗掉了。防恶意爬虫,最理想的做法是在反向代理层(Nginx)直接把请求给drop掉。
不少低端同行采集连UA(User-Agent)都懒得伪造,直接用Python、curl默认请求。在你的站点配置文件(比如nginx.conf)的http或server块里加上这一段:
# 屏蔽常见采集工具的UA if ($http_user_agent ~* (Scrapy|Curl|HttpClient|Python-urllib|Wget|Requests|Go-http-client|Java)) { return 403; } # 屏蔽白嫖带宽的SEO工具爬虫(除非你自己天天用Semrush查词) if ($http_user_agent ~* (AhrefsBot|SemrushBot|MJ12bot|DotBot|MegaIndex)) { return 403; }
针对那些几秒钟扫几百个页面的爬虫,必须做限流。
在http块定义规则:
# 基于IP限制请求,每秒最多处理5次,超出排队 limit_req_zone $binary_remote_addr zone=anti_spider:10m rate=5r/s;
在你的location /块应用它:
location / { limit_req zone=anti_spider burst=10 nodelay; try_files $uri $uri/ /index.php?$args; }
这样一旦有爬虫疯狂多线程并发,直接触发503或者被丢弃,你的MySQL不至于瞬间被打死。
做跨境独立站,Cloudflare(CF)基本是标配。很多站长只开了免费版的默认设置,等于放着大杀器不用。
在CF的安全性 -> WAF -> 自定义规则里,新建两条规则,效果拔群:
正经的买家绝大多数来自家用宽带(Comcast, AT&T, Vodafone)或者移动网络。那些挂在机房服务器(如DigitalOcean、Hetzner、OVH、Linode、腾讯云、阿里云)里的IP,跑的大概率就是爬虫脚本。
在CF表达式编辑器里写入:
(ip.geoip.asnum in {14061 16276 24940 16509 63949} and not cf.client.bot)
注:14061(DigitalOcean), 16276(OVH), 24940(Hetzner)等是爬虫重灾区,后面加上and not cf.client.bot是CF自带的已验证爬虫白名单,保证Googlebot不受影响。动作直接选:托管质询(Managed Challenge)。
爬虫最喜欢爬什么?搜索接口(/search)、购物车接口、商品详情页的变体接口。 针对这类路径,只要检测到它没有通过标准的浏览器特征,直接弹验证码:
(http.request.uri.path contains "/search" and not http.request.version eq "HTTP/2" and not http.request.version eq "HTTP/3")
老派的采集脚本很多还在用HTTP/1.1,而现代浏览器绝大部分都是HTTP/2甚至HTTP/3。就这一条规则,能把半数采集器卡在门外。
如果同行上了Puppeteer或者Playwright这类“无头浏览器”,能模拟鼠标滑动、能解析JS,上面的规则可能还不够干净。这时候我经常用一招老站长偏方——页面蜜罐(Honeypot Trap)。
标签去爬取每一个URL。/trap-product-page.html,不管三七二十一,在后端脚本写一段逻辑: fail2ban或者直接写进防火墙:iptables -I INPUT -s -j DROP 。这招对付那些深度爬取整个站点的定制采集脚本,简直是一抓一个准。
做跨境独立站防恶意爬虫策略,最忌讳的就是杀敌一千自损八百。不少做外贸的哥们儿做完防护,恶心爬虫是没了,过两周发现GSC(Google Search Console)里索引页面腰斩,原因就是把真搜索引擎蜘蛛当成了恶意爬虫。
记住两条铁律:
$ host 66.249.66.1 1.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-1.googlebot.com. 它必须以googlebot.com结尾,然后再反查一次这个域名,确保IP一致。如果你用Nginx,可以通过内置的ngx_http_rdns_module或者在WAF层勾选“信任已知机器人”,别自作主张写一个粗暴的屏蔽正则把搜素引擎老巢给端了。
独立站的安全运维本质上是成本对抗。同行扒你一个站点,成本如果只要写两行代码,他天天搞你;如果你通过Nginx过滤、边缘WAF质询加上蜜罐脚本,让他采集成本从“写两行代码”上升到“每爬十页要买住宅代理IP解验证码”,他自然就跑去扒别人的站了。做运维干脆一点,把这些规则配好,服务器清净了,流量数据和跳出率才能真正反应你的业务真相。