搜索自己的文章,点进去发现落在一个陌生域名上,内容一字不差——这就是整站镜像。本文用 10 个问答讲清镜像爬虫的行为特征、怎么从日志里把它揪出来、robots 和 canonical 为什么挡不住、Nginx 与 ipset 该怎么封,以及内容已经被镜像后在 SEO 与维权层面该怎么处理。
Q:怎么判断自己的站被整站镜像了?
三个信号,出现任何一个都该立刻自查。
- 搜索结果里出现同内容异域名:搜一句你原创文章里的原句,除了你自己的域名,还跳出别的站点。最典型。
- 某个陌生 IP 在持续、完整地抓取全站:不是抓几个页面,而是从首页顺着分页、标签页、归档页一路抓到底,规律性极强。
- 你更新的内容对方几分钟内同步出现:说明对方是高频轮询你的列表页和 sitemap,而不是偶发抓取。
验证方法:把你文章的独家句子(长句、错别字、自定义参数名都可以)作为关键词搜索,比搜标题可靠得多,因为标题很容易被改写。
Q:整站镜像对站长到底有什么危害?
危害不止「被抄」这一层,按严重程度排:
- 稀释搜索权重与流量:同质内容被搜索引擎判定重复,原创源可能被降权甚至被当成转载方。如果镜像站是更老、权重更高的域名,更糟。
- 转化与品牌被截流:镜像站会挂自己的广告位、自己的联系方式,你的用户实际被导到了别人手上。
- 带宽与服务器成本:全站抓取本身就要消耗你的带宽和数据库资源,站点越大越明显。
- 内容被二次加工的风险:镜像内容可能被用于挂马、诈骗、违规业务,出了问题署名方却是你的原创品牌。
- 被镜像站反过来投诉:极端情况下,对方抢先注册或抢先投诉,处理起来相当麻烦。
所以这件事必须当天处理,不能想着「反正不影响我」。
Q:镜像爬虫和普通爬虫的行为差别在哪里?
差别非常大,抓住这几点就能把它和其他爬虫区分开。
- 覆盖范围:普通爬虫(搜索引擎、监控探针)抓重点页;镜像爬虫追求全量覆盖,连归档页、标签页、翻页参数、已失效的老链接都不放过。
- 访问节奏:镜像爬虫通常高并发且几乎匀速,间隔稳定得不像人;真实用户和搜索引擎蜘蛛有明显的节奏波动。
- 资源加载:镜像爬虫只抓 HTML,基本不请求 CSS、JS、图片;正常浏览器一定会请求静态资源。这是最有效的判别依据之一。
- 会话与 Cookie:镜像爬虫一般不保存 Cookie,每次请求都像新访客;对需要登录态、需要验证的页面反而抓不到。
- 对 robots.txt 的态度:正规搜索引擎会读并遵守,镜像爬虫根本不去请求这个文件。
把这五点组合起来判断,误判率会降到很低。
Q:robots.txt 能不能挡住镜像爬虫?canonical 有用吗?
先给结论:两者都拦不住,但都值得配,因为它们解决的是不同问题。
- robots.txt 是「君子协定」:它只是请求对方不要抓,不会强制阻断。镜像爬虫恰恰是不遵守规则的那一类,所以你写了等于没写。但它对正规搜索引擎有效,能减少无效抓取,仍然该配。
- canonical 是「归因声明」:告诉搜索引擎「原创在那里」。它有助于避免你被判定为重复内容方,但对方站点上的 canonical 不会帮你说话——对方完全可以指向自己。
- 真正起作用的只有三件事:在服务端识别并拦截、在搜索结果层面向平台举报侵权、让内容带上可验证的原创时间证据。
顺带提醒:不要在 robots.txt 里写不该被公开的敏感路径,某些爬虫就是拿它当目录索引用的。
Q:怎么从访问日志里把镜像爬虫揪出来?
用日志做筛选,比在浏览器里翻页面高效得多。
# 1. 找高并发来源:单 IP 请求数 Top 50
awk '{print $1}' /var/log/nginx/access.log \
| sort | uniq -c | sort -rn | head -50
# 2. 看这些 IP 是否在请求异常多,且路径分布很散(全站抓取特征)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn \
| awk '$1 > 500 {print $2}' > /tmp/busy_ip.txt
# 3. 判断可疑 IP 是否只抓 HTML、不抓静态资源
grep -F -f /tmp/busy_ip.txt /var/log/nginx/access.log \
| awk '{print $7}' | grep -E '\.(css|js|png|jpg|webp|woff2)$' | wc -l
# 4. 看是否从不请求 robots.txt(正规蜘蛛几乎每次会话都会读)
grep -F -f /tmp/busy_ip.txt /var/log/nginx/access.log | grep -c 'robots.txt'
# 5. 看 UA 是否可疑(空 UA、伪装 UA、相同 UA 拖着一堆 IP)
grep -F -f /tmp/busy_ip.txt /var/log/nginx/access.log | awk -F'"' '{print $6}' | sort | uniq -c | sort -rn
判读标准:第 3 步结果接近 0、第 4 步结果接近 0,而单 IP 请求数又很高——基本可以确定是抓取型爬虫,而不是搜索引擎蜘蛛。
Q:确认是镜像爬虫后,怎么封才干净?
按「先精准、后范围」的顺序封,避免一上来就封大段。
# 1. 单 IP 封禁(先确认无误伤)
ipset create botban hash:net timeout 86400 -exist
ipset add botban 203.0.113.77 -exist
iptables -I INPUT -m set --match-set botban src -j DROP
# 2. 整个 C 段封禁(同一来源往往整段轮换)
ipset add botban 203.0.113.0/24 -exist
# 3. 查看当前封禁与命中计数
ipset list botban | tail -30
- 封 C 段而不是单 IP:抓取者通常会在同段内换 IP 绕封,只封单 IP 会陷入拉锯。
- 用 ASN 维度判断是否该封整段:如果这些 IP 全部来自同一个云厂商的小段,封段风险低;如果混在运营商的家宽池里,误封风险高,应该改用频率限速而不是直接封禁。
- 一定设过期时间:用
timeout自动解封,避免长期误伤真实用户。
Q:Nginx 侧推荐怎么配?给一份可直接用的方案
# 1) 空 UA 与已知爬虫库 UA 直接拒绝(正常浏览器不会空 UA)
map $http_user_agent $bad_ua {
default 0;
"" 1;
"~*(python-requests|Scrapy|scrapy|HttpClient|Go-http-client|curl|wget)" 1;
"~*(semrush|ahrefs|mj12bot|megaindex|dotbot|bytespider)" 1;
}
# 2) 给命中可疑特征的请求单独限速(空 key 不计入限速,正常 UA 不受影响)
map $bad_ua $bot_limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $bot_limit_key zone=bot_zone:10m rate=1r/s;
server {
if ($bad_ua) { return 403; }
location / {
limit_req zone=bot_zone burst=5 nodelay;
limit_conn perip_conn 20;
}
# 全站抓取者最爱的分页 / 搜索 / 档案页,单独收紧
location ~* ^/(page|search|tag|archive|author)/ {
limit_req zone=bot_zone burst=2 nodelay;
}
}
几个要点:空 UA 直接 403 基本零误伤;分区限速一定要用空 key 技巧,否则可能连正常 UA 一起被限;分页与搜索页是最该保护的地方,它们数量大、价值低、却最容易被抓穿。改完配置先 nginx -t 校验,再 nginx -s reload 平滑生效。
Q:怎么在抓取阶段就把它「钓」出来?
用一个正常的防护手段:蜜罐链接。原理很简单——正常用户和正规搜索引擎永远不会访问到它,只有顺着 HTML 无差别抓取的爬虫会踩上去。
<!-- 在页面里放一个隐藏链接,正常用户看不见 -->
<a href="/trap/crawler-check-9f3a" rel="nofollow"
style="position:absolute;left:-9999px;top:-9999px">更多内容</a>
# Nginx 侧记录踩坑来源,用于后续封禁
location = /trap/crawler-check-9f3a {
access_log /var/log/nginx/trap.log main;
return 404;
}
踩到蜜罐的 IP 可以认定为无差别抓取者,直接进自动封禁清单。这个方案还有一个额外好处:能区分「真正为内容而来的蜘蛛」和「批量收割的爬虫」,是判断误封风险最好的依据。
Q:内容已经被镜像出去了,SEO 和维权层面怎么办?
拦截只能阻止后续抓取,已经抓走的部分要另一套动作。
- 向搜索引擎提交侵权投诉:主流搜索引擎都有内容侵权/原创保护通道,提交时要带上你文章的发布时间证据与原始 URL,处理周期通常在几天内。
- 确认自己的原创时间戳是可信的:搜索结果里的时间、你后台的发布时间、页面结构化数据里的
datePublished——三处一致,投诉才好通过。 - 主动向对方域名发起联系或投诉:如果对方挂着备案信息、广告合作联系方式,走侵权通知往往比技术手段更快。
- 检查是否已被爬走敏感内容:会员文章、付费内容、后台路径、测试页面如果也在抓取范围内,要立刻处理泄露面。
- 修好源头:把这次抓取的 UA、IP 段、访问特征固化成规则,否则换个域名还会再来。
Q:还有什么补充建议?
落地顺序建议这样排:① 空 UA 与已知爬虫 UA 拦截 → ② 分页/搜索/标签页单独限速 → ③ 蜜罐链接建立自动封禁闭环 → ④ 封禁从单 IP 逐步升级到 C 段与违规 ASN → ⑤ 输出原创时间戳证据并提交侵权投诉 → ⑥ 每周复盘抓取 Top IP 与路径模式。
补三个提醒。第一,别把自己人拦了:CDN 回源、监控探活、搜索引擎官方蜘蛛一定要白名单放行,并且定期核对官方 UA 与 IP 段是否更新。第二,统计层不要混入爬虫数据:被整站抓取期间,PV 会虚高、跳出率会失真,分析报告里要标注,否则会做出错误的内容决策。第三,防护要按「成本」思路做:镜像爬虫通常是为了低成本复制内容,一旦抓取需要付出被封锁的代价,对方往往会转向更省事的其他目标。
一句话总结:整站镜像防不住靠声明,只能靠服务端识别与拦截。把「空 UA + 分区限速 + 蜜罐闭环 + C 段封禁」这四步做全,绝大多数收割型爬虫都撑不过一天。