无法使用Python请求获取整个页面

时间:2015-12-27 05:24:15

标签: python http python-requests urllib2

我试图从网页上获得一个长JSON响应(~75 MB)但是我只能收到前25 MB左右。

我使用过urllib2python-requests但都没有用。我已尝试过reading parts in separatelystreaming the data,但这也无效。

可在此处找到数据示例:

http://waterservices.usgs.gov/nwis/iv/?site=14377100&format=json&parameterCd=00060&period=P260W

我的代码如下:

r = requests.get("http://waterservices.usgs.gov/nwis/iv/?site=14377100&format=json&parameterCd=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对象。

1 个答案:

答案 0 :(得分:3)

问题似乎是服务器一次不能提供超过13MB的数据。

我使用了许多HTTP客户端(包括curlwget)尝试了该网址,并且所有这些网址都以大约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'})