使用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的实现步骤
安装依赖库
执行命令安装MySQL连接工具:pip install pymysql sqlalchemy预先创建数据库表
在MySQL中新建藏书库,创建books表,字段与上面整理后的DataFrame列名对应,可将book_uid设为主键避免重复数据。写入数据库的代码示例
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
相关产品推荐
相关产品推荐

