今日油价:全国 31 省油价怎么一次性拉全?省份枚举与批量设计
# 今日油价:全国 31 省油价怎么一次性拉全?省份枚举与批量设计
> 接口/接入点:今日油价 · 查询油价(138-46) · 免费 · 适用人群:需要做全国比价/地图分布的开发者 · 阅读时间:约 6 分钟
## TL;DR
- 查询油价按 `prov` 查单省;要拉全国 31 省,最稳的做法是**循环传入省名列表**逐省查询。
- 文档标注 `prov` 为选填,但省略时的返回行为(是否一次给全 31 省)以实际接口返回为准,**不依赖该假设**。
- 本文给一份省名清单 + 批量拉取 + 限速的代码骨架。
## Why
做「全国油价地图」「各省 92 号比价排行」时,需要一次性拿到所有省份的价格。与其赌「不传 prov 就返回全部」,不如老老实实循环省名——可控、可重试、可缓存。
## What
| 项 | 说明 |
|----|------|
| 接入点 | 查询油价(138-46) |
| 参数 | `prov`(省名,选填;批量用循环传省名) |
| 计费 | 免费,有档位限制 |
标准省名清单(文档示例用法):北京、天津、河北、山西、内蒙古、辽宁、吉林、黑龙江、上海、江苏、浙江、安徽、福建、江西、山东、河南、湖北、湖南、广东、广西、海南、重庆、四川、贵州、云南、西藏、陕西、甘肃、青海、宁夏、新疆(共 31 个省级行政区)。
## How
**步骤:准备省名数组 → 逐省请求 → 限速 + 容错 → 汇总**
```python
import requests, time
PROVINCES = ["北京","天津","河北","山西","内蒙古","辽宁","吉林","黑龙江","上海",
"江苏","浙江","安徽","福建","江西","山东","河南","湖北","湖南","广东",
"广西","海南","重庆","四川","贵州","云南","西藏","陕西","甘肃","青海","宁夏","新疆"]
results = {}
for prov in PROVINCES:
try:
r = requests.post("https://route.showapi.com/138-46",
data={"appKey": "YOUR_APPKEY", "prov": prov},
timeout=10).json()
body = r.get("showapi_res_body", {})
if body.get("ret_code") == 0:
item = body["list"][0]
results[prov] = float(item["p92"]) if item["p92"] else None
except Exception as e:
print("跳过", prov, e)
time.sleep(0.2) # 限速,避免触发档位限制
# 按 92 号价格排序
rank = sorted(results.items(), key=lambda x: (x[1] is None, x[1]))
print("最便宜:", rank[0], "最贵:", rank[-1])
```
cURL(单省,循环在脚本层做):
```bash
curl -X POST "https://route.showapi.com/138-46?appKey=YOUR_APPKEY" \
-H "content-type: application/x-www-form-urlencoded" -d "prov=%E5%B9%BF%E8%A5%BF"
```
## 返回示例与解析
每省返回 `list[0]`,取 `p92` 等字段汇总即可。空字符串表示该省无此标号,按 `None` 处理。
## 进阶/边界
- **别赌省略 prov**:文档标注选填,但「省略即返回全部 31 省」未被文档明确,生产环境用循环更稳。
- **限速与缓存**:免费有档位限制,批量拉全建议加 `time.sleep` 限速,并缓存结果(TTL 对齐每日 7 点,见[《今日油价:免费也有档次限制,如何设计缓存避免超限?》](https://www.showapi.com/guides/oilprice-cache-138))。
- **省名准确性**:用标准省名,避免别名导致查不到。
## FAQ
**Q:不传 prov 是不是就返回全部 31 省?**
A:文档把 `prov` 标为选填,但并未明确「省略即返回全部」。生产环境建议循环传入省名列表,行为可控。
**Q:批量会超限吗?**
A:免费接口有档位限制,31 次循环查询请加限速并缓存,避免短时间高频触发限制。
**Q:省名用全称还是简称?**
A:以文档示例的「北京」「广西」等标准写法为准。
## 相关能力 / 下一步阅读
- [今日油价:免费也有档次限制,如何设计缓存避免超限?](https://www.showapi.com/guides/oilprice-cache-138)
- [今日油价:prov 参数填不填?查询油价(选填) vs 查询行情(必填) 的正确姿势](https://www.showapi.com/guides/oilprice-prov-param-138)
- **本系列共 13 篇**:查看[今日油价开发指南总目录](https://www.showapi.com/guides/oilprice-guides-138)