2017-04-20 56 views
2

如何使用Python为通过CSV版本的API调用分页?Paginate CSV(Python)

我知道JSON调用中的元数据包括总记录数,但在CSV调用中没有类似信息如果我尝试增加页面参数,我不知道在哪里停止循环。

下面是我的代码:

url = 'https://api.data.gov/ed/collegescorecard/v1/schools.csv' 

payload = { 
    'api_key': '4KC***UNKk', 
    'fields': 'school.name,2012.repayment.2_yr_default_rate', 
    '_page' : '0' 
} 

r = requests.get(url, params=payload) 
df = pd.read_csv(r.url) 

这将加载与第20个结果的数据帧,但我想加载一个数据帧的所有结果。

+0

您需要包含一个计数,并且在计数完成之后才会加载到数据框中,因为模拟api而将数据帧加载到数据框不起作用。 – sb0709

+0

@ sb0709我怎么知道什么时候结束我的计数?如果我做了一个额外的循环而不是中断。 –

+0

不需要休息,会在每20个结果中读取所有内容,并会循环直至达到7000个结果。 Aswer bellow的解释与API选项,但我更喜欢pythonic的报废方式更多,只是我的偏好。 – sb0709

回答

1

利用&_per_page选项参数来编辑每次呼叫的选择数量;将其设置为&_per_page=200会返回一个包含100行的CSV,因此假定100是最大值。

现在我们知道每次通话的最大值,我们有总通话,它可以运行一个for循环得到我们所需要的,就像这样:

url = 'https://api.data.gov/ed/collegescorecard/v1/schools.csv' 
apikey = '&api_key=xxx' 
fields = '&_fields=school.name,2012.repayment.2_yr_default_rate' 
pageA = '&_page=' 
pageTotal = '&_per_page=' 
pageNumbersMaximum = 10 
rowSum = 200 
for page in range(pageNumbersMaximum): 
    fullURL = url + pageA + str(page) + pageTotal + str(rowSum) + fields + apikey 
    print(fullURL) 
    print("Page Number: " + str(page) + ", Total Rows: " + str(rowSum)) 
    rowSum += 200 

将通过成果循环,直到它总计达到7000。

+1

感谢您的帮助。这里的挑战是停止循环的地方。 7000只是一个例子。但问题是我不知道有多少个循环可以产生和产生额外的循环会导致错误。 –

+0

好的,那么每个调用都应该包装在try/except中,并在失败时打破循环。当我有空闲时间时会编辑这个。 – albert

+0

@TimErnst这实际上比我们看起来要困难得多(@对我而言)......如果你超过了答复的数量,你仍然会得到一个csv下载。它的铺位,但你仍然得到一个。至少需要一层认证... – albert