恶意爬虫抓走网站内容,怎么取证维权?

网站内容被恶意爬虫批量抓走,多数人的第一反应是封 IP,结果对方换个出口接着抓,自己手里一条能用的证据都没有。本文用 10 个问答讲清恶意爬虫的取证方法、证据固定流程、投诉与维权路径,以及技术封禁的正确做法。

Q:发现内容被抓,第一步该做什么?

  • 先别急着封。正确顺序是确认事实、固定证据、评估损失,封禁排在最后。
  • 确认事实要落三件事:哪些页面被抓、来源 IP 与 UA 是什么、抓取发生在什么时间段。
  • 先封 IP 有副作用:对方立刻换出口,完整抓取轨迹就难还原;急于改 robots.txt 或加验证码,对方一停,证据也一起停了。
  • 技术反制和数据留存必须并行:一边留证据,一边做限速与拦截,两者不冲突。

Q:怎么判断对面是恶意爬虫,而不是正常用户?

  • 看三条就够:频率远超人类(同一 IP 每分钟几十上百次请求)、路径按列表页顺序机械遍历、UA 与来源不符(自称百度蜘蛛但反查域名对不上)。
  • 先把高频来源拉出来,一眼就能看出异常:
# 单 IP 请求量 Top 30
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -30

# UA 分布 Top 20(默认 combined 格式,UA 在第 6 个引号段)
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# 某个可疑 IP 的每分钟请求数
grep '^203.0.113.45 ' /var/log/nginx/access.log | \
  awk -F'[:[]' '{print $2":"$3}' | uniq -c | sort -rn | head
  • UA 只是字符串,谁都能改。判真伪靠 rDNS 反查:百度蜘蛛出口必须解析回 baidu.com,这步不能省。

Q:取证要取到什么程度才算「能用」?

不管走哪条路径,证据都要满足三个条件,缺一条就会被轻易否掉:

  • 主体可识别:证据要能指向一个具体主体,至少是 IP、ASN 或公司名,不能只是「有人爬我」。
  • 时间可追溯:抓取发生在你发布之后,这条时间线必须闭合。
  • 内容未被篡改:要有完整性校验,否则对方一句「日志是你自己改的」就把你顶回去。

Q:日志怎么固定,才能证明没被改过?

  • 原则是先固化、再计算哈希、最后做第三方时间戳。顺序错了,哈希就没有证明力。
  • 原始日志不要直接拿去提交,先按时间窗切出与侵权相关的那一段,连同当时的 Nginx 配置一起打包:
# 1. 建立独立取证目录,带上 UTC 时间戳
D=/evidence/$(date -u +%Y%m%dT%H%M%SZ); mkdir -p "$D"

# 2. 拷贝原始日志与配置(-a 保留时间属性)
cp -a /var/log/nginx/access.log "$D/"
cp -a /etc/nginx/nginx.conf "$D/"

# 3. 切出可疑 IP 的完整轨迹,作为可读附件
grep '^203.0.113.45 ' "$D/access.log" > "$D/suspect_203.0.113.45.log"

# 4. 记录取证时刻并计算哈希
date -u +"%Y-%m-%dT%H:%M:%SZ" > "$D/collected_at.txt"
tar czf "$D.tar.gz" -C /evidence "$(basename "$D")"
sha256sum "$D.tar.gz" | tee "$D.sha256"

# 5. 申请 RFC3161 可信时间戳(需 TSA 服务地址)
openssl ts -query -data "$D.tar.gz" -sha256 -no_nonce -out "$D.tsq"
  • 哈希值和压缩包要分开存放,最好同时发一份到自己的对象存储或邮箱,形成第三方留存记录。
  • 后续要起诉,把这份包交公证处做保全公证,或使用司法认可的区块链存证平台。

Q:页面快照怎么截才算有效证据?

  • 只截一张图不够,因为图片容易被认为是拼接的。要同时留原始 HTML、完整响应头、可见渲染截图三份。
  • 原始 HTML 保存的是对方服务的真实输出,响应头里的 Date 和 Server 提供了时间与来源旁证:
# 保存网页原始响应与响应头
curl -sS -D page.headers.txt -o page.html \
  --compressed -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" \
  "https://example.com/post/123.html"

# 记录抓取时刻与页面哈希
date -u +"%Y-%m-%dT%H:%M:%SZ" >> page.headers.txt
sha256sum page.html page.headers.txt >> page.sha256

# 渲染截图(无头浏览器,固定视口)
chromium --headless --disable-gpu --window-size=1280,2000 \
  --screenshot=page.png "https://example.com/post/123.html"
  • 截图最好带上可见的系统时间,或录一段从地址栏到页面内容的连续屏幕录像。

