Python请求参数/处理api分页

时间:2013-07-21 23:04:27

标签: python api http pagination python-requests

我正在使用Angel List(AL)API,想要在圣旧金山完成所有工作。 因为我找不到api的活动Python包装器(如果我取得任何进展,我想我想自己制作),我正在使用请求库。

AL API的结果是分页的,我无法弄清楚如何超越结果的第一页。

这是我的代码:

import requests
r_sanfran = requests.get("https://api.angel.co/1/tags/1664/jobs").json()
r_sanfran.keys()
# returns [u'per_page', u'last_page', u'total', u'jobs', u'page']
r_sanfran['last_page']
#returns 16
r_sanfran['page']
# returns 1

我尝试向requests.get添加参数,但这不起作用。我也尝试过一些非常愚蠢的东西 - 改变“页面”键的价值,就像那神奇地为我分页。

例如。 r_sanfran['page'] = 2

我猜这是相对简单的事情,但我似乎无法弄明白所以任何帮助都会很棒。

一如既往地谢谢。

Angel List API documentation如果它有用。

6 个答案:

答案 0 :(得分:17)

阅读last_page并为范围内的每个页面发出获取请求:

import requests

r_sanfran = requests.get("https://api.angel.co/1/tags/1664/jobs").json()
num_pages = r_sanfran['last_page']

for page in range(2, num_pages + 1):
    r_sanfran = requests.get("https://api.angel.co/1/tags/1664/jobs", params={'page': page}).json()
    print r_sanfran['page']
    # TODO: extract the data

答案 1 :(得分:7)

改进@ alecxe的答案:如果您使用Python生成器并请求HTTP会话,则可以在查询大量页面或非常大的页面时提高性能和资源使用率。

import requests

session = requests.Session()

def get_jobs():
    url = "https://api.angel.co/1/tags/1664/jobs" 
    first_page = session.get(url).json()
    yield first_page
    num_pages = first_page['last_page']

    for page in range(2, num_pages + 1):
        next_page = session.get(url, params={'page': page}).json()
        yield next_page['page']

for page in get_jobs():
    # TODO: process the page

答案 2 :(得分:0)

我遇到了一个场景,其中API不返回页面,而是一个最小值/最大值。我创建了这个,并且我认为它在两种情况下都适用。这将自动增加增量,直到达到末尾,然后停止while循环。

max_version = [1]
while len(max_version) > 0:
    r = requests.get(url, headers=headers, params={"page": max_version[0]}).json()
    next_page = r['page']
    if next_page is not None:
        max_version[0] = next_page
        Process data...
    else:
        max_version.clear() # Stop the while loop

答案 3 :(得分:0)

进一步完善@ dh762的答案,您可以使用while并在其中完成所有请求,而无需2个yield语句。

例如:

import requests

session = requests.Session()

def get_jobs():
    url = "https://api.angel.co/1/tags/1664/jobs"
    currP = 1
    totalP = 2 #assuming there's gonna be 2nd page, it'll get overwritten if not.
    while (currP <= totalP):
        page = session.get(url, params={'page': currP}).json()
        totalP = page['last_page']
        currP += 1
        yield page

for page in get_jobs():
    # TODO: process the page

答案 4 :(得分:0)

这对我有用,使用 **extraArgs

# our initial url
url = f'{base_url}/{api_endpoint}'

# we set a next token, to start our while loop
NextToken = True

# we specify our extra args object
extraArgs = {
    "url": url,
    "headers": headers
}

while NextToken is not None:
    # call api
    r = requests.get(**extraArgs)
    result = r.json()

    # if next url exists, add to method arguments, and do next call with it
    if 'next' in result['_links']:
        next_link = result['_links']['next']['href']
        print(f'found next link: {next_link}')
        extraArgs['url'] = next_link
    else:
        break

答案 5 :(得分:-2)

我让页面在 Python 中工作,尽管我不确定是否会出现类似的情况,因为我使用的是加密 API:

b