Python在api上遍历多个页面并打印我想要的内容

时间:2019-01-16 23:46:34

标签: python json api python-requests

您好,我正在练习我的技能(对编程非常陌生),然后尝试使用此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页的链接,依此类推,我试图找出一种方法来打开该值并打印出该页上的字符,然后在该页上打开直到我打印出所有字符为止。

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的所有者)。