我正在使用Python从Solr API中提取数据,如下所示:
import requests
user = 'my_username'
password= 'my password'
url = 'my_url'
print ("Accessing API..")
req = requests.get(url = url, auth=(user, password))
print ("Accessed!")
out = req.json()
#print(out)
但是,在某些API网址中看起来很像:输出相当大,并且#34; (许多列是字典列表),因此它不会返回所有必需的行。
从四处查看,看起来我应该使用分页以指定的增量引入结果。像这样:
url = 'url?start=0&rows=1000'
然后,
url = 'url?start=1000&rows=1000'
依此类推,直到没有返回结果为止。
我正在考虑的方法是编写一个循环,并将结果附加到每个循环的输出。但是,我不知道该怎么做。
有人可以帮忙吗?
提前谢谢!
答案 0 :(得分:3)
你看过输出了吗?根据我的经验,solr响应通常在其结果中包含'numFound'。在一个(旧)solr我在本地,做一个随机查询。我得到了这个结果。
{
"responseHeader": {
"status": 0,
"QTime": 1,
"params": {
"q": "*:*",
"indent": "true",
"start": "0",
"rows": "10",
"wt": "json",
"_": "1509460751164"
}
},
"response": {
"numFound": 7023,
"start": 0,
"docs": [.. 10 docs]
}
}
在编写此代码示例时,我意识到您确实不需要numFound
。如果没有进一步的结果,Solr将返回docs
的任何空列表。使循环更容易。
import requests
user = 'my_username'
password = 'my password'
# Starting values
start = 0
rows = 1000 # static, but easier to manipulate if it's a variable
base_url = 'my_url?rows={0}?start={1}'
url = base_url.format(rows, start)
req = requests.get(url=url, auth=(user, password))
out = req.json()
total_found = out.get('response', {}).get('numFound', 0)
# Up the start with 1000, so we fetch the next 1000
start += rows
results = out.get('response', {}).get('docs', [])
all_results = results
# Results will be an empty list if no more results are found
while results:
# Rebuild url base on current start.
url = base_url.format(rows, start)
req = requests.get(url=url, auth=(user, password))
out = req.json()
results = out.get('response', {}).get('docs', [])
all_results += results
start += rows
# All results will now contains all the 'docs' of each request.
print(all_results)
请注意......那些文档会像dict一样,因此需要更多的解析。