• 沙里软件

  • ShaliSoft.com [手机站]   办公桌收纳抽屉
  • 首页
  • 博文
  • 演示
  • 管理
  • Google Analytics与百度统计的原理

    网络   2015/12/26 15:55:12

    Google Analytics与百度统计的统计数据都是有差异的,而且差异非常大,其根本原因在于数据统计的原理和机制是不同的。下面分享一下两位博友李鑫和赵高欣对Google Analytics与百度统计做出的原理分析。


    百度统计的工作原理分析

    百度统计提供的JS,实质上是往页面中引入hm.baidu.com/h.js的这段代码,该代码的内容会根据后面的参数有所不同,h.js?后面的参数就是你在百度统计里的id。

    获取该h.js代码的同时,百度统计会往你的浏览器写入一个名字为“HMACCOUNT”的cookie,该cookie的过期时间为2038年,所以只要你没有清空浏览器cookie,基本就永不过期。

    h.js被下载后,便执行其脚本获取一些浏览器相关信息和访问来源,获取的信息包括屏幕尺寸、颜色深度、flash版本、用户语言等。

    从js代码中可以得到,所有参数包括这些:”cc,cf,ci,ck,cl,cm,cp,cw,ds,ep,et,fl,ja,ln,lo,lt,nv,rnd,sb,se,si,st,su,sw,sse,v”。这些参数的意义大致如下:

    cc: 不知道,一般为1
    cf:url参数hmsr的值
    ci:url参数hmci的值
    ck:是否支持cookie 1:0
    cl:颜色深度 如 “32-bit”
    cm:url参数hmmd的值
    cp:url参数hmpl的值
    cw:url参数hmkw的值
    ds:屏幕尺寸,如 ’1024×768′
    ep:初始值为’0′,时间变量,反映页面停留时间,格式大概是:现在时间-载入时间+“,”+另一个很小的时间值
    et:初始值为’0′,如果ep时间变量不是0的话,它会变成其他
    fl:flash版本
    ja:java支持 1:0
    ln:语言 zh-cn
    lo: 不知道,一般为0
    lt:日期 time.time(),如“1327847756”,在首次请求没有
    nv: 不知道,一般为1或者0
    rnd:十位随机数字
    sb:如果是360se浏览器该值等于‘17’
    se: 和搜索引擎相关
    si:统计代码id
    st:
    su:上一页document.referrer
    sw: 不知道,估计和搜索引擎有关,一般为空
    sse:不知道,估计和搜索引擎有关,一般为空
    v:统计代码的版本 ,目前该值为“1.0.17”

    当这些参数都设置完毕了(有些参数并没有赋值),筛选出已经赋值了的参数,并作为hm.baidu.com/hm.gif的参数拼凑出一个url,如:http://hm.baidu.com/hm.gif?cc=1&ck=1&cl=32-bit&ds=1366×768&ep=0&et=0&fl=11.0&ja=1&ln=zh-cn 。然后请求该图片。

    百度统计服务端,通过接收到这个请求,并从这个图片的网址附带的参数获取相关信息,记录访客访问记录;当页面被用户关闭的时候,同样会触发一次请求hm.gif的过程,但这个过程不是所有浏览器和所有关闭动作都支持。

    使用使用Wireshark(一款网络抓包工具)测试可以发现,浏览器总共向服务器端发送了4次请求:

    http://hm.baidu.com/h.js?3266e9d3684e7a1307dc7c4b4a64b0ae
    http://hm.baidu.com/hm.gif?cc=1&ck=1&cl=32-bit&ds=1366×768&ep=0&et=0&fl=11.0&ja=1&ln=zh-cn&lo=0<=1328171561&nv=1&rnd=2889921&si=3266e9d3684e7a1307dc7c4b4a64b0ae&st=3&su=http%3A%2F%2Fwww.zhanghangbo.com%2F&v=1.0.17
    http://hm.baidu.com/hm.gif?cc=1&ck=1&cl=32-bit&ds=1366×768&ep=7289%2C115&et=3&fl=11.0&ja=1&ln=zh-cn&lo=0<=1328171561&nv=1&rnd=1444115283&si=3266e9d3684e7a1307dc7c4b4a64b0ae&st=3&su=http%3A%2F%2Fwww.zhanghangbo.com%2F&v=1.0.17
    http://hm.baidu.com/hm.gif?cc=1&ck=1&cl=32-bit&ds=1366×768&ep=212486%2C4614&et=3&fl=11.0&ja=1&ln=zh-cn&lo=0<=1328171541&nv=1&rnd=1067394506&si=0f9e2caa14d6d0a51371b168d182314a&st=1&v=1.0.17

    可以发现,浏览器总共向服务器端发送了4次请求:

    1、请求一段js脚本。

    2、加载完毕时候出发一次请求,并传递参数

    3、退出页面时候,发出一次请求,并传递参数,与上面对比,发现ep参数有变化。


    百度统计是基于cookie的,当请求js脚本的时候,会在你电脑里保存一个永久cookie,该cookie作为你的用户标识。同时发现,但退出时候参 数ep从最开始的0变为了“7289%2C115”,转义后是“7289,115”这是两个毫秒单位,即7.2秒和0.1秒的意思。同时前两次请求 hm.gif的时候lt参数(时间,javascript:(new Date).getTime())是不变的。rnd随机数每次都变。


    下面使用Python模拟请求代码:

    import urllib2
    import urllib 
    import random
    import math
    import urlparse
    import time
    import cookielib
    
    ########################################################################
    class Baidu:
        """"""
        Referer='http://www.shalisoft.com'
        TargetPage='/www.shalisoft.com'
        BaiduID=''
        Hjs="http://hm.baidu.com/h.js?"
        Hgif="http://hm.baidu.com/hm.gif?"
        UserAgent='Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' #IE9
        MyData={'cc':'1','ck':'1','cl':'32-bit','ds':'1024x768','et':'0','ep':'0','fl':'11.0','ja':'1','ln':'zh-cn','lo':'0','nv':'1','st':'3','v':'1.0.17'}
        #----------------------------------------------------------------------
        def __init__(self,baiduID,targetPage=None,refererPage=None):
            """Constructor"""
            self.TargetPage=targetPage or  self.TargetPage
            self.Referer=refererPage or self.Referer
            self.BaiduID=baiduID
            self.MyData['si']=self.BaiduID
            self.MyData['su']=urllib.quote(self.Referer)
            pass
        def run(self,timeout=5):
            cj=cookielib.CookieJar()
            opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))  
            opener.addheaders=[("Referer",self.TargetPage),("User-Agent",self.UserAgent)]
            try:
                response=opener.open(self.Hjs+self.BaiduID).info()
                self.MyData['rnd']=int(random.random()*2147483647 )
                self.MyData['lt']=int(time.time())
                fullurl=self.Hgif+urllib.urlencode(self.MyData)
                response2=opener.open(fullurl,timeout=timeout).info()
                self.MyData['rnd']=int(random.random()*2147483647 )
                self.MyData['et']='3'
                self.MyData['ep']='2000,100'
                response3=opener.open(self.Hgif+urllib.urlencode(self.MyData),timeout=timeout).info()
                pass
            except urllib2.HTTPError ,ex:
                print ex.code 
                pass
            except urllib2.URLError,ex:
                print ex.reason
                pass
            pass
        
        
        
    if  __name__ =="__main__":
        a=Baidu('百度统计id','http://www.shalisoft.com/','www.shalisoft.com')
        a.run()

    代码中,实际我没有模拟4次请求,发出3次就可以在百度统计的最新访客里看到记录,发出前两次的话,在百度统计里可以看到有访问记录,但是不显示来源和访问页面。用法很简单,只要实例化Baidu这个类,并给他传递3个参数,第一个为百度统计给你的统计id,第二个是被访问页面的url,这个url可以是不存在的,因为实际百度统计并没有验证页面的存在,第3个就是访问该页面的来源页面,这样就可以在百度统计的后台看到来自‘www.lixin.com.cn’的用户访问了test4这个页面。


    Google Analytics的工作原理

    当用户访问了一个包含Google Analytics统计代码的页面,这段代码会被用户的浏览器执行,而这段代码的作用就是用来收集这位访客的信息,比如浏览页面的URL、浏览器类型、操作系统、系统语言、屏幕分辨率等。

    GA统计代码随后将这些访客信息存储到Cookie中,Cookie是一段短小的文本,存放于本地,与访问的网站相关联,它被用来判断一个用户是初次访问还是多次访问,页面的推荐来源和随后的页面浏览信息等。

    最后,所有的被收集到的信息会被发送到Google Analytics的数据服务器上。这个过程比较巧妙,我们知道服务器的日志文件会记录每一次的文件请求信息,而Google Analytics收集数据的方式便是通过向服务器请求一个透明的1×1的GIF图片文件,这个文件请求以及请求时间会在服务器日志中被记录,而文件请求 信息包含了GA统计代码收集的数据和Cookie信息,这样,每当这个GIF图片收到请求申请时,访客的访问信息就会被Google Analytics数据服务器收集。

    不过Google Analytics只是发送一张gif请求,很多时候会发送多张gif请求。假如有一个gif图片无法统计,那么GA会发送其他gif请求,


    总结:

    网站分析大师Avinash曾经说过只要有数据有90%的准确度,那么就可以及时采取行动了。重要的是能够看出趋势,进而采取行动,然后进行测试,不断地优化。


    阅读(3720) 分享(0)

    上一篇: 使用new Image()打点时的一个注意事项
    下一篇: ASP.NET 获取上个月当前月的1号和月尾

  • 精彩推荐

    ◆ MySQL配置优化
    ◆ WINDOWS 2003 IIS6 支持SHA256。基础连接已经关闭 发送时发生错误修复
    ◆ sql2000增加序号列,自动增加列,ROW_NUMBER()
    ◆ SQL set statistics命令
    ◆ Google Analytics与百度统计的原理
    ◆ OutputCache 缓存 VaryByCustom的使用,增加缓存后手机端无法做判断的处理
    ◆ SQLSERVER数据库检查DBCC CheckDB
    ◆ 为什么mysql使用SELECT*比SELECT字段 查询速度还快
    ◆ 谷歌镜像网站大全 google翻墙地址大全
    ◆ 携程全线瘫痪,传言代码被恶意删除
  • 用心做事 不能唯利是图

    • 吊儿
    • 用QQ联系我17905772
  • 搜索


  • 最新文章

    • 导出Excel 格式 mso-number-format
    • 服务器iis支持tls1.2,windows server 2008 r2 中IIS启用TLS 1.2(安装SSL后用TLS 1.2)
    • MySQL配置优化
    • EditPlus 添加文件比较工具winmerge
    • 滚动悬浮固定JS特效

  • 热门文章

    • php sso单点登录实现代码
    • 中国菜刀(China chopper) 最新黑客工具
    • redis.conf中文版(基于2.4)
    • 搜索引擎名单大全
    • php图片上传类,支持加水印,生成略缩图

  • 最新图库


  • 最新评论


  • 友情链接

  • 沙里软件

  • 最近访客

    Powered by ShaliSoft.com 豫ICP备13008529号

    免责声明:本站部分内容来源于互联网,转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责,也不构成任何其他建议。如果发现侵犯版权,联系QQ17905772进行删除。