国内大多数站长可能都在用百度统计。统计的使用方法也很简单,只要在需要统计的页面底部加上统计代码即可。然后打开百度统计的后台,就能看到访客信息,包括入口页面,停留时间,跳出率等等,很是方便。

使用当然是会用,但是随着不断成长,逐渐开始考虑一些事情,比如百度统计只是一行JS怎么就实现统计了呢?如果不打开网页,是不是能利用脚本模拟这一过程呢?

与是就开始上网查资料,开始了新一轮的折腾。网上的研究百度统计的不多,我找到了李鑫博客的原理分析和模拟访问

原理分析

统计代码

首先,百度统计要求网站必须嵌入一段JS代码,大概是长这个样子的。

var _hmt = _hmt || [];

(function() {

var hm = document.createElement("script");

hm.src = "https://hm.baidu.com/hm.js?65e1c6689693082cffb3b7e1f2d8027f";

var s = document.getElementsByTagName("script")[0];

s.parentNode.insertBefore(hm, s);

})();

去除掉多余的代码,得到最重要的一行

https://hm.baidu.com/hm.js?65e1c6689693082cffb3b7e1f2d8027f

即引入这个JS文件就能实现统计了,问题后边的32位字符串就是每个站点特有的统计ID

hm.js做了些什么

该代码加载时,会往用户浏览器中写入名为“HMACCOUNT”的永久cookie,有效期至2038年,以此来区分用户身份。

同时会获取客户端环境,包括浏览器版本,屏幕分辨率,色深,语言等信息。

总结如下:

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.2.30”

发送请求

当获取到所有信息的时候,就可以向服务器提交请求了,将之前获取到的参数进行整合,并以这些参数为后缀请求hm.gif,大概是这样一个地址

https://hm.baidu.com/hm.gif?cc=0&ck=1&cl=24-bit&ds=1440x900&vl=372&ep=7626%2C3009&et=3&fl=29.0&ja=0&ln=zh-cn&lo=0&lt=1524041576&rnd=1839110354&si=65e1c6689693082cffb3b7e1f2d8027f&su=https%3A%2F%2Fyantuz.cn%2F275.html&v=1.2.30&lv=3&sn=28783&u=https%3A%2F%2Fyantuz.cn%2F

模拟访问

既然了解了请求原理,那能不能用脚本实现模拟访问呢?答案当然是可以的

百度统计的4个请求

通过控制台我们可以发现,每访问一个页面都会产生4个请求

加载hm.js

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

退出页面时候,发出一次请求,并传递参数

实际模拟时,只需要前三次请求即可在访问记录中看到访客记录。

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','https://yantuz.cn','yantuz.cn')

a.run()

文章来源:https://zhuanlan.zhihu.com/p/35844509

