摘要

大模型如果想要获取更多的语料,就需要不停的爬。搜索引擎的爬虫,相对来说还会比较规范,比如 ua 会指明 xx bot,但是大模型相关的,我看了下都是正常 ua,这类流量过高,对我造成了困扰,也浪费我服务器的流量,直接 ban 掉。

正文

虽然内容本身就是公开的,但是就是有点看不惯国内一些厂商的做法。

像 Bing、Google、Yandex 只要按照 seo 规范开发,人家就会自动收录,而且更新时效性也快,这种的随便爬,我没意见。但是国内的厂商,必须要你提交一系列内容,甚至花钱才会给你收录。不收录也就算了,还噼里啪啦一天 24 小时不停的爬,太恶心人了。

我的解决方案,来自云服务商的流量,直接一刀切。目前处理几大厂商

  • 阿里云
  • 腾讯云
  • 美团云
  • 华为云

动态根据我已有的流量,形成 ip 封禁列表

sql
1
2
3
4
5
6
7
8
9
SELECT 
    DISTINCT 
    substr(ip_addr, 1,
        instr(ip_addr, '.') +
        instr(substr(ip_addr, instr(ip_addr, '.') + 1), '.') - 1
    ) || '.0.0/16' AS ip_prefix
FROM ip
WHERE ip_loc LIKE '%腾讯云%' or ip_loc like '%阿里云%' or ip_loc like '%美团云%' or ip_loc like '%华为云%'
ORDER BY ip_prefix;

Nginx 全局 HTTP 级别引入拦截机制

text
1
2
3
4
5
6
7
http {
    # 403 响应码改为 201,并访问 /50x.html页面。相应的 /50x.html,要放开拦截
    error_page 403 =201 /50x.html;
    include /usr/local/nginx/conf/block_ip.conf;

    ...
}

block_ip.conf

text
1
2
3
deny 192.168.0.0/16;
deny 172.16.0.0/16;
deny 10.0.0.0/16;

创建 bash 脚本 generate_block_ip.sh

sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/bin/bash

# ====================== 配置项(请根据你的环境修改)======================
# SQLite 数据库文件路径
SQLITE_DB="/site/count-for-page/count-page.db"
# Nginx 黑名单配置文件输出路径
NGINX_CONF="/usr/local/nginx/conf/block_ip.conf"
# 临时文件路径(防止直接写入损坏配置)
TMP_CONF="/tmp/block_ip_tmp.conf"
# 脚本日志路径
LOG_FILE="/usr/local/nginx/logs/generate_block_ip.log"
# 重载 Nginx 命令(根据你的系统调整)
RELOAD_NGINX="/usr/local/nginx/sbin/nginx -s reload"
# ========================================================================

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

# 开始执行
log "===== 开始生成 Nginx 封禁 IP 配置 ====="

# 1. 校验数据库文件是否存在
if [ ! -f "$SQLITE_DB" ]; then
    log "错误:SQLite 数据库文件不存在!路径:$SQLITE_DB"
    exit 1
fi

# 2. 执行 SQLite 查询,生成 Nginx deny 规则
# 你的 SQL 语句 + 拼接 Nginx deny 命令
sqlite3 "$SQLITE_DB" "
SELECT 
    DISTINCT 
    'deny ' || substr(ip_addr, 1,
        instr(ip_addr, '.') +
        instr(substr(ip_addr, instr(ip_addr, '.') + 1), '.') - 1
    ) || '.0.0/16;' AS ip_rule
FROM ip
WHERE ip_loc LIKE '%腾讯云%' or ip_loc like '%阿里云%' or ip_loc like '%美团云%' or ip_loc like '%华为云%'
ORDER BY ip_rule;
" > "$TMP_CONF"

# 3. 校验生成结果是否为空
if [ ! -s "$TMP_CONF" ]; then
    log "警告:未查询到任何云厂商 IP 段,不更新配置文件"
    exit 0
fi

# 4. 备份旧配置(防止出错)
if [ -f "$NGINX_CONF" ]; then
    cp "$NGINX_CONF" "${NGINX_CONF}.bak_$(date '+%Y%m%d')"
    log "已备份旧配置:${NGINX_CONF}.bak_$(date '+%Y%m%d')"
fi

# 5. 替换正式配置文件
mv "$TMP_CONF" "$NGINX_CONF"
chmod 644 "$NGINX_CONF"
IP_COUNT=$(wc -l < "$NGINX_CONF")
log "成功生成配置,共封禁 $IP_COUNT 个 IP 段"

# 6. 重载 Nginx 生效
$RELOAD_NGINX
if [ $? -eq 0 ]; then
    log "Nginx 重载成功,封禁规则已生效"
else
    log "错误:Nginx 重载失败,请手动检查配置!"
    exit 1
fi

log "===== 执行完成 =====
"

创建定时任务,每日凌晨 1 点执行

sh
1
0 1 * * * sh /usr/local/nginx/conf/generate_block_ip.sh