You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pandas提取Google Books API嵌套列表数据存入DataFrame报错如何解决

问题原因

你直接对API返回的整个结构体做JSON规范化,而实际的图书元数据全部存放在顶层items数组字段中,当前生成的DataFrame仅包含kind、totalItems、items三个顶层字段,嵌套层级的title、id等字段并不存在于这一层结构中,因此取值为NaN。

修正后的代码实现

import requests
import pandas as pd
import json

request_string = "https://www.googleapis.com/books/v1/volumes?q=isbn:9789059056749&key=###KEY###"
response = requests.get(request_string)

if response.status_code == 200:
    response_json = response.json()
    if response_json.get('totalItems', 0) > 0:
        # 提取items数组后再做JSON规范化,自动展开嵌套字段
        book_df = pd.json_normalize(response_json['items'])
        # 提取所需字段,嵌套字段自动生成为「父级.子级」格式的键
        filtered_df = book_df[['id', 'volumeInfo.title', 'volumeInfo.subtitle', 'volumeInfo.authors', 'volumeInfo.publisher']]
        # 重命名字段,适配后续入库需求
        filtered_df.columns = ['book_uid', 'title', 'subtitle', 'authors', 'publisher']
        print(filtered_df)
else:
    print(f"API请求失败,状态码:{response.status_code}")

后续存入MySQL的实现步骤

  1. 安装依赖库
    执行命令安装MySQL连接工具:
    pip install pymysql sqlalchemy

  2. 预先创建数据库表
    在MySQL中新建藏书库,创建books表,字段与上面整理后的DataFrame列名对应,可将book_uid设为主键避免重复数据。

  3. 写入数据库的代码示例

from sqlalchemy import create_engine

# 替换为你自己的MySQL连接信息
engine = create_engine('mysql+pymysql://用户名:密码@127.0.0.1:3306/你的库名?charset=utf8mb4')
# append模式追加数据,不会覆盖已有表内容
filtered_df.to_sql(name='books', con=engine, if_exists='append', index=False)

优化建议

  • 批量查询多本图书时,单次请求间隔1秒以上,避免触发Google API限流规则
  • 存入数据前先校验数据库中是否已存在对应book_uid或ISBN,避免重复请求、重复入库
  • API返回的authors为数组格式,可转成逗号分隔的字符串存储,也可单独拆分出作者表做关联,方便后续按作者检索
  • 可扩展存储ISBN、封面链接、分类标签等字段,完善藏书目录的检索维度

内容的提问来源于stack exchange,提问作者Zuppke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:45:06