指南

根据原始 IP 地址日志生成热力图

满是 IP 地址的访问日志中埋藏着真实的地理信息,但前提是每个地址都已被解析为地图工具能够实际绘制的坐标。

从日志中提取地址

请先从日志文件中提取唯一的 IP 地址,而不是逐行单独查询,因为同一个访客地址通常会在一次会话中出现多次,没有理由为同样的查询反复付费。

sort logfile.txt | awk '{print $1}' | sort -u > unique_ips.txt

批量解析

将唯一地址列表作为批量 POST 数组发送到 /v1/ip。

POST /v1/ip
Content-Type: application/json

["203.0.113.10", "198.51.100.25", "192.0.2.44"]
{
  "status": "ok",
  "results": [
    {"ip": "203.0.113.10", "version": 4, "found": true, "country": "Germany", "country_code": "DE", "region": "Berlin", "city": "Berlin", "postcode": "10115", "lat": 52.5300, "lon": 13.3800, "timezone": "Europe/Berlin", "asn": 1111, "org": "Example ISP"},
    {"ip": "198.51.100.25", "version": 4, "found": true, "country": "Spain", "country_code": "ES", "region": "Madrid", "city": "Madrid", "postcode": "28001", "lat": 40.4168, "lon": -3.7038, "timezone": "Europe/Madrid", "asn": 2222, "org": "Example Networks"},
    {"ip": "192.0.2.44", "version": 4, "found": false}
  ]
}

构建热力图数据集

将返回的每组 lat 和 lon 与该原始地址在日志中出现的次数配对,这样在日志中出现一百次的访客所占的权重,会按比例高于只出现一次的访客。把得到的加权坐标点列表输入您用来呈现热力图的地图或图表工具。

第二个示例:改为按国家细分

如果逐点精确的热力图超出了您所需的细节,可以按 country_code 而不是原始坐标进行汇总,生成更简单的分级统计图式视图,每个国家一个数值,而不是一片散乱的点云。这使用的是完全相同的批量查询,只是在结果返回后换一种方式分组,因此用同一份解析数据构建两种视图不需要任何额外成本。

处理无法解析的地址

像上面第三个结果那样 found: false 的条目,应当直接从热力图中排除,而不是绘制在某个默认位置,因为把它包含进来会误导性地把未解析的流量聚集在地图上某个与其实际来源毫无关系的地方。

需要避免的常见错误

在建立唯一地址列表之前,不要跳过过滤明显的非访客流量,例如从固定地址不断访问您服务器的内部健康检查或监控服务。每分钟轮询一次的监控服务会积累不成比例的日志行数,与真实的访客地理分布毫无关系;虽然去重已经把它限制为一个解析点,但这一个点在视觉上仍可能在热力图中占据主导,与它所代表的任何真实流量模式都不成比例。

一个边界情况:主机托管和数据中心流量

已解析地址的 org 字段常常能揭示流量来自数据中心或云托管 IP 段,而不是住宅或移动网络连接;在机器人或爬虫流量扭曲本应代表真实访客位置的热力图之前,这是一个用于过滤它们的合理信号。

成本是多少

解析唯一地址而不是每一行日志,正是让这件事保持低成本的关键,因为请求成本是每个唯一地址一次,而不是每行日志一次。一份有一百万行、但只有几千个唯一访客地址的日志,只需要几千次请求,而不是一百万次;对于大型网站,用预付额度或 Unlimited 套餐完全可以轻松应对,对于较小的网站则常常在免费配额之内。在大型批量任务运行期间观察 X-Quota-Used 响应头,是在任务完成前确认用量是否符合预期的简单方法。

解析前先去重,是让基于日志的热力图保持低成本的最大杠杆。IPv4 查询文档完整介绍了批量请求格式。