百度统计原理分析2-模拟访问请求

上篇文章百度统计的js脚本原理分析 简单的讲了百度统计js代码的参数和与服务器通信的大致过程。这次要通过程序来模拟这一过程。

        首先,使用Wireshark(一款网络抓包工具)对浏览器实际的过程进行捕获。首先是使用ie打开一个有超链接链接到我的(lixin.me)博客的网站,点击链接到达我的博客,加载完毕后关闭浏览器。最后在Wireshark上得到这么的网络数据包。

http://hm.baidu.com/h.js?3266e9d3684e7a1307dc7c4b4a64b0ae

http://hm.baidu.com/hm.gif?cc=1&ck=1&cl=32-bit&ds=1366x768&ep=0&et=0&fl=11.0&ja=1&ln=zh-cn&lo=0&lt=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=1366x768&ep=7289%2C115&et=3&fl=11.0&ja=1&ln=zh-cn&lo=0&lt=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=1366x768&ep=212486%2C4614&et=3&fl=11.0&ja=1&ln=zh-cn&lo=0&lt=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.lixin.me'
    TargetPage='/www.lixin.me'
    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.lixin.me/blog/test4','www.lixin.com.cn')
    a.run()
    

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

        如果你是别有用心的程序员或者博主,是不是窥探出利用价值了呢?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值