Json 从RESTAPI获取所有数据,包括嵌套的API链接

Json 从RESTAPI获取所有数据,包括嵌套的API链接,json,pandas,api,dataframe,Json,Pandas,Api,Dataframe,我正在尝试从RESTAPI中检索JSON数据,该API包含有关星战宇宙中人、电影、星际飞船和行星的信息 这是我的密码: total_结果=[] 对于范围(1,7)中的页码: #构建URL并下载结果 url=”https://swapi.dev/api/people/?page=“+str(页码) 打印(“下载”,url) response=requests.get(url) data=response.json() 总结果=总结果+数据[“结果”] 打印(“我们有”,len(总结果),“总结果”

我正在尝试从RESTAPI中检索JSON数据,该API包含有关星战宇宙中
电影
星际飞船
行星
的信息

这是我的密码:

total_结果=[]
对于范围(1,7)中的页码:
#构建URL并下载结果
url=”https://swapi.dev/api/people/?page=“+str(页码)
打印(“下载”,url)
response=requests.get(url)
data=response.json()
总结果=总结果+数据[“结果”]
打印(“我们有”,len(总结果),“总结果”)
SW_people_df=pd.json_规范化(总结果)
SW_人员_df.负责人()
以下是dataframe的外观:

名称 高度 大量 发色 肤色 眼睛颜色 出生年份 性别 种 网址 0 卢克·天行者 172 77 金发的 公平的 蓝色 19BBY 男性的 [] 1. C-3PO 167 75 不适用 金 黄色的 112BBY 不适用 ['http://swapi.dev/api/species/2/'] 2. R2-D2 96 32 不适用 白色,蓝色 红色 33BBY 不适用 ['http://swapi.dev/api/species/2/'] 3. 达斯维达 202 136 没有一个 白色 黄色的 41.9BBY 男性的 [] 4. 莱娅·奥加纳 150 49 棕色的 光 棕色的 19BBY 女性的 []
有趣的要求

  • 下载所有的人(与您相同的方法只是更多的压缩代码)
  • 检查每一列是否包含链接(“http”)
  • 创建包含链接的所有列的字典,该链接的数据帧是该列中所有链接结果的串联
  • 现在,您已经拥有了所有数据,因此您可以合并/连接并分析每个数据类别
输出
import requests
import pandas as pd

# people - pages 1 to 7
dfp = pd.concat([pd.json_normalize(requests.get(f"https://swapi.dev/api/people/?page={p}").json()["results"]) for p in range(1,7)])


# get all the related data from urls against ppl
linkeddf = {c:pd.concat([
    pd.json_normalize(requests.get(u).json()) for u in dfp[c].explode().dropna().unique()
]) for c in dfp.columns if dfp[c].explode().str.contains("http").any() and c!="url"}


# join ppl to homeworld
dfp.merge(linkeddf["homeworld"], left_on="homeworld", right_on="url", suffixes=("_person","_world"))

# what films has a skywalker been in?
(dfp.explode("films").merge(linkeddf["films"], left_on="films", right_on="url", suffixes=("_person","_film"))
 .loc[:,["name","title"]]
 .query("name.str.contains('Sky')")
)
                 name                    title
0      Luke Skywalker               A New Hope
17     Luke Skywalker  The Empire Strikes Back
33     Luke Skywalker       Return of the Jedi
53     Luke Skywalker      Revenge of the Sith
61   Anakin Skywalker      Revenge of the Sith
79   Anakin Skywalker       The Phantom Menace
94     Shmi Skywalker       The Phantom Menace
115  Anakin Skywalker     Attack of the Clones
123    Shmi Skywalker     Attack of the Clones