2015-12-27 24 views
1

我想從一個網頁中的長JSON響應(〜75兆字節),但我只能接受第一個25兆字節左右。無法獲取整個頁面與Python要求

我用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對象。

+0

有趣的是,它爲我工作,'r.json()'不會引發錯誤.. – alecxe

+0

@alecxe它確實似乎偶爾爲我工作,其他時間是錯誤的。我猜這支持這樣的說法,即他們的服務器存在問題 – Ben

回答

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'}) 
+3

實際上,'requests'默認設置了'Accept-Encoding:gzip,deflate'頭部,所以你不需要這麼做。 – mhawke

+0

不幸的是我需要260個星期的這個項目的數據,所以我有點卡住了。有什麼我可以做我的目的,讓更多的信息被推動的服務器?它似乎偶爾工作。 – Ben

+0

@Ben:作爲一種解決方法,我將建議您使用'startDT'和'endDT'參數對更短的時間間隔進行多個請求,然後合併結果,但是,即使間隔僅爲1天,在截斷的響應中可能的請求正在由不同的服務器處理。嘗試一下這個想法,如果你遇到問題,我認爲你可能需要把它與Web服務提供者一起考慮。 – mhawke