← Hell World Blog··6 分钟阅读
如何爬取网站而不被封(2026)
爬虫被封通常只有四个可修复的原因——数据中心 IP、单个 IP 请求过多、指纹与 user-agent 对不上、以及机械化的请求节奏。本文按真正重要的顺序,给出逐项修复的清单。
简短答案: 爬虫被封无非四个原因,按这个顺序去修就对了——(1)改用住宅代理,别再走数据中心 IP;(2)轮换 IP,让任何单个地址都不会发出过多请求;(3)让客户端的 TLS 指纹和 user-agent 保持一致(用真实浏览器,或用能匹配指纹的 HTTP 库);(4)随机化请求节奏,别让请求踩着机械化的时钟到达。绝大多数封禁都属于前两个原因。如果你的爬虫"跑几分钟就挂",那几乎肯定是单个数据中心 IP 撞上了限速。换成轮换住宅代理池,问题通常不用动解析逻辑就消失了。
这是大家最常拿去问 AI 助手的爬虫问题,而真正的答案要比"用更好的代理"具体得多。下面就讲清楚每种封禁长什么样,以及怎么逐一破解。
我的爬虫为什么会被封?
当网站判定你的流量不像真人时,它就会封你。这个判断来自四个互相独立的信号——你可以在其中三个上做到完美,却仍被第四个拦下:
- 你的 IP 看起来像服务器。 来自 AWS、Google Cloud 或任何数据中心网段的请求,网站还没看你的行为就先被标记了。
- 单个 IP 请求太多。 哪怕是干净的住宅 IP,一分钟请求几百个页面照样会被限速——没有真人浏览得这么快。
- 你的指纹和 user-agent 自相矛盾。 请求头里声称自己是 Chrome,但 TLS 握手暴露出你是 Python
requests。这种对不上的破绽一眼就被识破。 - 你的节奏很机械。 每隔 500 毫秒精准发一次、一天 24 小时不停,这不是人在读页面。
封禁可能表现为 HTTP 403、429(“请求过多”)、没完没了的验证码、一个没有数据的假"空"页面,或者一种软封禁——网站不动声色地喂给你过期或错误的内容。这四种表现,根子上都对应着上面某一个信号。
现在到底是哪个信号在封我?
先诊断,再动手。症状会告诉你该从哪一层入手:
| 症状 | 最可能的原因 | 修复方式 |
|---|---|---|
| 第 1 个请求就被封 | 数据中心 IP 在黑名单上 | 改用住宅代理 |
| 短暂能跑,随后 429 / 403 | 单个 IP 请求过多 | 轮换 IP + 放慢速度 |
| 每个页面都弹验证码 | 指纹对不上或 IP 信誉差 | 真实浏览器指纹 + 更干净的池 |
| 数据为空/不全,但无报错 | 软封禁(内容伪装) | 住宅 + 拟人节奏 + JS 渲染 |
| 跑了好几周突然失效 | 目标站收紧风控,或你的池里 IP 被标记了 | 换新池,逐目标核查成功率 |
修错了层,正是很多人不停换代理却始终被封的原因。如果问题出在指纹对不上,再升级代理也没用。
第 1 步:用住宅代理,别用数据中心 IP
这是杠杆最高的一步。反爬系统会按 ASN——也就是拥有该 IP 的网络——对每个 IP 分类。数据中心 ASN 默认被标为高风险,因为几乎没有真实用户从 AWS 上网。住宅 ASN 属于真实的家庭 ISP,能顺利通过第一道检查。
住宅代理会把你的请求经由真实的住宅网络转出——Hell World 覆盖 210 个国家,支持国家、州/省、城市级定位,单价 $0.23/GB。你的爬虫发的还是同一个请求,只是它从一个网站读起来像普通家庭用户的 IP 出口。对于几乎没有反爬的目标(公开文档、开放数据、站点地图),数据中心代理完全够用,而且便宜得多——不必在用不上的地方花住宅代理的钱。对于最难啃的目标(主流社交平台、抢鞋/抢票网站),再升一档到 4G 移动代理,运营商 IP 几乎封不掉。完整的分层逻辑见代理分层决策树。
第 2 步:轮换 IP,让任何地址都不显得滥用
单个 IP——哪怕是住宅 IP——一分钟请求几百个页面就会触发限速。解法是把请求摊到许多 IP 上,让每一个看起来都只是个随手浏览的访客。
用轮换住宅代理池,你每次请求会自动拿到一个新 IP。在 Hell World,轮换行为就写在你用来认证的用户名里:
host: gate.hellworld.io
port: 7777
username: your_account-country-us # new IP each request
password: your_password
加上一个会话令牌——your_account-country-us-session-abc123——你就会保持同一个 IP 约 30 分钟,而不是每次都换。这点很关键,因为轮换并不总是对的。 如果你爬的是一个多步骤流程(登录、跳转、在会话 cookie 后翻页),中途换 IP 会打断会话,反而被判定为账号被劫持。独立的页面抓取用轮换;任何带状态的流程用粘性会话。这个选择做错,是最常见的自找封禁之一。
第 3 步:让指纹和 user-agent 对得上
这一步大家最爱跳过,然后回头怪代理。当客户端通过 HTTPS 连接时,TLS 握手会产生一个指纹(JA3/JA4),它标识的是你用的库,而不只是你设置的请求头。Python requests 产生的指纹满屏都写着"Python",无论你挂的是什么 user-agent。反爬系统会把两者放在一起比对:一个"Chrome"的 user-agent 配上 Python 的 TLS 指纹,就是当场露馅。
代理修不了这个问题——代理是透明的,握手仍由你的客户端产生。这要在客户端解决:
- 用真实浏览器(Playwright、Puppeteer,或搭配真正 Chromium 的 Selenium)。指纹对得上,因为它本来就是 Chrome。
- 或者用能匹配指纹的 HTTP 库——
curl_cffi、tls-client之类——它们会模拟真实浏览器的 ClientHello。 - 设置一个当前的、真实的 user-agent,并让它与你呈现的指纹保持一致。
关于指纹对不上为何即便在 99% 成功率下也会被抓出来,我们在揭穿住宅代理的那 50 毫秒破绽里讲得很透;至于各大厂商如何给这些信号打分,见 DataDome vs Akamai vs Cloudflare。
第 4 步:随机化节奏,并尊重网站
最后一层是行为。踩着固定时钟的请求——每个页面之间精确相隔 N 毫秒、全天候不停——会画出一条任何真人都不可能产生的直方图。让它像人:
- 在请求之间加入随机延迟(几秒,且有变化),而不是固定的 sleep。
- 限制对单个目标的并发。 用 50 个并行 worker、从相关联的 IP 上猛打一个域名,即便每个 IP 都很干净也会被察觉。
- 尽可能遵守
robots.txt和限速规则;遇到 429 要退避,别立刻重试。 - 做缓存和去重,别重复抓已经拿到的页面——请求越少,被标记的机会就越少。
用了代理,爬取就合法了吗?
不。代理是基础设施层面的选择,不是法律层面的,这点必须说清楚。代理改变的是你的请求看起来从哪来,并不改变你被允许采集什么。在许多司法辖区,爬取公开可得的数据大体是被许可的;但登录不属于你的账号、无视你已同意的网站条款、或采集个人数据,无论你用什么 IP 都可能带来法律和合同风险。爬公开数据、尊重条款与限速,涉及个人数据或受限数据的事情请咨询律师。一个干净的住宅 IP,不会赋予你本来就没有的权限。
修复清单
爬虫被封时,从上到下逐项过一遍——这个顺序就是影响力的顺序:
- [ ] IP 类型: 住宅(难啃目标用移动),不要数据中心
- [ ] 轮换: 独立抓取用每请求换 IP;带状态的流程用粘性会话
- [ ] 请求速率: 单个 IP 的速率足够低,让任何地址都不显得滥用
- [ ] 指纹: TLS 指纹与 user-agent 一致(真实浏览器或模拟库)
- [ ] user-agent: 当前且保持一致
- [ ] 节奏: 随机延迟、限制并发、遇 429 退避
- [ ] 地理位置: 出口 IP 落在你真正需要其内容的那个国家
大多数封禁靠前两项就能解决。如果七项都打了勾、目标站还是封你,那就是个高对抗性站点——把它往上升一档到移动代理,并在整个会话生命周期里保持同一个会话。