Q:怎么证明「他抄的是我」,而不是「我们都抄了同一个来源」?

  • 核心是把自己的原创时间线做成闭环:首发时间、搜索引擎快照、站点地图提交记录、编辑器或 Git 提交历史,四个里凑够两个就够用。
  • 再加一层内容指纹:独有措辞、小标题结构、图片 EXIF、结构化数据里的自建字段,对方整段照搬时会一起被搬走。
  • 不建议用隐藏文字、白色文字这类「陷阱词」去钓鱼,这类手段本身可能被搜索引擎判定为作弊,反而伤到自己。要做指纹就做在正常内容里。
  • 发现盗用后,用搜索引擎的精确匹配去查扩散范围:把一句特征明显的原文加英文双引号搜索,能快速找出还有哪些站在转载。

Q:除了打官司,有没有成本更低的路径?

有,而且大多数情况下先走这条更划算。按「快、中、慢」三档推进:

  • 快(1~3 天):向承载侵权内容的平台投诉,包括搜索引擎的侵权投诉入口、内容平台的举报通道、应用商店。附上权属证明、链接对比表和哈希值,通过率明显更高。
  • 中(3~15 天):向爬虫所在 IP 的云厂商或 IDC 提交 abuse 举报。邮件里写清时间窗、请求频率、UA 与 IP,并说明已构成对服务条款的违反。云厂商对这类举报处理力度不小,很多爬虫直接就被停机器了。
  • 慢(数周起):委托律师发函、起诉。适合对方是公司主体、侵权规模大、有明确商业获利的情形。
  • 三档可同时进行。先做快的,是为了在慢的路径上拿到更多筹码。

Q:发律师函要准备哪些材料?

  • 权属证明:原创稿件、发布后台记录、著作权登记证书(有则更好)。
  • 侵权对比表:左侧原文链接与截图,右侧侵权链接与截图,逐段标注重合部分,比大段控诉有用得多。
  • 证据包:公证文书或可信时间戳证书、日志哈希、页面快照。没有第三方固化的材料,函件的分量会差很多。
  • 诉求清单:停止抓取与停止传播、删除已抓内容、书面回复、保留进一步追责的权利。诉求要具体,别写「依法承担一切责任」这种空话。
  • 律师函最现实的作用不是让对方立刻赔钱,而是把「明知」这个状态固定下来。对方收到后继续抓,后续主张故意侵权就有了基础。

Q:技术侧怎么封禁才不误伤搜索引擎?

  • 别只用 UA 白名单,UA + rDNS 双重校验才靠谱:真蜘蛛 IP 反查必落在搜索引擎自有域名下。
  • 把校验结果做成 map,命中才放行,其余走限速:
# 先定义可疑与已知来源,再分级处置
map $http_user_agent $bot_flag {
    default                          0;
    ""                               1;                       # 空 UA 一律标记
    ~*(python-requests|scrapy|curl|wget|Go-http-client)  2;  # 明显脚本
    ~*(Bytespider|AhrefsBot|SemrushBot)                  2;  # 已知商业采集
}

limit_req_zone $binary_remote_addr zone=bot:20m rate=3r/s;

server {
    location / {
        if ($bot_flag = 2) { return 403; }
        limit_req zone=bot burst=20 nodelay;
        limit_req_status 429;
    }
}
  • 封网段一定要留回滚方案:把 iptables 规则写成可删除的注释标签,或干脆用 ipset 管理,避免哪天误封了整个云厂商的地址段。
  • 对已经确认的恶意 IP 用 ipset 批量封,比逐条 iptables 高效得多:
ipset create badbots hash:ip timeout 86400
ipset add badbots 203.0.113.45
iptables -I INPUT -m set --match-set badbots src -j DROP
# 回滚:iptables -D INPUT -m set --match-set badbots src -j DROP
  • 再加一层蜜罐陷阱链接:页面里放一条正常用户不会点的隐藏链接,谁访问就记进名单,真蜘蛛不会跟进,误伤率很低。

Q:还有什么补充建议?

  • 日志留存至少 6 个月。这既是等保要求,也是维权时的底气,很多案子输在「日志已经轮转删掉了」。
  • 建立定期巡检机制:每周用特征句子做一次精确搜索,发现盗用就顺手固定证据,别等到损失做大才动手。
  • 把取证流程写成脚本,出事一条命令跑完。上面几段可直接整理成 collect_evidence.sh。
  • 最后一句话:维权能不能赢,往往在你发现被爬的那一小时就决定了。技术封禁解决的是「现在别抓」,证据固定解决的是「抓了要付代价」,两件事分开做,别互相耽误。