
当代理IP遇到JSON数据,Python这么玩就对了
搞过数据采集的老铁都知道,代理IP服务返回的数据十有八九都是JSON格式。今天咱们不整虚的,直接上干货说说怎么用Python把这事儿整明白。就拿ipipgo的API响应来说,他们返回的代理IP信息结构贼规范,处理起来特别顺手。
一、拆快递式解析代理IP信息
拿到代理IP服务商的响应数据,就像收到个快递包裹。咱们先看看ipipgo的典型返回结构:
{
"status": "success",
"data": [
{
"ip": "123.123.123.123",
"port": 8000,
"expire_time": "2024-03-01 12:00:00"
},
{
"ip": "124.124.124.124",
"port": 8001,
"expire_time": "2024-03-01 12:30:00"
}
]
}
处理这种结构,记住三步走:确认状态→提取数据→循环处理。看这段代码:
import json
response = requests.get('https://api.ipipgo.com/get_proxies')
result = json.loads(response.text)
if result['status'] == 'success':
for proxy in result['data']:
print(f"可用代理:{proxy['ip']}:{proxy['port']}")
print(f"过期时间:{proxy['expire_time']}")
else:
print("今天运气不太好,换个姿势再试一次")
二、动态配置请求参数的黑科技
有时候需要根据不同的业务场景动态生成请求参数。比如要批量测试代理IP的可用性,可以这么玩:
proxy_list = []
从ipipgo获取10个代理IP
params = {
"count": 10,
"protocol": "http",
"region": "华东"
}
response = requests.get('https://api.ipipgo.com/generate', params=params)
proxies = json.loads(response.text)['proxies']
for p in proxies:
proxy_config = {
"http": f"http://{p['ip']}:{p['port']}",
"https": f"https://{p['ip']}:{p['port']}"
}
proxy_list.append(proxy_config)
这样生成的代理配置列表,可以直接扔给requests轮着用,测试稳定性杠杠的。
三、异常处理要像查水表
处理JSON最容易栽跟头的地方就是数据格式不对。教你们个绝活:
try:
data = response.json()
except json.JSONDecodeError as e:
print(f"解析出错啦!具体位置:第{e.lineno}行第{e.colno}列")
print("建议检查:1.响应头是否包含application/json 2.是否有不完整数据")
这里可以调用ipipgo的异常上报接口
requests.post('https://api.ipipgo.com/error_report', data=response.text)
这样处理既不会让程序崩掉,还能帮服务商改进质量,两全其美。
QA时间:常见问题排雷
Q:获取的代理IP突然不能用了咋整?
A:先看过期时间字段,ipipgo的代理默认1小时刷新。建议设置定时任务提前15分钟获取新IP
Q:返回的JSON里有奇怪的特殊字符怎么办?
A:八成是编码问题,试试这样处理:
response.encoding = 'utf-8-sig'
data = json.loads(response.text)
Q:需要同时处理多个代理服务商的数据咋办?
A:建议统一数据格式,比如给ipipgo的响应数据套个转换层:
def format_proxy(data):
return {
"host": data['ip'],
"port": str(data['port']),
"source": "ipipgo"
}
最后给个实在的建议:长期用代理服务的话,直接上ipipgo的套餐最省心。他们家不仅接口响应快,遇到问题找技术支持贼靠谱,不像有些服务商玩失踪。关键是他们家的IP池更新频率高,基本上不会碰到大批量失效的情况。

