2017-04-07 59 views
0

我試圖創建一個循環通過API調用一個json字符串,因爲每個調用被限制爲200行。當我嘗試下面的代碼時,即使我讓代碼運行一個小時左右,循環似乎也不會結束。我希望提取的最大行大約是來自API的約200k行。Python 3.6 API while while循環到json腳本沒有結束

bookmark='' 
urlbase = 'https://..../?' 
alldata = [] 
while True: 
    if len(bookmark)>0: 
     url = urlbase + 'bookmark=' + bookmark 
    requests.get(url, auth=('username', 'password')) 
    data = response.json() 
    alldata.extend(data['rows']) 
    bookmark = data['bookmark'] 
    if len(data['rows'])<200: 
     break 

而且,我期待的循環過濾,僅輸出,如果JSON值「pet.type」是「小狗」還是「小貓」。一直無法弄清楚語法。

任何想法?

謝謝

+0

嘗試在循環的每一輪中輸出'url'和'len(data ['rows'])''的值。 –

+0

我不知道我明白你在做什麼。當你的行數少於200行時,你是否突破了,因爲這表明沒有更多數據需要消耗? – jsfan

+0

@jsfan基本上每個API調用循環200行後,我希望循環打破一旦有少於200行留在「alldata」收集 – n4zy

回答

1

您的循環的休息條件不正確。請注意,它正在檢查len(data["rows"]),其中data只包含來自最近請求的行。

取而代之,您應該查看總計到目前爲止收集的行數:len(alldata)

bookmark='' 
urlbase = 'https://..../?' 
alldata = [] 
while True: 
    if len(bookmark)>0: 
     url = urlbase + 'bookmark=' + bookmark 
    requests.get(url, auth=('username', 'password')) 
    data = response.json() 
    alldata.extend(data['rows']) 
    bookmark = data['bookmark'] 
    # Check `alldata` instead of `data["rows"]`, 
    # and set the limit to 200k instead of 200. 
    if len(alldata) >= 200000: 
     break 
+0

我不確定如果我得到了正確的OP,但是如果它沒有得到超過200k行的響應,你的代碼就會在第一次迭代時崩潰。 – jsfan

+0

哎呀!我已經將它更新爲'> ='。 –

+0

@CarolynConway工程!你是一個拯救生命的人,非常感謝! – n4zy