您好,我正在练习我的技能(对编程非常陌生),然后尝试使用此api https://swapi.co/api/people/,该api具有包含所有星球大战角色,电影,行星等的数据,循环浏览所有页面,并打印出所有字符 这是我目前的代码
import requests
import json
r = requests.get("https://swapi.co/api/people/")
info = r.json()
for i in info['results']:
print(i['name'])
会打印出该页面上的所有字符, 如果您查看链接,则“ next”键将保留指向第2页的链接,依此类推,我试图找出一种方法来打开该值并打印出该页上的字符,然后在该页上打开直到我打印出所有字符为止。
答案 0 :(得分:0)
好吧,我将首先从代码开始,然后对其进行解释。
导入请求 导入json
def get_and_print_data(url):
r = requests.get(url)
info = r.json()
for i in info['results']:
print(i['name'])
if info.get('next'):
get_and_print_data(info['next'])
get_and_print_data("https://swapi.co/api/people/")
这里的代码非常糟糕,因为该方法做的太多了(获取数据,处理它,确定是否有下一页并打印数据。这对于一个函数来说是太多逻辑,但是对于我们例子还可以。
那么,首先,为什么要有功能? 因为我们需要多次执行相同的操作(获取,处理和打印数据),所以每页一次。有什么变化?网址,因为每个页面都有不同的网址。因此,我们将URL作为该函数的参数。
接下来的几行来自您的代码,所以我认为您对它们很熟悉。
然后我们有重要的一行:if info.get('next'):
在字典中,您通常使用dictionary[key]
检索数据,如果不存在称为 KeyError 的键,则会触发并引发异常。在这种情况下,我们应该使用try / except来检查键 next 是否存在。即使这被认为是更“ pythonic”的方式,但这种带有“ if”的方式可能更容易理解。
.get('next')
会做什么?好吧,几乎是同一回事,但是如果没有键,它将返回None
而不是引发异常,并记住在Python中None
被评估为false。
长话短说,这将检查您的答案中是否存在键 next (您可以看到API对于缺少的数据返回null)。如果存在密钥,我们将使用下一页的URL调用相同的函数,并重复执行直到返回的JSON中缺少 next 密钥(或null)为止。
当然,我们必须使用初始URL调用函数,然后从那里继续进行它:)
希望这会有所帮助,并且一切都容易理解!
答案 1 :(得分:-1)
我的解决方案:
import requests
import json
def query_api(url):
r = requests.get(url)
info = r.json()
return info['next'], info['results']
n, r = query_api("https://swapi.co/api/people/")
while n:
for i in r:
print(i['name'])
n, r = query_api(n)
此外,如果您正在使用这样的API,则不妨查看一下requests-cahce,您可以将其包含在代码中以在本地缓存API结果,这样您就可以运行重复查询而无需点击速率限制。 (当然要考虑到API的所有者)。