使用Python urllib.request下载JSON速度过慢,如何进行提速?
原因分析
- 缺少压缩请求头:浏览器发起请求时默认会携带
Accept-Encoding头,告知服务器可以返回gzip/br等压缩格式的内容,你请求的SEC接口返回的JSON原始体积较大,压缩后体积仅为原始的1/10不到,而urllib默认不会主动携带该头,服务器会返回未压缩的原始数据,大幅增加了传输耗时。 - urllib默认性能缺陷:原生urllib没有做连接复用、IO读取的相关优化,大文件读取时效率远低于成熟的第三方HTTP客户端。
- 部分网络环境下urllib会默认走系统代理配置,额外增加了链路耗时。
优化方案
- 给请求添加压缩头,拿到响应后手动解压,示例代码如下:
import urllib.request import gzip from datetime import datetime start = datetime.now() user_agent = 'First Lastname abc@def.com' url = 'https://data.sec.gov/submissions/CIK0000320193.json' headers = { 'User-Agent': user_agent, 'Accept-Encoding': 'gzip, deflate, br' # 新增压缩头 } request = urllib.request.Request(url, None, headers) response = urllib.request.urlopen(request, timeout=10) # 加超时避免无意义等待 # 判断返回内容是否压缩,做对应解压处理 if response.info().get('Content-Encoding') == 'gzip': data = gzip.decompress(response.read()) else: data = response.read() print(datetime.now() - start)
- 换用第三方HTTP库
requests,库内部已经自动处理了解压、连接复用等逻辑,代码更简洁效率也更高,示例如下:
import requests from datetime import datetime start = datetime.now() headers = {'User-Agent': 'First Lastname abc@def.com'} resp = requests.get('https://data.sec.gov/submissions/CIK0000320193.json', headers=headers, timeout=10) data = resp.content print(datetime.now() - start)
优化后耗时基本可以和浏览器打开的速度对齐。
内容的提问来源于stack exchange,提问作者gunardilin
相关产品推荐
相关产品推荐

