当你开始批量抓取数据,网站的反爬虫机制几乎一定会触发。与其每次都临时找对策,不如把常见的应对方案整理成工具箱。这一节就讲四种最常用、最有效的反爬对策。
代理池:换个 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 变化频繁或行为异常时,网站可能弹出图形验证码、滑块验证码或点击验证码。这是反爬的最后一堵高墙。
- 处理策略,按成本从低到高排列:
- 降低触发概率:放慢请求速度、随机延时、配合代理和 UA 池,从源头避免验证码。
- 打码平台:对接第三方服务(如超级鹰、2captcha),将验证码图片传给平台,返回识别结果或滑块轨迹。适合规模不大、成本可接受的场景。
- 图像识别:用
pytesseract对简单数字字母验证码做 OCR,仅适用于无干扰的弱验证码。 - 模拟操作 + 浏览器自动化:用 Selenium 或 Playwright 打开真实浏览器,实现滑块拖动和点选验证,通过控制真实浏览器环境降低被怀疑的概率。
- 真实经验:验证码是猫鼠游戏,没有一劳永逸的方案。商业爬虫常组合“IP 代理 + 浏览器指纹 + 打码平台”来保证采集稳定性。
Cookie 管理:保持会话状态
很多网站要求登录或维护会话状态,才能访问受保护的数据或翻页。爬虫需要正确管理 Cookie。
- 基本用法:
requests.Session()自动保存并复用服务端返回的 Cookie,完美解决连续请求的会话保持问题。- 模拟登录:先 POST 登录接口,Session 收到 Cookie 后,后续请求都自动带上认证信息,就可以抓取需要登录的页面。
- 手动处理 Cookie:
- 从浏览器中复制登录后的完整 Cookie 字符串,放在请求头
Cookie字段中。适合快速测试,但失效后需手动更换。 - 配合 Selenium 等工具完成登录,然后获取浏览器 Cookie 传给 requests Session。
- 持久化存储:当爬虫进程重启时,需要恢复之前的会话,可以把 Cookie 用
pickle或json保存到本地,下次加载。 - 注意事项:Cookie 有有效期,过期后需要重新登录;部分站点会绑定 IP 或 User-Agent 与 Cookie,更换代理时需兼顾 Cookie 一并切换,否则反而暴露。
组合使用才是王道:单独的代理、单独的 UA 修改,效果往往有限。真实工程中,通常是“代理池 + UA 池 + 请求延时随机化 + 会话管理”的一整套方案,让爬虫行为尽可能像真实用户,从而在不触发验证码的情况下稳定采集。