38

我正在使用 Angel List (AL) API,并希望拉动旧金山的所有工作。由于我找不到 api 的活动 Python 包装器(如果我取得任何进展,我想我想自己做),我正在使用 requests 库。

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,但这没有用。我还尝试了一些非常愚蠢的方法——改变'page'键的值就像神奇地为我分页一样。

例如。r_sanfran['page'] = 2

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

一如既往地感谢。

Angel List API 文档(如果有帮助)。

4

6 回答 6

53

改进@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

for page in get_jobs():
    # TODO: process the page
于 2018-05-09T17:45:16.133 回答
31

读取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
于 2013-07-21T23:23:30.917 回答
2

我遇到了一个 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
于 2019-10-04T12:11:05.310 回答
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
于 2020-10-13T06:18:43.423 回答
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

于 2021-03-25T21:51:16.120 回答
-3

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

pages=3
fl=client.get_fills(ord['product_id'])#fl equals paginated message requested
fil=list(fl)
#you can skip that last 2 lines with: fil=list(client.get_fills(ord['product_id']))
#they're just for clarification
print(json.dumps(fil[0:pages], indent=2, sort_keys=True))
于 2020-12-25T05:01:26.343 回答