使用代理时如何防止源IP泄露引发网站封禁?
代理爬取时源IP泄露导致封禁的排查与解决
问题概况
- 代码偶尔能正常运行,无核心逻辑问题
- 发送几十次请求后,即便用旋转代理也会被封禁
- 某代理提供商IP被封后,切换到另一提供商IP也立即被封
- 尝试
requests.session()和httpx.Client()均出现相同问题 - 使用Brightdata廉价数据中心代理、proxy-cheap.com住宅代理
- 会话创建方式:
session = httpx.Client(proxies={"http://":proxy_url, "https://":proxy_url}),确保单请求用同一代理
推测源IP通过代理泄露导致封禁,寻求防止源IP泄露的方法。
排查与解决方法
1. 先验证代理是否真的隐藏了源IP
发送请求到能返回当前访问IP的测试接口,打印返回的IP地址,确认是否是代理IP而非你的真实源IP。如果返回真实IP,说明代理本身是透明代理或配置有误,直接联系提供商更换高匿代理。
2. 禁用HTTP/2与自动重定向
部分代理对HTTP/2支持不完善,可能导致请求绕过代理泄露源IP。在httpx中关闭HTTP/2:
session = httpx.Client( proxies={"http://": proxy_url, "https://": proxy_url}, http2=False )
同时关闭自动重定向,手动处理3xx状态码的跳转,确保重定向请求也走代理:
session = httpx.Client( proxies={"http://": proxy_url, "https://": proxy_url}, follow_redirects=False )
处理重定向时,直接用同一个会话请求新的跳转地址即可。
3. 清理请求头中的敏感字段
部分请求头可能会泄露源IP或关联信息,比如X-Forwarded-For、X-Real-IP,发送请求前清空或覆盖这些字段:
headers = { "X-Forwarded-For": "", "X-Real-IP": "", # 每次换代理时清空Cookie,使用全新会话 } response = session.get(target_url, headers=headers)
注意:每次切换代理时必须创建全新的会话,不要复用旧会话的Cookie或自定义头。
4. 切换到SOCKS代理
SOCKS代理比HTTP代理更不容易泄露源IP,httpx使用SOCKS代理需要先安装依赖:
pip install httpx[socks]
然后配置SOCKS5代理:
session = httpx.Client( proxies={ "http://": "socks5://username:password@proxy_host:port", "https://": "socks5://username:password@proxy_host:port" } )
5. 调整请求频率与模拟真实请求
如果确认源IP没泄露,可能是请求特征被识别。此时需要:
- 每次请求添加1-5秒的随机延迟,避免高频请求
- 使用真实浏览器的User-Agent池,每次请求随机选择一个
- 补充
Accept、Accept-Language等常见浏览器头,让请求更接近真人操作
示例代码:
import time import random user_agents = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15", # 更多真实UA ] for url in target_url_list: headers = { "User-Agent": random.choice(user_agents), "Accept-Language": "zh-CN,zh;q=0.9" } response = session.get(url, headers=headers) # 处理响应逻辑 time.sleep(random.uniform(1, 5))
6. 排查请求特征黑名单
如果更换不同代理提供商后立即被封,大概率是目标网站已经把你的请求特征(比如固定UA、请求参数模式)加入黑名单。此时需要:
- 彻底更换User-Agent池,不要重复使用之前的UA
- 修改请求的参数顺序、表单字段(如果是POST请求)
- 考虑用Playwright或Selenium配合代理,模拟真实浏览器的交互行为(比如点击、滚动),进一步降低被识别的概率
内容的提问来源于stack exchange,提问作者DoctorEvil
相关产品推荐
相关产品推荐

