资讯动态

Python爬取PokeAPI:从JSON解析到进化链可视化实战

发布时间:2026/9/2 3:04:42 来源:尧图企业网站定制
最近刷宝可梦相关视频时经常看到“小锻匠”“下石鸟”这些新世代的宝可梦被反复讨论。作为一个习惯了数据处理的技术人我的第一反应不是去猜剧情而是想着一个问题这些宝可梦的种族值、进化链、属性分布能不能用 Python 快速抓到本地做成一张结构清晰的表格再画几条变化曲线答案是肯定的。宝可梦领域有一个公开的 REST API 叫做 PokeAPI不需要注册不需要 API Key用requests就能拿到结构化的 JSON 数据。这篇文章就围绕 PokeAPI 做一次完整的数据链路实践从获取单只宝可梦数据开始到解析嵌套的进化链再到用 pandas 组装表格、用 matplotlib 输出可视化最终跑通一条“拉取、清洗、分析、展示”的完整流程。读完本文你会掌握PokeAPI 中 Pokemon、PokemonSpecies、EvolutionChain 三个核心资源之间的关系如何用 requests 获取宝可梦基础数据并提取种族值、属性等关键字段如何解析嵌套结构的进化链把小锻匠Tinkatink这种多段进化关系变成一行行规整数据如何用 pandas 把多个进化阶段合并成一张表并用图表展示进化带来的种族值变化。如果你正在学 Python 数据分析或者想拿一个有趣的主题练手爬虫和 JSON 解析这篇文章可以直接照着做。1. 这篇文章真正要解决的问题先说说痛点。喜欢宝可梦的玩家都知道图鉴中每只宝可梦都包含大量数据编号、属性、种族值、身高、体重、特性、进化条件。这些数据散布在游戏、攻略站和百科中。如果需要把所有宝可梦的进化关系整理成一张表手工复制粘贴几乎不可行而且容易出错。更麻烦的是进化链的结构。宝可梦的进化不是简单的线性关系有的宝可梦只有一个最终形态有的有分支进化有的需要特定道具或亲密度才能进化。这些关系在 JSON 中表现为嵌套对象写代码时容易卡在递归解析上。PokeAPI 解决了“数据从哪里来”这个问题但它不负责“数据怎么用”。它提供的是原始 JSON需要开发者自己请求、解析、清洗和结构化。所以这篇文章真正要解决的问题有三个第一如何用规范的方式从 PokeAPI 拉取数据而不是写死 URL 后手工拷贝 JSON。第二如何把嵌套的进化链对象转换为扁平的表格结构方便后续分析。第三如何把不同进化阶段的数据放在一起用可视化直观地展示进化带来的属性变化。对你来说跑通这条链路后再遇到其他嵌套 JSON 数据源比如订单树、组织架构、评论回复链都可以套用同样的思路。这也是这类练习的真正价值。2. PokeAPI 核心概念与数据模型PokeAPI 是社区维护的免费宝可梦数据接口返回 JSON 格式支持按名字或数字 ID 查询。它数据量很大涵盖了历代宝可梦图鉴、招式、特性、地点等内容。URL 基础地址是https://pokeapi.co/api/v2本文只使用其中三个资源资源接口路径作用Pokemon/pokemon/{name}返回宝可梦基础数据包含种族值、属性、身高、体重、图片等PokemonSpecies/pokemon-species/{name}返回宝可梦物种信息包含进化来源、图鉴编号、捕获率等EvolutionChain/evolution-chain/{id}返回一段进化链的树形结构是进化关系最直接的来源这三个资源之间的关系可以这样理解Pokemon表示“一只具体的宝可梦实例”PokemonSpecies表示“这个宝可梦作为一个物种的元信息”EvolutionChain表示“从初始形态到最终形态的完整进化关系”。通过Pokemon返回中的species.url可以拿到PokemonSpecies数据PokemonSpecies返回中的evolution_chain.url可以跳到EvolutionChain。整条链路是/pokemon/{name} - /pokemon-species/{name} - /evolution-chain/{id}很多初学者第一次看接口文档时容易被绕晕这里有一个关键点进化链是“嵌套对象”不是“扁平列表”。一个典型的进化链 JSON 长这样结构示意字段以实际返回为准{ id: 123, chain: { species: {name: tinkatink}, evolution_details: [], evolves_to: [ { species: {name: tinkatuff}, evolution_details: [], evolves_to: [ { species: {name: tinkaton}, evolution_details: [], evolves_to: [] } ] } ] } }可以看到chain是根根节点代表进化链的初始形态evolves_to是一个数组表示当前形态可以进化成哪些形态数组里的每个元素又是一个相同的结构因此可以继续嵌套。这就是为什么解析进化链要用递归因为它的深度不确定但结构自相似。本节的小结论PokeAPI 的数据模型并不复杂关键是理解从 Pokemon 到 Species 再到 EvolutionChain 的跳转关系以及进化链 JSON 的自相似嵌套结构。搞懂这两点下面的代码就顺理成章了。3. 环境准备与依赖安装本文所有代码使用 Python 编写。建议使用 Python 3.8 或更高版本Windows、macOS、Linux 均可。依赖只有三个requests发起 HTTP 请求获取 JSONpandas把数据整理成表格matplotlib绘制进化趋势图。在项目目录下创建一个虚拟环境可选但推荐mkdir pokemon-analysis cd pokemon-analysis python -m venv .venv source .venv/bin/activate # Windows 用户改为 .venv\Scripts\activate安装依赖pip install requests pandas matplotlib如果下载速度慢可以临时使用国内镜像源pip install requests pandas matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后验证一下python -c import requests, pandas, matplotlib; print(deps ok)看到deps ok就说明环境没问题。注意这个项目需要能正常访问 PokeAPI 的网络环境。可以先执行下面的命令测试连通性curl https://pokeapi.co/api/v2/pokemon/pikachu如果能返回 JSON 数据说明网络正常。环境准备到这里就算完成。这个项目对第三方包的版本要求并不敏感最新的稳定版本都可以正常工作不必刻意锁定版本号。4. 获取宝可梦基础数据第一步先从最简单的开始获取宝可梦基础数据。这里先用皮卡丘Pikachu做标准示例因为它的数据最稳定也最容易被验证。代码要做的核心事情是拼接接口地址、发起请求、把返回 JSON 中我们关心的字段提取出来。# 文件路径pokemon_api.py import requests BASE_URL https://pokeapi.co/api/v2 def get_pokemon(name_or_id): 根据宝可梦名称或编号获取基础数据 url f{BASE_URL}/pokemon/{str(name_or_id).lower()} resp requests.get(url, timeout10) resp.raise_for_status() data resp.json() stats {item[stat][name]: item[base_stat] for item in data[stats]} types [item[type][name] for item in data[types]] return { id: data[id], name: data[name], height: data[height], weight: data[weight], types: types, stats: stats, } if __name__ __main__: info get_pokemon(pikachu) print(info)代码里做了几件事拼接/pokemon/{name}接口地址name统一转小写调用requests.get并设置超时时间拿到 JSON 后把stats数组转换成字典key 是速度、攻击、防御等属性名把types数组提取为字符串列表返回简化后的字典。运行python pokemon_api.py预期输出大致

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价