有站长发现,自己原创的一篇文章在搜索引擎里排第二,排第一的那个域名却是别人的,点进去内容一字不差,连标点都没改。这种情况要先把概念理清:网站镜像是什么意思?简单说就是有人用程序把你的整站内容原样复制到另一个域名下,并且定时同步,你更新一篇它就跟着更新一篇,靠你的内容去承接搜索流量。
一、镜像的原理:抓取、复制、同步三步
实现一个镜像站并不复杂。第一步抓取,程序按你的栏目结构遍历列表页,把每篇文章的 HTML 抓下来;第二步复制,把抓到的页面存到对方的服务器上,有的连图片都直接引用你站上的地址;第三步同步,定时重复前两步,所以镜像站的内容往往和你几乎同时更新。理解了这三步就知道两个关键点:镜像站依赖你站的可访问性,也依赖你站的 URL 结构。这两个地方,恰好是后续可以做文章的地方。
二、危害不只是一句“被抄了”
第一层危害是权重稀释。同一份内容出现在两个域名下,搜索引擎要判断谁是原始版本,判断依据包括发布时间、抓取时间、外链指向,镜像站如果抓取更频繁、服务器更快,被它拿走归属的可能性并不小。第二层是排名被抢,同一篇内容两个页面竞争,流量被分走。第三层是品牌被牵连,镜像站可能在你不知情的情况下,往复制过去的页面里塞赌博、医疗类广告或者违法链接,用户在搜索结果里看到你的内容配上这些东西,账会算到你头上。第四层是安全问题,如果对方把域名解析直接指向你的服务器,你的服务器要替它承载全部流量。
三、识别信号:先从访问日志里找线索
判断有没有被镜像,先看服务器访问日志里有没有异常的抓取行为。镜像程序的特征比较明显:来源 IP 集中、在很短时间内连续请求大量文章页、请求间隔规律得像定时器、User-Agent 常常是一个没见过的陌生字符串。下面这段脚本读取访问日志,按 IP 统计它请求过的不同页面数量,把抓取面特别广的来源列出来。
# 从访问日志里找疑似镜像抓取:统计每个 IP 请求过的不同页面数量
import re
from collections import defaultdict
LOG = "/www/wwwlogs/example.com.log" # 改成你的访问日志路径
MIN_PAGES = 50 # 请求页面数超过这个值的来源才打印
PAT = re.compile(r'(\S+) \S+ \S+ \[([^\]]+)\] "(\S+) ([^"]*)[^"]*" (\d+) (\d+) "([^"]*)" "([^"]*)"')
pages = defaultdict(set)
for line in open(LOG, "r", encoding="utf-8", errors="ignore"):
m = PAT.match(line)
if not m:
continue
ip, ts, method, url, status, size, referer, ua = m.groups()
path = url.split("?")[0]
if path.endswith((".html", ".htm", "/")) and status == "200":
pages[ip].add(path)
rank = sorted(pages.items(), key=lambda x: len(x[1]), reverse=True)
for ip, ps in rank[:20]:
if len(ps) >= MIN_PAGES:
print("IP: %-16s 抓取页面数: %d" % (ip, len(ps)))
跑完把头部几个 IP 和搜索引擎的抓取 IP 对照一下。对不上的陌生 IP、又抓了几百上千个页面,就很可疑。这时再拿它的 User-Agent 去日志里反查,看它每天什么时候来、抓了哪些栏目,把时间点和你的内容更新节奏对齐,能进一步印证是不是镜像。
四、应对手段:从低成本到高成本
第一招,把 canonical 标签写全。每页 head 里加上指向自己原始地址的 canonical,明确告诉搜索引擎正版页面在哪,这是成本最低的一招。第二招,做域名校验。在公共头部加一段脚本,发现当前页面不在自己的域名下就跳回源站,镜像页一被打开就露出破绽,搜索引擎抓到的也是跳转。第三招,服务端拦截。如果对方是把域名解析到你的服务器,在 Nginx 里判断 host 不是自己的域名就直接断开连接,让它什么都抓不到;如果是被高频抓取压到了带宽,就按前面的日志结果对可疑 IP 做限速。第四招,整理证据向搜索引擎提交内容抄袭反馈,并同步给镜像站的接入方。四招按顺序叠加使用,镜像站能拿到的流量会被压到很低。相关阅读里那几篇镜像与仿站的处置文章,可以配合一起看。
相关阅读:
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!
