采集任务跑到第 18 分钟开始返回 403,页面提示「您的访问过于频繁」,换一台机器同样的代码又能正常抓,同段 C 段 26 个地址全部失效。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
curl -s -o /dev/null -w '%{http_code}' 'https://example.com/list?page=1'
ss -tn state established '( dport = :443 )' | wc -l
目标站按出口 IP 的请求速率计数,超过阈值后把整段地址写进黑名单。单机并发 20 时每秒请求数远超正常浏览频率,连接池又把请求集中复用到同一段出口上。这一点先确认清楚,后面就不用反复试。
「爬虫 IP 封禁」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
具体做法是,把并发降到 2 并强制每次请求间隔 1 秒;复用连接但限制单连接每秒请求数;被封后整段 IP 停用 30 分钟再探活;记录每小时的 403 比例作为熔断依据。
改完照着核一遍,同一个任务重跑,403 从每小时 1200 次降到 0,单机抓取量从 4.8 万页降到 1.2 万页,没有再触发封禁。
