我试图从网页上获得一个长JSON响应(~75 MB)但是我只能收到前25 MB左右。
我使用过urllib2和python-requests但都没有用。我已尝试过reading parts in separately和streaming the data,但这也无效。
可在此处找到数据示例:
http://waterservices.usgs.gov/nwis/iv/?site=14377100&format=json¶meterCd=00060&period=P260W
我的代码如下:
r = requests.get("http://waterservices.usgs.gov/nwis/iv/?site=14377100&format=json¶meterCd=00060&period=P260W")
usgs_data = r.json() # script breaks here
# Save Longitude and Latitude of river
latitude = usgs_data["value"]["timeSeries"][0]["sourceInfo"]["geoLocation"]["geogLocation"]["latitude"]
longitude = usgs_data["value"]["timeSeries"][0]["sourceInfo"]["geoLocation"]["geogLocation"]["longitude"]
# dictionary of all past river flows in cubic feet per second
river_history = usgs_data['value']['timeSeries'][0]['values'][0]['value']
它打破了:
ValueError: Expecting object: line 1 column 13466329 (char 13466328)
当脚本尝试解码JSON时(即usgs_data = r.json()
)。
这是因为尚未收到完整数据,因此不是有效的JSON对象。
答案 0 :(得分:3)
问题似乎是服务器一次不能提供超过13MB的数据。
我使用了许多HTTP客户端(包括curl
和wget
)尝试了该网址,并且所有这些网址都以大约13MB的速度爆炸。我也尝试过启用gzip压缩(就像你一样),但在解压缩后结果仍然被截断为13MB。
您要求的数据太多,因为period=P260W
指定了260周。如果您尝试设置period=P52W
,您会发现您可以检索有效的JSON响应。
要减少传输的数据量,请按以下方式设置Accept-Encoding
标题:
url = 'http://waterservices.usgs.gov/nwis/iv/'
params = {'site': 11527000, 'format': 'json', 'parameterCd': '00060', 'period': 'P52W'}
r = requests.get(url, headers={'Accept-Encoding': 'gzip,deflate'})