Appearance
用IP查询分析网站日志,做出用户地域分布图
很多网站买了服务器、跑了半年,结果连"用户都来自哪些地方"都答不上来。其实数据一直都在——访问日志里每一行都有访客IP,只是没人去挖。
今天分享一套完整流程:从 Nginx 日志里抽出IP → 批量查归属地 → 汇总成地域分布 → 画图。做完这步,运营和市场以后都得来谢你。
第一步:从日志里抽出IP
Nginx 默认的 access.log 长这样:
192.168.1.5 - - [22/Aug/2026:10:00:01 +0800] "GET / HTTP/1.1" 200 ...
114.114.114.114 - - [22/Aug/2026:10:00:05 +0800] "GET /about HTTP/1.1" 200 ...用 awk 就能把IP拎出来,再去重、统计每个IP出现的次数:
bash
awk '{print $1}' access.log | sort | uniq -c | sort -rn > ip_count.txt这一步很重要:拿到"每个IP访问了多少次",后面分析访问量分布才准,而不只是"哪些IP来过"。
第二步:批量查归属地
用我上一篇讲的Python批量脚本,把 ip_count.txt 里的IP查成归属地。这里直接给个能跑的完整版:
python
import requests
from functools import lru_cache
@lru_cache(maxsize=200000)
def query(ip):
try:
r = requests.get(f"https://ip9.com.cn/get?ip={ip}", timeout=3)
d = r.json()
if d.get("ret") == 200:
return d["data"]
except Exception:
pass
return {}
# 读日志统计结果: 每行 "次数 IP"
from collections import Counter
region = Counter()
for line in open("ip_count.txt"):
cnt, ip = line.split()
info = query(ip)
if info:
# 按"省"聚合,海外用国家
key = info.get("prov") or info.get("country") or "未知"
region[key] += int(cnt)
for k, v in region.most_common(20):
print(k, v)第三步:画图
有了各省访问量,画图就简单了。两个选择:
- 省市区表格 + 柱状图:用 Excel 或者 ECharts 直接画,最快。
- 地图可视化:这是效果最好的。把数据喂给 ECharts 的地图,一眼看出用户集中在哪。(画地图的完整教程我后面单独写了一篇,这里先不展开)
一些容易踩的坑
1. 记得过滤爬虫
日志里很大一部分是搜索引擎爬虫和监控脚本。它们来自机房IP,会严重污染统计。过滤办法有两个:
- 把 UA 里带
bot、spider、crawler的请求去掉; - 用
ip_type字段把 IDC 机房IP单拎出来,看看占比——如果特别高,说明你的站可能被爬了。
2. CDN别漏了真实IP
如果你的站挂了CDN,日志里的 $remote_addr 全是CDN节点的IP,查出来全在一个城市。要用 X-Forwarded-For 或CDN提供的真实IP头:
nginx
log_format main '$http_x_forwarded_for - $remote_addr - $remote_user ...';3. 区分访问量和独立IP
uniq -c 统计的是访问次数,想知道独立访客数就只看IP去重。两个指标别混着说。
做完你能得到什么
- 一张"用户都来自哪些省份"的图;
- 用户规模最大的前几个城市;
- 大概判断出网站的受众画像。
我帮朋友做的一次,顺手还发现了他们站被某个地方的机房IP狂爬——要不是这次分析,根本发现不了。日志里藏着的东西,比你想象的多。
批量查询的接口:https://www.ip9.com.cn