顺晟科技
2021-06-16 10:58:11
600
国内大部分站长可能会用百度统计。统计的使用也很简单,只要在需要统计的页面底部添加统计代码就可以了。然后打开百度统计的后台,可以看到访客信息,包括进入页面,停留时间,跳转率等等,非常方便。
当然会用,但是随着成长,逐渐开始考虑一些事情。比如百度统计只是JS的一行,那么统计怎么实现呢?如果不打开网页,可以用脚本模拟这个过程吗?
我开始在网上搜索信息,开始了新一轮的折腾。网上研究百度统计的不多。发现了李新博客的原理分析和模拟访问
原理分析
统计代码
首先百度统计要求网站嵌入一段JS代码,看起来是这样的。
var _ HMT=_ HMT | |[];
(function() {
var hm=document . CreateElement(' script ');
hm . src=' https://hm . Baidu.com/hm . js?65e 1c 6689693082 CFF B3 b 7e 1c 2d 8027 f ';
var s=document . GetElementsBytagName(' script ')[0];
s.parentNode.insertBefore(hm,s);
})();
去掉多余的代码,得到最重要的一行
https://hm.baidu.com/hm.js?65e 1c 6689693082 CFF B3 b 7e 1c 2d 8027 f
也就是统计可以通过引入这个JS文件来实现,问题后面的32位字符串就是每个站点的统计ID
hm.js做了什么
加载代码时,会在用户浏览器中写入一个名为“HMACCOUNT”的cookie,有效期到2038年,以此来区分用户的身份。
同时会获得客户端环境,包括浏览器版本、屏幕分辨率、色深、语言等信息。
总结如下:
Cc:不知道,一般1
cf:url参数hmsr的值
Ci:url参数hmci的url值
ck:支持cookie 1:0吗
Cl:颜色深度为“32位”
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: date time.time(),如“1327847756”,不是次请求
Nv:不知道,一般是1或者0
Rnd:十位数随机数
Sb:如果是360se浏览器,这个值等于' 17 '
Se:与搜索引擎有关
Si:统计代码id
st:
Su:上一页文档. referrer
Sw:不知道,估计和搜索引擎有关,一般都是空的
Sse:不知道,估计和搜索引擎有关,一般都是空的
v:统计代码的版本,当前值为“1.2.30”
即时战略游戏
当所有的信息都获得后,你可以向服务器提交一个请求,整合之前获得的参数,以这些参数作为后缀请求hm.gif,大概就是这样一个地址
https://hm.baidu.com/hm.gif?cc=0ck=1cl=24-bitds=1440 x 900 VL=372 EP=7626,3009 et=3fl=29.0 ja=0ln=zh-cnlo=0lt=1524041576 rnd=1839110354 si=65 E1 c 668969308 2cff B3 b 7 E1 f2d 8027 FSU=https://oicqzone.com/275 HTC。
模拟访问
既然知道了请求的原理,是否可以用脚本实现模拟访问?答案当然是肯定的
百度统计四问
通过控制台,我们可以发现每次访问一个页面都会产生4个请求
百度统计原理分析——用PHP/Python实现模拟访问
加载hm.js
加载完成后,启动两个请求并传递参数
当您退出页面时,发出请求并传递参数
在实际模拟中,只需要前三个请求就可以看到访问记录中的访问者记录。
Python模拟访问
导入urllib2
导入urllib
随机导入
导入数学
导入urlparse
导入时间
导入cookielib
########################################################################
Baidu:类
''''''
refer=' 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(兼容;MSIE 9.0Windows NT 6.1Trident/5.0)' #IE9
MyData={'cc':'1 ',' ck':'1 ',' cl':'32位,' ds':'1024x768 ',' et':'0 ',' ep':'0 ',' fl':'11.0 ',' ja':'1 ',' ln':'zh-cn ',' lo':'0 ',' nv':
# -
def __init__(self,baiduID,targetPage=None,refer Page=None):
''构造函数'''
自我。目标页面=目标页面或自身目标页面
自我参考=参考页面或自我.推荐人
自我BaiduID=baiduID
自我MyData['si']=self .BaiduID
自我MyData['su']=urllib.quote(self .推荐人)
及格
def run(self,timeout=5):
cj=cookielib .CookieJar()
open er=urllib 2。build _ open er(urllib 2 .httpookieprocessor(CJ))
opener.addheaders=[('Referer ',self .目标页面),("用户代理",自己用户代理)]
try:
response=open或。开放(自我.Hjs self .BaiduID).信息()
自我my DATa[' rnd ']=int(random。random()* 2147483647)
自我MyData['lt']=int(time.time())
fullurl=self .Hgif urllib.urlencode(self .MyData)
响应2=开路或。打开(完整网址,超时=超时).信息()
自我my DATa[' rnd ']=int(random。random()* 2147483647)
自我MyData['et']='3 '
自我MyData['ep']='2000,100 '
响应3=打开。开放(自我.Hgif urllib.urlencode(self .MyData),超时=超时)。信息()
及格
除了urllib2 .HTTPError,ex:
打印ex .代码
及格
除了urllib2 .URLError,ex:
打印原因
及格
及格
if __name__=='__main__':
a=百度('百度统计id ',' https://oicqzone.com ',' oicqzone.com ')
a.run()
服务器端编程语言(专业超文本预处理器的缩写)模拟访问
函数baiduVisit($bdId,$targetUrl,$ refer=' oicqzone.com ',$ VisItimes=1){
$bdjs='https://hm.baidu.com/hm.js '?
$ bdgif=' https://hm。百度。com/hm。gif?
//$ BDid=' 65e 1c 6689693082 CFF B3 B7 E1 f2d 8027 f ';
$ arr=数组(
cc'='0 ',
ck'='1 ',
cl'='24位,
ds'='1440x900 ',
vl'='747 ',
#'ep'='6346,2301 ',#时间
et'='0 ',#3
fl'='29.0 ',
ja'='0 ',
' ln'='zh-cn ',
lo'='0 ',
lt'=time(),
rnd '=rand(100000000000,200000000),#random
si'=$bdId,
v'='1.2.30 ',
lv'='3 ',
sn'='25573 ',#25581
su '=$ referer,#请求来源
#'ct'='!',
#'tt'='页面标题'
);
//echo http _ build _ query($ arr);
//创建流
$opts=array(
http'=array(
方法='GET ',
标头='Accept-language: cn\r\n 'referer: $ targetUrl ',
超时'=3,
)
);
$ context=stream _ context _ create($ opts);
$url1=$bdjs .$ bdId
//echo $url1 .br/';
$arr1=array_merge($arr,array('ep'='2302,153 ',' u '=$ referer
$ arr 1[' et ']=3;
$ url2=$ bdgif。http _ build _ query($ arr 1);
//echo $url2 .br/';
$arr2=array_merge($arr,array('ct'='!',' TT'='标题');
$ URL 3=$ bdgif。http _ build _ query($ arr 2);
//echo $url3 .br/';
for($ x=0;$ x $ VisItimes $ x){
file_get_contents($url1,false,$ context);
file_get_contents($url2,false,$ context);
file_get_contents($url3,false,$ context);
//echo $ x;
}
}
' baiduVisit('百度ID ',' https://oicqzone。com/');
08
1972-02
17
2022-03
03
2021-08
16
2021-06
16
2021-06
16
2021-06