获取外网IP:用户地域分布分析怎么做(市场地域分析实战)
# 获取外网IP:用户地域分布分析怎么做(市场地域分析实战)
> 接口:获取外网IP(apiCode 632,接入点 1) · 免费 · POST/GET · JSON · 适用:运营、增长、产品经理 · 阅读约 7 分钟
## 核心要点
- 把每次访问者的 IP 属地(省/市/运营商)聚合起来,就能得到用户地域分布看板。
- 用 `city_code` 做区域归并更稳定;`region`/`city` 适合直接分组统计。
- 免费档位下建议"采样 + 缓存",对高频重复访问者不必每次调用。
## Why:看清用户都在哪
做市场或增长,最常被问的一个问题是"我们的用户主要分布在哪些省份?用的什么运营商?"手动看日志里的 IP 没意义,你需要的是"IP → 属地"的批量转换。获取外网IP 让这件事免费可跑:
- 运营:按省份看 activation / 活跃,指导区域投放。
- 增长:识别高潜省份,定向做活动。
- 产品:按运营商分布优化弱网体验。
## What:分析链路速览
| 项 | 值 |
|----|----|
| 数据源 | 每次访问/注册时调用获取外网IP 得到的 `region`/`city`/`isp`/`city_code` |
| 聚合维度 | 省份 `region`、城市 `city`、运营商 `isp` |
| 归并键 | `city_code`(城市编码,比城市名更稳定) |
| 成本控制 | 免费档位有限,对已知访客缓存属地,避免重复调用 |
## How:批量聚合地域分布
落库(每次访问记录一行属地):
```sql
CREATE TABLE visit_geo (
id BIGINT PRIMARY KEY,
user_key VARCHAR(64),
region VARCHAR(32),
city VARCHAR(32),
city_code VARCHAR(16),
isp VARCHAR(32),
created_at DATETIME
);
```
聚合统计(按省份 + 运营商):
```python
import requests
from collections import Counter
APP_KEY = "YOUR_APPKEY"
CACHE = {} # 生产用 Redis:user_key -> 属地,避免重复调用
def region_of(user_key):
if user_key in CACHE:
return CACHE[user_key]
r = requests.post(
"https://route.showapi.com/632-1",
params={"appKey": APP_KEY},
headers={"content-type": "application/x-www-form-urlencoded"},
timeout=10,
)
body = r.json().get("showapi_res_body", {})
info = (body.get("region"), body.get("city"), body.get("isp"), body.get("city_code"))
CACHE[user_key] = info
return info
# 假设已有一批访问者 user_keys
rows = [region_of(k) for k in user_keys]
province_counter = Counter(r[0] for r in rows if r[0])
isp_counter = Counter(r[2] for r in rows if r[2])
print("省份分布:", province_counter.most_common())
print("运营商分布:", isp_counter.most_common())
```
把 `province_counter` 喂给柱状图 / 地图 choropleth,就是一张地域分布看板。
## 返回示例与解析
```json
{
"showapi_res_code": 0,
"showapi_res_body": {
"ip": "183.225.1.165",
"region": "云南",
"city": "昆明",
"city_code": "530100",
"isp": "移动"
}
}
```
聚合时:`region` 直接做省份分组;`city_code`(`530100`=昆明)作城市归并键,比城市名更抗脏数据;`isp` 单独分组看运营商占比。
## 进阶 / 边界
- **采样而非全量**:免费档位有调用限制,对高频回访用户用缓存/Redis 记录属地,只对"新访客"或"过期缓存"调用,成本可控。
- **看板口径**:地域分布是"访问者出口属地",不等于"用户真实常住地"(NAT/代理/基站出口都会偏移)。对外汇报时标注"按访问 IP 属地统计"。
- **城市编码归并**:同名城市或特殊地区优先用 `city_code` 归并,减少因字段为空造成的统计缺口。
## FAQ
**Q:地域分布能代表用户真实所在地吗?**
A:只能代表"访问出口 IP 的属地"。NAT、企业专线、代理会让多个用户显示同一属地,或显示为异地。结论需标注统计口径。
**Q:免费档位够做全量分析吗?**
A:取决于流量。建议对回访用户缓存属地、只对新增/过期调用,配合采样,通常够用;大流量请评估升档。
**Q:`city_code` 为空怎么办?**
A:内网/部分出口可能不返回城市编码,此时退回用 `region` 省级聚合,缺失样本单独计数,不丢整体结论。
**Q:想画成地图 choropleth 用什么键?**
A:优先 `city_code`(国标城市编码),与地图底图行政编码对齐最稳;跨市聚合则用 `region`。
## 相关能力 / 下一步阅读
- [获取外网IP:返回字段全解(IP / 经纬度 / 归属地 / 运营商)](https://www.showapi.com/guides/getip-fields-632)
- [获取外网IP:登录安全与异常地域风控场景集成指南](https://www.showapi.com/guides/getip-login-audit-632)
- [获取外网IP:用经纬度在地图上标出访问者位置](https://www.showapi.com/guides/getip-map-visual-632)
- **本系列共 8 篇**:查看[获取外网IP 指南总目录](https://www.showapi.com/guides/getip-guides-632)