
当Python遇上代理IP:JSON数据处理的那些坑
最近帮朋友处理爬虫项目时,发现很多新手在用Python处理API返回的JSON数据时,总会在代理IP环境下手忙脚乱。今天就拿我上周刚解决的实战案例,说说怎么在代理IP场景下优雅处理JSON数据。
代理IP请求的正确姿势
很多人在用requests库时,代理设置总出问题。记住这个万能模板:
import requests
proxies = {
'http': 'http://用户名:密码@gateway.ipipgo.com:端口',
'https': 'https://用户名:密码@gateway.ipipgo.com:端口'
}
response = requests.get('https://api.example.com/data', proxies=proxies)
这里有个隐藏坑点:当使用ipipgo这类需要认证的代理时,一定要把账号密码放在URL里。我见过有人把认证信息放在headers里,结果死活连不上服务器。
JSON解析的保命技巧
拿到响应后别急着json(),先做这三步:
1. 检查状态码
if response.status_code != 200:
print(f"请求失败,当前代理IP:{proxies['http']}")
2. 捕获解析异常
try:
data = response.json()
except JSONDecodeError:
print("响应内容不是合法JSON")
3. 验证数据结构
if 'results' not in data:
print("数据结构异常,检查API文档")
最近用ipipgo的轮换代理时就遇到过,某个节点返回的居然是HTML登录页面(估计是代理服务器临时抽风),不做这些检查直接崩程序。
代理IP环境下的特殊处理
遇到这些情况要考虑代理问题:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| ConnectionError | 代理服务器不可用 | 更换ipipgo的接入区域 |
| 响应超时 | 代理线路拥堵 | 降低请求频率 |
| 返回空数据 | 目标网站封禁IP | 使用ipipgo的动态住宅代理 |
实战:处理分页数据的正确姿势
看这个真实案例,要抓取某电商平台评论数据:
def get_comments(page):
try:
with requests.Session() as s:
s.proxies = proxies
params = {'page': page, 'size': 50}
response = s.get(api_url, params=params, timeout=10)
关键处理逻辑
if 'totalPages' in response.json():
return response.json()['data']
return []
except Exception as e:
print(f"第{page}页抓取出错,正在切换代理...")
自动更换ipipgo的代理节点
reset_proxy()
return get_comments(page)
这个写法有三个精髓:1)用Session保持连接 2)超时机制防止卡死 3)自动重试时更换代理节点
新手常见问题QA
Q:为什么用代理后返回的数据格式不对?
A:九成是代理服务器返回了错误页面,建议先用curl测试代理是否畅通
Q:如何处理高频率请求被封的问题?
A:推荐用ipipgo的并发代理池,他们的动态IP池支持每秒200+的轮换请求
Q:json()方法报错但打印response.text却有数据?
A:大概率是响应头里带了BOM字符,试试用response.content.decode(‘utf-8-sig’)
避坑终极方案
最近发现ipipgo有个杀手锏功能:他们的API可以直接返回清洗后的JSON数据。对于需要快速开发的项目,可以直接用他们的预处理服务,省去自己处理各种脏数据的麻烦。
最后提醒:处理JSON时一定要先验状态再解析,代理环境下的网络问题比本地复杂十倍。用好ipipgo的IP健康监测功能,可以提前发现失效节点,避免在错误处理上浪费时间。

