人人都会AI编程

21.4 反爬应对:代理池、UA 池、验证码处理、Cookie 管理

更新时间:2026-07-12

当你开始批量抓取数据,网站的反爬虫机制几乎一定会触发。与其每次都临时找对策,不如把常见的应对方案整理成工具箱。这一节就讲四种最常用、最有效的反爬对策。

代理池:换个 IP 再请求

网站通常通过 IP 访问频率来判断是不是爬虫。同一个 IP 短时间内请求太密,就可能被封禁或弹出验证码。

  • 代理池的原理:维护一组可用代理 IP,每次请求随机换一个,让服务器看到的来源 IP 不断变化,无法锁定单一地址。
  • 代理来源
  • 免费代理:网上爬取的免费 IP,可用率低、速度慢,适合练手。
  • 付费代理:如阿布云、快代理等,提供稳定、高匿的 IP 池,按量或按时计费,生产环境首选。
  • 自建代理:用云服务器搭配动态 IP,成本低但波动大。
  • 实用方案
  • 使用 requests 时,直接设置 proxies 参数:requests.get(url, proxies={'http': 'http://IP:PORT'})
  • Scrapy 的话,可配合中间件 scrapy-proxies 或自行编写下载中间件,从代理池中随机取 IP 注入请求。
  • 注意事项:代理的匿名度(透明、匿名、高匿)影响是否暴露真实 IP;使用前可用 httpbin.org/ip 检测代理是否生效。

UA 池:伪装成普通浏览器

User-Agent(UA)是浏览器向服务器表明自己身份的字符串。如果所有请求都带着 python-requests/2.x 这类默认 UA,很容易被识别为脚本。

  • UA 池的作用:收集大量来自真实浏览器的 UA 值,每次请求随机更换,模拟不同设备、不同浏览器发来的正常访问。
  • 常用来源
  • 自己从网上收集的主流浏览器 UA 列表。
  • 第三方库 fake-useragent,可自动随机生成当前流行的 UA 字符串。
  • 实用代码
  from fake_useragent import UserAgent
  ua = UserAgent()
  headers = {'User-Agent': ua.random}
  response = requests.get(url, headers=headers)
  
  • 进阶提醒:有些网站不仅检查 UA,还校验请求头完整性。可以抓包把真实浏览器的整套请求头(Accept、Accept-Language、Referer 等)复制下来,组成头部池。

验证码处理:绕过或识别

当 IP 变化频繁或行为异常时,网站可能弹出图形验证码、滑块验证码或点击验证码。这是反爬的最后一堵高墙。

  • 处理策略,按成本从低到高排列:
  1. 降低触发概率:放慢请求速度、随机延时、配合代理和 UA 池,从源头避免验证码。
  2. 打码平台:对接第三方服务(如超级鹰、2captcha),将验证码图片传给平台,返回识别结果或滑块轨迹。适合规模不大、成本可接受的场景。
  3. 图像识别:用 pytesseract 对简单数字字母验证码做 OCR,仅适用于无干扰的弱验证码。
  4. 模拟操作 + 浏览器自动化:用 SeleniumPlaywright 打开真实浏览器,实现滑块拖动和点选验证,通过控制真实浏览器环境降低被怀疑的概率。
  • 真实经验:验证码是猫鼠游戏,没有一劳永逸的方案。商业爬虫常组合“IP 代理 + 浏览器指纹 + 打码平台”来保证采集稳定性。

Cookie 管理:保持会话状态

很多网站要求登录或维护会话状态,才能访问受保护的数据或翻页。爬虫需要正确管理 Cookie。

  • 基本用法
  • requests.Session() 自动保存并复用服务端返回的 Cookie,完美解决连续请求的会话保持问题。
  • 模拟登录:先 POST 登录接口,Session 收到 Cookie 后,后续请求都自动带上认证信息,就可以抓取需要登录的页面。
  • 手动处理 Cookie
  • 从浏览器中复制登录后的完整 Cookie 字符串,放在请求头 Cookie 字段中。适合快速测试,但失效后需手动更换。
  • 配合 Selenium 等工具完成登录,然后获取浏览器 Cookie 传给 requests Session。
  • 持久化存储:当爬虫进程重启时,需要恢复之前的会话,可以把 Cookie 用 picklejson 保存到本地,下次加载。
  • 注意事项:Cookie 有有效期,过期后需要重新登录;部分站点会绑定 IP 或 User-Agent 与 Cookie,更换代理时需兼顾 Cookie 一并切换,否则反而暴露。

组合使用才是王道:单独的代理、单独的 UA 修改,效果往往有限。真实工程中,通常是“代理池 + UA 池 + 请求延时随机化 + 会话管理”的一整套方案,让爬虫行为尽可能像真实用户,从而在不触发验证码的情况下稳定采集。