
当代理IP撞上JSON数据,怎么玩才不翻车?
搞爬虫的兄弟都懂,每次从网上扒数据回来,十有八九都是JSON格式。这玩意儿看着清爽,真要处理起来比拆俄罗斯套娃还麻烦。特别是用代理IP采集数据的时候,经常遇到数据类型混乱、编码错误、嵌套过深这些幺蛾子。上周我就碰到个案例:用ipipgo的动态住宅代理抓某电商数据,结果返回的JSON里价格字段一会是字符串”199″,一会又变数字199,差点把数据库搞崩。
import json
from requests import Session
ipipgo代理配置(重点看这里)
proxy_config = {
"http": "http://user:pass@gateway.ipipgo.com:9020",
"https": "http://user:pass@gateway.ipipgo.com:9020"
}
session = Session()
response = session.get('https://api.example.com/products', proxies=proxy_config)
这里埋着雷区!
raw_data = json.loads(response.text)
四招驯服野性JSON
第一招:数据类型大扫除。遇到混合类型字段时,用这个骚操作:
def clean_data(item):
价格字段统一转浮点
if 'price' in item:
try:
item['price'] = float(item['price'])
except:
item['price'] = 0.0
嵌套字典平铺
if 'specs' in item:
item.update(item.pop('specs'))
return item
safe_data = [clean_data(x) for x in raw_data['results']]
第二招:代理异常捕获三连环。用ipipgo的代理时要特别注意网络波动:
| 错误类型 | 应对策略 |
|---|---|
| ConnectionError | 自动切换代理节点 |
| Timeout | 重试前等待3-5秒 |
| JSONDecodeError | 记录原始响应内容 |
实战中的坑与救生圈
有次用ipipgo的短效代理抓数据,遇到个奇葩JSON——键名里带emoji表情!这种时候千万别用标准库硬刚,上这个方案:
import demjson
from charset_normalizer import detect
检测真实编码
encoding = detect(response.content)['encoding']
dirty_json = response.content.decode(encoding, errors='replace')
用三方库解析
data = demjson.decode(dirty_json)
记得在请求头里加“Accept-Encoding”: “identity”,有些网站会返回压缩数据,代理中转时可能出乱码。
QA时间(新手必看)
Q:用代理IP老是收到残缺JSON怎么办?
A:八成是传输中途被截断,建议:1)检查ipipgo后台的流量套餐是否用完 2)在请求头里加”Connection”: “keep-alive” 3)调大timeout到10秒以上
Q:处理多层嵌套JSON有什么诀窍?
A:用jsonpath一把梭,比写多层for循环爽多了:
from jsonpath_ng import parse
expr = parse('$..products[?(@.price > 100)].sku')
matches = [match.value for match in expr.find(data)]
ipipgo的隐藏玩法
他们家的按需计费代理特别适合处理突发大数据量。比如突然要解析10G的JSON日志文件,可以这样操作:
import pandas as pd
from concurrent.futures import ThreadPoolExecutor
def parse_chunk(chunk):
with ipipgo.create_session(duration='15min') as session:
return pd.json_normalize(chunk)
分块处理大文件
results = []
with ThreadPoolExecutor(max_workers=5) as executor:
for chunk in pd.read_json('bigfile.json', lines=True, chunksize=1000):
results.append(executor.submit(parse_chunk, chunk))
最后给个忠告:处理JSON时一定要先验schema再解析,用ipipgo的代理时可以先用HEAD请求探测数据结构,避免流量浪费。碰到疑难杂症,记得去他们家文档里翻”非标JSON处理指南”,保命神器。

