使用requests+bs4爬取需登录站点时如何避免IP被封禁
需登录站点爬虫的防封禁落地方法
现有代码的常见风控触发点
你当前的脚本逻辑虽然能完成登录和内容拉取,但存在几个必然触发风控的硬伤:
- 仅设置了单一固定User-Agent,请求特征和真实浏览器存在明显差异
- 登录完成后无间隔连续发起目标内容爬取,行为路径和真人浏览模式差异极大
- 单IP无速率控制持续高频请求,必然会被站点的流量风控规则标记
具体可落地的防封操作
1. 补全请求的真实浏览器特征,降低单请求识别率
- 不要仅依赖单一User-Agent伪装,维护一套和Chrome、Edge等主流浏览器版本匹配的完整请求头集合,除User-Agent外,要补齐
Accept、Accept-Language、Referer、sec-ch-ua、sec-fetch-dest这类浏览器默认携带的头参数,每次请求随机匹配一套同内核的请求头组合,避免所有请求的头参数完全一致。 - 给所有请求加随机化间隔延时,不要使用固定的等待时长,每次请求前随机在2~8秒区间内等待,模拟真人浏览时的阅读、操作停顿。
- 复用有效的登录态cookie,不要在单次任务中频繁重复调用登录接口。仅当检测到cookie失效、被重定向到登录页时,再重新触发登录流程,重复发登录请求本身就是高风险的爬虫行为标记。
- 模拟真实浏览路径:登录成功后不要直接精准抓取目标字段,先随机跳转几个站内的公开导航页、分类页,停留随机时间后再访问目标列表页,避免形成“登录完立刻定向爬取目标内容”的明显爬虫行为模式。
2. 适配登录场景的IP策略,避免IP被封
带登录态的场景不能照搬无登录站点的代理轮换逻辑:站点风控会校验登录账号的IP一致性,如果同一个账号的登录态短时间在地理位置跨度极大的IP间跳转,会直接触发账号和IP的双重封禁。
- 给每个登录账号绑定长期稳定的静态住宅代理IP,登录和后续爬取全程复用同一个IP,模拟真实用户长期在固定网络环境下访问站点的状态。
- 爬取量级较大时,准备多套独立的登录账号,实现账号和IP一一绑定:每个账号对应一个专属静态住宅IP,既不要让多个账号共用同一个IP,也不要让单个账号的请求跨IP跳转。
- 规避免费公共代理、廉价机房代理,这类IP大多已经被站点风控纳入黑名单,哪怕不登录,首次请求就可能被拦截。
3. 行为层的风控规避细节
- 把爬取速率控制在普通用户的正常访问阈值内:参考站点普通用户的平均浏览频率(通常为每分钟5~8个页面),脚本的请求速率不要超过这个阈值,超高频请求哪怕换了IP和账号,也必然会被风控标记。
- 打乱固定的爬取路径,不要始终按照“首页-分类页1-分类页2”的线性顺序爬取,随机调整页面访问顺序,减少行为的规律性。
- 加入随机的常规用户行为:比如偶尔重复刷新同一个页面、偶尔访问不存在的页面、偶尔延长停留时间,这些细节可以大幅降低风控的识别概率。
- 做好封禁前置检测:每次请求后校验页面状态,一旦遇到跳转登录、弹出验证码的情况,立刻暂停当前账号和对应IP的爬取任务,冷却1~2小时后再继续,不要硬发请求触发彻底封禁。
你可以先对现有代码做基础优化,在请求间隔加入随机延时逻辑:
import time import random # 每次发起请求前随机等待2~6秒,避免固定间隔被识别 time.sleep(random.uniform(2, 6))
内容的提问来源于stack exchange,提问作者SMTH
相关产品推荐
相关产品推荐

