2017-04-07 106 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