如何统计 AI 搜索带来的 GEO 地域维度访问流量
统计AI搜索带来的GEO地域访问流量应以服务端或边缘日志为主、GA4为辅,先用Referrer及落地URL参数识别AI来源,再用真实用户IP经GeoLite2/GeoIP2解析国家省市并按会话聚合,避免仅靠GA4将流量归入Direct导致地
结论:统计 AI 搜索带来的 GEO 地域维度访问流量,最可靠的做法是“服务端或边缘日志为主、GA4 为辅”:先用 Referrer 和落地 URL 参数识别 AI 搜索来源,再用真实用户 IP 通过 GeoLite2/GeoIP2 映射到国家、省、城市,最后按会话聚合。只靠 GA4 会把大量 AI 点击归入 Direct,地域维度会失真。本文里的 GEO 指 Geographic,即地域维度;AI 搜索指 ChatGPT、Perplexity、Copilot、Gemini 等生成式搜索入口。
AI 搜索流量为什么在 GA4 里统计不准?
结论:GA4 默认按前端可拿到的来源归因,而 AI 搜索点击经常不传 Referrer,导致流量落到 Direct 或自然搜索。Referrer 是 HTTP 请求头里的上一跳页面地址;当链接带 rel=noreferrer 或在 App 内置浏览器打开时,服务端和前端都拿不到来源域名。
GA4 的自定义渠道组可以按“来源包含 chatgpt|perplexity|claude|copilot|gemini”做规则,地理报告也能看国家、城市。但前提是 GA4 收到了正确来源。一旦来源为空,GA4 无法事后补全。所以 GA4 适合做交叉验证,不能作为唯一统计口径。真正可追溯的是 nginx、OpenResty、Cloudflare 等边缘层日志。
怎么识别 AI 搜索来源?
结论:维护 AI 来源域名和参数清单,优先匹配 Referrer,其次匹配落地页 utm_source、ref、source 参数。常见域名包括 chatgpt.com、openai.com、perplexity.ai、claude.ai、copilot.microsoft.com、gemini.google.com、you.com、phind.com、kagi.com、poe.com。
nginx 里可用 map 做第一层识别:
map $http_referer $ai_source {
default "";
~*chatgpt\.com "ChatGPT";
~*perplexity\.ai "Perplexity";
~*claude\.ai "Claude";
~*copilot\.microsoft\.com "Copilot";
~*gemini\.google\.com "Gemini";
}
如果 $http_referer 为空,再检查 $arg_utm_source 或 $arg_ref。注意大小写、子域名和 URL 编码,统一转小写后再匹配。AI 平台里的用户浏览器 UA 通常不暴露“来自 AI 搜索”,不要把 UA 当作主要识别依据。
GEO 地域维度怎么落到访问日志?
结论:地域维度必须基于用户真实 IP 解析。若站点挂在 Cloudflare 等 CDN 后面,$remote_addr 往往是 CDN 节点 IP,不是用户 IP。Cloudflare 场景要取 CF-Connecting-IP,并配置 real_ip_header CF-Connecting-IP 和 set_real_ip_from。
nginx 安装 ngx_http_geoip2_module 后,可用 MaxMind GeoLite2-City.mmdb 写入日志:
geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
auto_reload 5m;
$geo_country country iso_code;
$geo_region subdivisions 0 names en;
$geo_city city names en;
}
log_format geo '$remote_addr - $time_iso8601 "$request" $status "$http_referer" "$http_user_agent" ai=$ai_source country=$geo_country region=$geo_region city=$geo_city';
access_log /var/log/nginx/geo.log geo;
GeoLite2 数据库每周更新,通常周二和周五发布。不能装模块时,可用 Python geoip2 库后处理日志。合规上建议匿名化:IPv4 清零最后 8 位,IPv6 清零后 80 位,只保留国家、省、城市级别。
统计口径和 SQL 怎么写?
结论:按“AI 来源 + 国家 + 省份”聚合独立 IP 和页面浏览量,排除静态资源和爬虫。爬虫 UA 如 GPTBot、ClaudeBot、PerplexityBot 不是用户点击流量,应单独统计。
把 nginx 日志导入 ClickHouse 后可用:
SELECT
ai_source,
country,
region,
uniqExact(ip) AS uv,
count() AS pv
FROM nginx_geo_log
WHERE ai_source != ''
AND event_time >= now() - INTERVAL 7 DAY
AND status = 200
AND request_path NOT REGEXP '\\.(css|js|png|jpg|gif|svg|woff2?)$'
AND http_user_agent NOT REGEXP 'GPTBot|ClaudeBot|PerplexityBot'
GROUP BY ai_source, country, region
ORDER BY uv DESC
LIMIT 100;
想看会话数,就把同一 IP 在 30 分钟内的请求聚成一个会话。想看城市,把 region 换成 city。GA4 侧可创建自定义渠道组,规则用正则 chatgpt|openai|perplexity|claude|copilot|gemini|you\.com|phind|kagi|poe,再打开地理报告对比,但最终以日志结果为准。
最小可用方案怎么做?
结论:半天可以搭出最小闭环:nginx 日志 + GeoLite2 + 来源正则 + 每日脚本。步骤是:1. 注册 MaxMind 账号,下载 GeoLite2-City.mmdb;2. 在 nginx 或 OpenResty 配置 map、geoip2、log_format;3. 配置日志切割,按天生成文件;4. 用 Python 或 SQL 聚合 ai_source、country、region;5. 输出 CSV 到 BI 看板。若用 CDN,第一步先修真实 IP,否则地域会全变成 CDN 节点位置。
结尾收束:统计 AI 搜索地域流量,核心是服务端日志兜底、AI 来源识别、真实 IP 地理映射、按会话聚合。先跑通国家和省份维度,再下钻城市;GA4 只做验证,爬虫流量单独排除。
转载请注明出处,版权归原作者所有。