本文目录导读:

- 基于 URL 参数(UTM 与自定义参数)
- 基于 HTTP Referrer(来源页)
- 基于用户行为与设备指纹(行为聚类)
- 基于 IP 与地理信息(渠道环境分类)
- 实战:如何编写一个完整的“流量分类脚本”?
- 高级分类:脚本如何处理“复杂场景”?
- 总结:脚本分类的 3 层漏斗
这是一个非常专业且深入的运营或数据分析问题,要“分类分析流量来源”,核心在于通过脚本来解析请求(Request)中的关键参数,进而将流量打上“来源标签”。
脚本(无论是运行在服务器端如Node.js/Python,还是运行在客户端如JavaScript)通常通过以下四大维度来进行分类分析:
基于 URL 参数(UTM 与自定义参数)
这是最直接的分类方式,流量来源方(如广告平台、邮件、社交媒体)会在链接后追加参数。
脚本分析逻辑:
// 示例:JavaScript 脚本解析 UTM
const urlParams = new URLSearchParams(window.location.search);
const source = urlParams.get('utm_source'); // google, newsletter, facebook
const medium = urlParams.get('utm_medium'); // cpc, email, social
const campaign = urlParams.get('utm_campaign'); // spring_sale
// 分类逻辑
if (source === 'google' && medium === 'cpc') {
classifyAs('付费搜索流量');
} else if (source === 'newsletter' && medium === 'email') {
classifyAs('邮件营销流量');
}
分类标准:
- 直接流量: 无任何 UTM 参数,且 Referrer 为空或为自身域名。
- 付费搜索:
utm_medium=cpc,utm_source=google/baidu。 - 社交媒体:
utm_medium=social,utm_source=facebook/twitter。 - 邮件营销:
utm_medium=email。 - 自然搜索: 无 UTM,但
document.referrer来自搜索引擎。
基于 HTTP Referrer(来源页)
如果用户没有携带 UTM 参数,脚本可以通过读取 Referer 请求头(或前端 document.referrer)来判断。
脚本分析逻辑(伪代码):
# Python 后端脚本
def classify_by_referrer(referrer_url):
if not referrer_url:
return "直接访问/书签"
elif "google.com" in referrer_url or "bing.com" in referrer_url:
return "自然搜索流量"
elif "facebook.com" in referrer_url or "t.co" in referrer_url:
return "社交媒体流量"
elif "zhihu.com" in referrer_url or "reddit.com" in referrer_url:
return "外链/社区流量"
else:
return "其他外链流量"
缺点: Referrer 可能被屏蔽或修改(如通过 meta 标签、JS 跳转、HTTPS->HTTP 时空白)。
基于用户行为与设备指纹(行为聚类)
当以上显性参数缺失时,脚本可以通过用户进入后的第一跳行为来反推来源。
脚本分析逻辑(数据分析脚本):
- 对比系数法: 脚本记录用户进入时浏览的页面深度。
- 如果用户进入即访问了一个特定活动页(如
/landing/black_friday),且该页面仅在某广告中出现,则归类为“特定广告流量”。
- 如果用户进入即访问了一个特定活动页(如
- 时间窗口匹配: 脚本记录用户访问时间,与广告投放排期交叉匹配。
- 设备指纹: 如果用户在同一设备上,15分钟前点击了邮件链接(未转化),现在直接输入网址,脚本可将其修正为“邮件二次回流”。
基于 IP 与地理信息(渠道环境分类)
脚本通过解析用户 IP 归属地或运营商来分类。
分类示例:
- 国内/国外: 区分海内外流量。
- 运营商: 区分 电信/联通/移动 流量(常用于网盟推广)。
- 局域网/代理: 这部分通常标记为“异常流量”,不计入主要分类。
实战:如何编写一个完整的“流量分类脚本”?
假设你需要写一个 Python 后端脚本来处理日志/请求:
import re
from urllib.parse import urlparse, parse_qs
def classify_traffic(request):
# 1. 获取参数
referrer = request.headers.get('Referer', '')
url = request.url
user_agent = request.headers.get('User-Agent', '')
ip = request.remote_addr
# 2. 解析 URL 参数
parsed_url = urlparse(url)
params = parse_qs(parsed_url.query)
utm_source = params.get('utm_source', [None])[0]
utm_medium = params.get('utm_medium', [None])[0]
utm_campaign = params.get('utm_campaign', [None])[0]
# 3. 分类逻辑(优先级:付费 > 自然 > 直接)
# 第一类:付费广告(通过 UTM 参数)
if utm_source:
if utm_medium == 'cpc':
return f"付费搜索-{utm_source}"
elif utm_medium == 'display':
return f"展示广告-{utm_source}"
elif utm_medium == 'email':
return "邮件营销"
else:
return f"其他UTM-{utm_medium}"
# 第二类:自然搜索(通过 Referrer)
if referrer:
if 'google' in referrer:
return "自然搜索-Google"
elif 'bing' in referrer:
return "自然搜索-Bing"
elif 'facebook' in referrer:
return "社交媒体-Facebook"
else:
return f"外链-{urlparse(referrer).hostname}"
# 第三类:直接流量(无 Referrer,无 UTM)
return "直接流量"
# 输出示例
print(classify_traffic(request_obj))
高级分类:脚本如何处理“复杂场景”?
流量来源分析常被误导,脚本需要加入去伪逻辑:
| 伪像 | 脚本排查方法 |
|---|---|
| 社交平台内置浏览器 | 判断 User-Agent 是否包含 FBAN、Twitter、MicroMessenger。 |
| Telegram/QQ 转发 | 脚本检测 sec-ch-ua 头部中的 platform 是否非原生浏览器。 |
| 爬虫/机器人 | 脚本先过滤 User-Agent 中的 bot、spider
|
| 自动跳转/追踪失陷 | 检查 Session 中是否有 click_id 或 trans_id,用数据库匹配。 |
| 跨域流量污染 | 脚本使用 document.referrer 时,需清除 location.hash 中的参数。 |
脚本分类的 3 层漏斗
- 第一层(硬分类): 解析
utm_source与referrer,这是最简单的规则引擎脚本。 - 第二层(软分类): 结合会话时长、页面深度判断流量质量(新用户 vs. 老用户,深度浏览 vs. 跳出率)。
- 第三层(归谬分类): 针对“直接流量”做二次回溯——检查用户最近 24 小时是否有过广告点击(Cookie/IDFA 匹配)。
如果你需要特定场景的脚本代码(比如针对 Google Analytics 4 的服务器端追踪脚本,或者针对某地小程序的流量分析),可以告诉我具体的平台或语言(Python/JS/Nginx日志),我可以帮你定制一段分类脚本。