
Python处理JSON数据的基础操作
JSON作为网络数据传输的主流格式,Python通过内置的json模块可以轻松实现解析和转换。我们先看一个典型场景:从代理API获取IP地址时,服务器返回的数据通常是JSON格式。
import json
模拟代理API返回的JSON数据
api_response = '{"code": 200, "data": {"ip": "192.168.1.1", "port": 8080, "expire_time": "2024-12-31"}}'
JSON字符串转Python字典
proxy_data = json.loads(api_response)
print(f"获取IP:{proxy_data['data']['ip']}:{proxy_data['data']['port']}")
Python对象转JSON字符串
config = {"protocol": "socks5", "timeout": 30}
json_str = json.dumps(config, ensure_ascii=False) 处理中文
特别注意:处理代理API响应时一定要检查状态码。比如当code值为200时才使用IP,非200状态需要异常处理。
代理API响应处理实战技巧
以ipipgo的代理API为例,实际响应可能包含多个IP和附加信息。我们需要从复杂结构中提取有效数据:
{
"status": "success",
"data": [
{
"ip": "47.91.xxx.xxx",
"port": 8888,
"location": "香港_电信",
"ttl": 600
},
{
"ip": "39.108.xxx.xxx",
"port": 8080,
"location": "北京_联通",
"ttl": 300
}
]
}
提取IP列表的代码示例:
def extract_proxies(json_data):
proxies = []
try:
data = json.loads(json_data)
if data.get("status") == "success":
for item in data["data"]:
proxy = f"{item['ip']}:{item['port']}"
proxies.append(proxy)
return proxies
except Exception as e:
print(f"解析失败:{e}")
return []
使用示例
proxy_list = extract_proxies(api_response)
print("可用代理:", proxy_list)
JSON数据转换与代理配置生成
不同软件需要不同格式的代理配置。我们可以将API返回的JSON转换为特定格式:
转换为requests库需要的代理字典格式
def to_requests_format(proxy_json):
proxy_dict = {}
data = json.loads(proxy_json)
for proxy in data["data"]:
scheme = "http" 或https,根据实际情况
url = f"{scheme}://{proxy['ip']}:{proxy['port']}"
proxy_dict[scheme] = url
return proxy_dict
转换为curl命令格式
def to_curl_format(proxy_json):
data = json.loads(proxy_json)
proxy = data["data"][0] 取第一个代理
return f"curl -x {proxy['ip']}:{proxy['port']} https://example.com"
错误处理与数据验证
代理API可能返回错误信息,规范的错误处理能避免程序崩溃:
def safe_proxy_parse(json_str):
try:
data = json.loads(json_str)
多层验证
if data.get("code") != 200:
error_msg = data.get("msg", "未知错误")
raise ValueError(f"API错误:{error_msg}")
if not data.get("data"):
raise ValueError("响应数据为空")
验证IP格式
import re
ip_pattern = re.compile(r'^d{1,3}.d{1,3}.d{1,3}.d{1,3}$')
for proxy in data["data"]:
if not ip_pattern.match(proxy["ip"]):
raise ValueError(f"IP格式错误:{proxy['ip']}")
return data["data"]
except json.JSONDecodeError as e:
print(f"JSON解析错误:{e}")
except ValueError as e:
print(f"数据验证错误:{e}")
except Exception as e:
print(f"未知错误:{e}")
结合ipipgo代理服务的完整示例
以下是使用ipipgo代理API的完整工作流程:
import requests
import json
def get_ipipgo_proxies(api_key, count=5):
"""
从ipipgo获取代理IP列表
"""
url = "https://api.ipipgo.com/proxy/get"
params = {
"key": api_key,
"count": count,
"format": "json"
}
try:
response = requests.get(url, params=params, timeout=10)
response.raise_for_status() 检查HTTP状态码
data = response.json()
if data["status"] == "success":
return [f"{item['ip']}:{item['port']}" for item in data["data"]]
else:
print(f"获取失败:{data.get('message')}")
return []
except requests.exceptions.RequestException as e:
print(f"网络请求错误:{e}")
return []
使用示例
proxies = get_ipipgo_proxies("your_api_key_here")
for proxy in proxies:
print(f"可用代理:{proxy}")
ipipgo的代理服务特别适合需要稳定IP的场景,其静态住宅代理具备99.9%的可用性和精准城市级定位,确保业务长期稳定运行。
常见问题QA
Q1:为什么解析JSON时出现中文乱码?
A:确保使用json.dumps(data, ensure_ascii=False)参数,并在文件操作时指定编码encoding='utf-8'。
Q2:代理API返回大量数据,如何高效处理?
A:可以使用生成器逐条处理,避免内存溢出:
def stream_proxies(json_file_path):
with open(json_file_path, 'r', encoding='utf-8') as f:
for line in f:
yield json.loads(line.strip())
Q3:如何验证代理IP的有效性?
A:获取IP后需要进行连通性测试:
def test_proxy(proxy_url, test_url="http://httpbin.org/ip", timeout=5):
try:
response = requests.get(test_url, proxies={"http": proxy_url, "https": proxy_url}, timeout=timeout)
return response.status_code == 200
except:
return False
ipipgo提供的代理IP经过严格筛选,有效率高,减少了额外验证的工作量。
通过以上方法,你可以高效处理代理服务返回的JSON数据,快速集成到各类网络应用中。ipipgo提供多种代理套餐,从动态住宅到静态住宅,满足不同业务场景的需求。

