如何在前端统计用户访问来源
https://www.sensorsdata.cn/blog/yong-hu-lai-yuan-tong-ji/
用户来源是网站数据分析中一个重要的指标,然而想要准确的统计来源却并没有唯一的方法。下面我们针对获取来源的方式、来源的定义做一些具体的阐述;并且以sensorsdata.cn这个网站为例来做具体的来源分析。
1.前端获取来源的两种方式
1.1 通过给页面加自定义参数来标志
第一种方案,是通过给页面加自定义参数来标注用户的来源,我们暂且把这个来源叫做from
。
例如,我们将这个地址www.sensorsdata.cn?from=weibo
通过营销人员在微博中转发,然后我们网站通过解析参数from
就能取到来源weibo
。
对于这里的from这个自定义的参数,谷歌有个标准。一般来说可以用utm_source=weibo
这样来标记来源。其他的还有utm_medium utm_campaign utm_content utm_term
等等,可以自行搜索下。
1.2 通过referrer实现
第二种方案,是通过用户访问的referer
来定义用户的来源,我们暂且把这个来源叫做referrer
。
比如用户在baidu中搜'sensorsdata',然后跳转到了'www.sensorsdata.cn'。那我们通过document.referrer
能取到来源是'http://www.baidu.com/link?url=2fhHMI-7QopsGnGaJppRU8suX290yzANr3PNY8fupUy&wd=&eqid=bbd4f5c00001ec4a0000000356a83851'。
由于referer
的URL可能取值太多,那么更进一步,可以专门取一下referer的host,用这个来做来源的标志。
1.3 两种来源的综合
如上面所描述的那样,我们会有两种来源方式,一个是我们做标记的来源from,一个是固有的referrer。我们既可以把这两个来源都统计,也可以先取自定义标签from再取referrer(示例如下)。
if(自定义from){
来源 = 自定义from
}else{
来源 = document.referrer
//因为referrer取的过长,可以只取host如`baidu.com`
来源 = 只截取referrer的host
}
sa.track('user_from',{from:来源,detail:document.referrer})
2. 来源的3种定义
2.1. 用户首次打开页面的时候的首次来源
在这里,我们把用户首次打开页面的时候的首次来源叫initial_referrer
。 这里的referrer可以作为用户的固有属性,类似于姓名,也即是 Sensors Analytics 中的profile属性。
在JS-SDK中可以这么实现:
//在引入js-sdk后加入以下代码
sa.setOnceProfile({initial_referrer:document.referrer})
这个来源只会set一次,也就是一个浏览器端,只会有一个来源。
2.2 一个访问周期内的访问来源
一个访问周期,也即用户打开浏览器到关闭浏览器这个周期内的第一次来源,我们把他叫做session_referrer
。
正常情况下,我们可以设置一个不加时间的cookie来标志这个网站的session周期。然而我在测试了一些浏览器后,发现并不理想。mac下safari和firefox,直接按关闭按钮关闭浏览器,cookie还是存在的,但是点浏览器退出后,cookie是会清除掉的。而在mac下的chrome浏览器,设置cookie后,关闭浏览器,重新打开还是会存在。所以通过这个方式并不靠谱。
不过我们可以通过设置一个限时的cookie来实现,比如60分钟的session周期。这样所有浏览器都能实现。也就是用户打开页面,然后60分钟内的操作,这里的来源都认为是一个来源。60分钟后再打开页面,就认为是新的来源。
//页面打开后
if(cookie中取到startFrom){
来源 = cookie中的来源
}else{
来源 = 当前来源
setCookie('startFrom', 当前来源, 60分钟)
}
2.3 每个页面的访问来源
这个就是通常意义上的referrer
了,在每个页面访问时,都取referrer。
3. sensorsdata.cn的来源分析
sensorsdata会获取initial_referrer
和initial_from
sa.setProfileOnce({
initialReferrerUrl: document.referrer,
initFromUrl: '根据url解析出来的来源'
})
sensorsdata会在每次页面打开的时候,取from和referrer
sa.track('page_open',{from:'解析url来源',referrer:document.referrer,referrerHost:''})
当然这里会有重复,如果是自己网站内的跳转,如果需要过滤的话,可以自行做判断过滤。
4. 其它
客户A只想取某个页面的自定义来源做为需求的来源
if(这个页面有自定义来源){
sa.setProfileOnce({fromUrl:自定义来源});
}