18910140161

百度统计原理分析 利用PHP/Python实现模拟访问

顺晟科技

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/');

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航