Python中用于API的API分页

时间:2017-10-31 13:54:49

标签: python solr

我正在使用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'

依此类推,直到没有返回结果为止。

我正在考虑的方法是编写一个循环,并将结果附加到每个循环的输出。但是,我不知道该怎么做。

有人可以帮忙吗?

提前谢谢!

1 个答案:

答案 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一样,因此需要更多的解析。