做SEO的人多少都碰过学术库。我定期抓几个数据库的论文元数据——标题、作者、摘要、引用关系、DOI,用来判断某个细分领域的热度走向,顺便给内容团队做选题。去年Q4,我采集的三个库里有两个悄悄换了风控:单IP日请求阈值压到原来的三分之一,验证码触发从"偶尔一次"变成"每20次必出"。那个跑了大半年的免费代理池,48小时内全线崩盘。
封禁日志里的三个数字,说明免费方案已经不可用
出事的头两天我没急着换工具,先把三天的封禁日志拉出来做了个统计。结果比我预想的难看:
- 可用率8.2%——5000次请求里3480次直接失败,剩下的还有一半返回的是验证码页而不是正文;
- 封禁IP中91%集中在同一批机房C段,说明对方不是按单IP封,是按段封;
- 平均响应3420ms,而学术站本身的TTFB只有400ms左右,多出来的三秒全耗在代理跳转和重试上。
更麻烦的是共享池的"接盘"问题。同一个IP在几小时前被别人刷到黑名单,我接手的时候它已经是废的,但我不知道——只有请求失败才反应过来。这类损耗在免费池里没法排查,你永远不知道下一个IP是新的还是别人用剩的。
学术库为什么对低质IP零容忍
很多人以为反爬就是看频率,把并发降下来就行。我一开始也这么想,把并发从20一路降到3,失败率只从34%掉到28%——瓶颈根本不在频率,在IP质量本身。
学术站的风控逻辑和电商、资讯站不一样,它有三个特点叠加:单请求价值高(一篇论文的元数据+引用关系,几乎等于一份完整情报),账号体系绑定严格(很多库要机构登录),以及行为指纹细(详情页→引用页→PDF通常要在同一会话里完成)。这就导致两条硬规则:机房IP段整段拉黑,因为正常学者不会从数据中心出口访问;出口IP必须支持粘性会话,否则跳到第二页就触发风控。免费池恰好两条全踩,既没有住宅出口,也没有会话概念。
迁移方案:选型对比与五步灰度切换
选型我只看了三个硬指标:实测可用率、会话保持能力、单位成本。把当时试过的三条路线放在一起,数据差别是一眼可见的。
| 维度 | 免费代理池 | 按量提取API | 隧道代理 |
|---|
| 实测可用率 | 8.2% | 94.5% | 99.9% |
| 平均延迟 | 3420ms | 380ms | <10ms |
| 单价 | 0元(时间成本另算) | 0.0022元/IP起 | 16元/天起 |
| 会话保持 | 无 | 需手动绑定 | 默认粘性,1–5分钟可调 |
| 实测封禁率 | 31% | 2.1% | 0.6% |
切换过程我踩了一次坑:第一次直接全量切,结果隧道认证参数写错,半天请求全打在了直连上,日志里堆了几千条403。后来改成灰度,才稳下来。
- 先并行跑,20%流量走新方案,两个池子的成功率同时打点,跑满24小时再决定;
- 认证方式优先选白名单或账密,不要每次请求都调一次提取API,那部分开销会比代理本身还大;
- 会话粒度设成90秒,刚好覆盖详情页→引用页→PDF三段抓取;
- 加熔断:同一个出口连续5次非200就强制换IP,避免死循环重试;
- 灰度比例20%→50%→100%,每档观察一个完整采集周期。
import requests
PROXY = "http://user:pass@tunnel-host:port"
s = requests.Session()
s.proxies = {"http": PROXY, "https": PROXY}
s.headers.update({"User-Agent": UA, "Accept-Language": "en-US,en;q=0.9"})
# 90秒内复用同一出口,覆盖详情页->引用页->PDF
resp = s.get(url, timeout=15)
两周验证数据,和一个反常识的发现
切换完成后跑了整整两周,抓取量约12万条论文元数据。核心指标的变化如下:
| 指标 | 切换前 | 切换后 |
|---|
| 抓取成功率 | 66.4% | 99.4% |
| 封禁率 | 31% | 0.6% |
| 单篇完成耗时 | 21.3s | 2.7s |
| 日均人工介入 | 3.2次 | 0.1次 |
| 12万条数据总耗时 | 68小时 | 19小时 |
成本账也算得清:两周隧道代理花了两百出头,如果按量提取,12万个IP乘以单价还要再叠上绑会话的额外调用,实际更贵。省下来的主要是人工——以前每天得有人盯日志手动换池子,这部分折算下来远超代理费用。
有个发现和直觉相反:我原以为出口城市越分散越安全,专门挑了每天轮换二十个城市的配置,跑了一周成功率反而不如固定几个城市。把日志按C段聚合后才明白,学术站真正盯的是IP段的连续性,不是城市分布——同一C段被高频调用更容易被整段标记。改成跨段随机跳跃后,成功率又涨了0.8个百分点。这个点很多评测文章不会写,但它是真实存在的性能拐点。
如果只是排名监控那种高频低价值的请求,免费池凑合能用;但学术采集这种低频高价值、又要保持会话的场景,专业方案基本是必选项。我现在主力用蚂蚁代理(mayihttp.com)的隧道代理,看中的就是粘性会话加99.9%可用率这两条。不过前提是,别像我第一次那样全量硬切,灰度这一步不能省。