我正在使用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
我猜这是相对简单的事情,但我似乎无法弄明白所以任何帮助都会很棒。
一如既往地谢谢。
答案 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