python模拟seo_百度统计原理分析-利用Python实现模拟访问相关推荐

  1. python爬去百度文库_利用Python语言轻松爬取数据[精品文档]

    利用 Python 语言轻松爬取数据 对于小白来说,爬虫可能是一件非常复杂. 技术门槛很高的事情. 比如有人认为学爬虫必须精通 Python ,然后哼哧哼哧系统学习 Python 的每个知识点,很久之 ...

  2. python爬取百度文库_利用Python语言轻松爬取数据

    利用 Python 语言轻松爬取数据 对于小白来说,爬虫可能是一件非常复杂. 技术门槛很高的事情. 比如有人认为学爬虫必须精通 Python ,然后哼哧哼哧系统学习 Python 的每个知识点,很久之 ...

  3. python模拟访问js_百度统计原理分析-利用PHP/Python实现模拟访问

    国内大多数站长可能都在用百度统计.统计的使用方法也很简单,只要在需要统计的页面底部加上统计代码即可.然后打开百度统计的后台,就能看到访客信息,包括入口页面,停留时间,跳出率等等,很是方便. 使用当然是 ...

  4. python爬百度翻译-Python爬取百度翻译(利用json提取数据)

    本篇文章给大家带来的内容是关于Python爬取百度翻译(利用json提取数据),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 工具:Python 3.6.5.PyCharm开发工具. ...

  5. 利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...

    数据挖掘入门与实战 公众号: datadw 本文讲述如何利用Python模拟淘宝的搜索过程并对搜索结果进行初步的数据可视化分析. 搜索过程的模拟:淘宝的搜索页面有两种形式, 一种形式是, 2019/2 ...

  6. python 数据分析 百度网盘_[百度网盘]利用Python进行数据分析(Python For Data Analysis中文版).pdf - Jan-My31的博客 - 磁力点点...

    利用Python进行数据分析(Python For Data Analysis中文版).pdf - Jan-My31的博客 2018-5-27 · 链接:https://pan.baidu.com/s ...

  7. python单词软件哪个好_利用Python分析背单词软件的惊人真相

    摘要:利用python分析背单词软件,揭秘你不知道的惊人真相 0×00 前言 你想知道背单词软件有大概多少人注册第一天都没有背完嘛 你想知道背单词软件这么火,这么多人在使用,真的有多少人真的在背诵嘛 ...

  8. python实现模拟按键下拉_利用 Python 实现 Windows 下的鼠标键盘模拟

    本来用按键精灵是可以实现我的需求,而且更简单,但既然学python ,就看一下呗. 依赖: pip install PyUserInput PyUserInput 依赖 pyhook,所以还得安装 p ...

  9. python爬取qq好友_利用Python爬取QQ好友空间数据

    程序思路 构造请求链接 先获取所有的好友 获取说说 获取留言 获取个人信息 把数据存到数据库 以上就是整个过程中的大思路,然后在逐步把大思路化解成小的具体的问题去解决.本人对于Python学习创建了一 ...

最新文章

  1. optee系统服务/service的实现方式
  2. 济南电子机械工程学校计算机专业班主任,济南电子机械工程学校庆祝2020年教师节暨表彰大会隆重举行...
  3. OpenCV imgproc分割(segmentation)的实例(附完整代码)
  4. Linux 下打包报错:enospc (no space left on device)
  5. 老男孩linux运维50期
  6. c++ 时间序列工具包_我的时间序列工具包
  7. 定义python函数时如果没有return_定义 Python 函数时,如果函数中没有 return 语句,则默认返回空值 None 。_学小易找答案...
  8. java 开发手机web,手机web app开发笔记
  9. 网易发“暴力裁员”内部说明;京东负责不幸员工的孩子费用到22岁;Linux kernel 5.4发布 | 极客头条...
  10. layui分页完整实例php,使用 layui 后端分页的实例
  11. c语言入门经典必备代码
  12. 三星g9500Android9.0,三星G9550/9500刷机包 V9.0 国行港行通刷 极光设置功能微调 完美ROOT权限 稳定流畅省电...
  13. 计算机教程求和,excel筛选求和的方法步骤图
  14. [Swift]修改NSLayoutConstraint的multiplier
  15. 百度图片时看到一张很眼熟,竟然是自己发的,这收录效率!
  16. 一些实用的功能强大的绘图软件
  17. 关于网络传输中速度达不到很高的原因
  18. winform实现拖曳功能
  19. 人工智能本来是个很简单的事,咋被人们整的这么神秘?
  20. JS二进制和十六进制转换

热门文章

  1. python 为女神编朵玫瑰花的代码,python绘制玫瑰的代码
  2. Python 处理表格进行成绩排序的操作代码
  3. C++新手,用OOP思想编写的推箱子小游戏,请多赐教
  4. Three.js盖房子 点击开关门
  5. STM32H7 USART 时钟初始化
  6. tensorflow——模型的保存和恢复tf.trian.saver()
  7. 搭建一个网站大概需要多少钱
  8. Word第n页显示第一页的页码
  9. AD603+MCP4725+STM32-----自动增益控制电路
  10. 逆向看C++ new申请堆对象的构造,析构函数调用