谈谈个人网站的建立(四)—— 日志系统的建立

news/2024/5/13 21:58:53/文章来源:https://blog.csdn.net/weixin_30537391/article/details/98171890

谈谈个人网站的建立(四)—— 日志系统的建立

欢迎访问我的网站http://www.wenzhihuai.com/ 。感谢,如果可以,希望能在GitHub上给个star,GitHub地址https://github.com/Zephery/newblog 。

建立网站少不了日志系统,用来查看网站的访问次数、停留时间、抓取量、目录抓取统计、页面抓取统计等,其中,最常用的方法还是使用ELK,但是,本网站的服务器配置实在太低了(1GHZ、2G内存),压根就跑不起ELK,所以只能寻求其他方式,目前最常用的有百度统计和友盟,这里,本人使用的是百度统计,提供了API给开发者使用,能够将自己所需要的图表移植到自己的网站上。日志是网站及其重要的文件,通过对日志进行统计、分析、综合,就能有效地掌握网站运行状况,发现和排除错误原因,了解客户访问分布等,更好的加强系统的维护和管理。下面是我的百度统计的概览页面:

300

企业级的网站日志不能公开,但是我的是个人网站,用来跟大家一起学习的,所以,需要将百度的统计页面展示出来,但是,百度并不提供日志的图像,只提供API给开发者调用,而且还限制访问次数,一天不能超过2000次,这个对于实时统计来说,确实不够,所以只能展示前几天的访问统计。这里的日志系统分为三个步骤:1.API获取数据;2.存储数据;3.展示数据。页面效果如下,也可以点开我的网站的日志系统:

20170918090524.png

20170918090534.png

20170918090546.png

百度统计提供了Tongji API的Java和Python版本,这两个版本及其复杂,可用性极低,所以,本人用Python写了个及其简单的通用版本,整体只有28行,代码在这,https://github.com/Zephery/baidutongji。下面是具体过程

1.网站代码安装

先在百度统计中注册登录之后,进入管理页面,新增网站,然后在代码管理中获取安装代码,大部分人的代码都是类似的,除了hm.js?后面的参数,是记录该网站的唯一标识。

<script>
var _hmt = _hmt || [];
(function() {var hm = document.createElement("script");hm.src = "https://hm.baidu.com/hm.js?code";var s = document.getElementsByTagName("script")[0];s.parentNode.insertBefore(hm, s);
})();
</script>

同时,需要在申请其他设置->数据导出服务中开通数据导出服务,百度统计Tongji API可以为网站接入者提供便捷的获取网站流量数据的通道。

20170919090557.png

至此,我们获得了username、password、token,然后开始使用三个参数来获取数据。

2.根据API获取数据

官网的API详细的记录了接口的参数以及解释,
链接:https://api.baidu.com/json/tongji/v1/ReportService/getData,详细的官方报告请访问官网TongjiApi
所需参数(必须):

参数名称参数类型描述
methodstring要查询的报告
start_datestring查询起始时间
end_datestring查询结束时间
metricsstring自定义指标

其中,参数start_date和end_date的规定为:yyyyMMdd,这里我们使用python的原生库,datetime、time,获取昨天的时间以及前七天的日期。

today = datetime.date.today()   # 获取今天的日期
yesterday = today - datetime.timedelta(days=1) # 获取昨天的日期
fifteenago = today - datetime.timedelta(days=7) # 获取前七天的日期
end, start = str(yesterday).replace("-", ""), str(fifteenago).replace("-", "")  # 格式化成yyyyMMdd格式

3.构建请求

说明:siteId可以根据个人百度统计的链接获取,也可以使用Tongji API的第一个接口列表获取用户的站点列表。首先,我们构建一个类,由于username、password、token都是通用的,所以我们将它设置为构造方法的参数。

class Baidu(object):def __init__(self, siteId, username, password, token):self.siteId = siteIdself.username = usernameself.password = passwordself.token = token

然后构建一个共同的方法,用来获取提交数据之后返回的结果,其中提供了4个可变参数,分别是(start_date:起始日期,end_date:结束日期,method:方法,metrics:指标),返回的是字节,最后需要decode("utf-8")一下变成字符:

def getresult(self, start_date, end_date, method, metrics):body = {"header": {"account_type": 1, "password": self.password, "token": self.token,"username": self.username},"body": {"siteId": self.siteId, "method": method, "start_date": start_date,"end_date": end_date,"metrics": metrics}}data = bytes(json.dumps(body), 'utf8')req = urllib.request.Request(base_url, data)response = urllib.request.urlopen(req)the_page = response.read()return the_page.decode("utf-8")

至此,python获取百度统计的过程基本就没了,没错,就是那么简简单单的几行,完整代码见https://github.com/Zephery/baidutongji/blob/master/baidu.py,但是,想要实现获取各种数据,仍需要做很多工作。

4.实际运用

(1)需要使用其他参数怎么办

20170919091911.png

python中提供了个可变参数来解决这一烦恼,详细请看http://www.jianshu.com/p/98f7e34845b5,可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple,而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

def getresult(self, start_date, end_date, method, metrics, **kw):base_url = "https://api.baidu.com/json/tongji/v1/ReportService/getData"body = {"header": {"account_type": 1, "password": self.password, "token": self.token,"username": self.username},"body": {"siteId": self.siteId, "method": method, "start_date": start_date,"end_date": end_date, "metrics": metrics}}for key in kw:  #对可变参数进行遍历,如果有的话就往body中加入body['body'][key] = kw[key]

使用方式:

result = self.getresult(start, end, "source/all/a","pv_count,visitor_count,avg_visit_time", viewType='visitor')  #其中viewTYpe便是可变参数

(2)获取的数据如何解析
百度统计返回的结果比较简洁而又反人类,以获取概览中的pv_count,visitor_count,ip_count,bounce_ratio,avg_visit_time为例子:

result = bd.getresult(start, end, "overview/getTimeTrendRpt","pv_count,visitor_count,ip_count,bounce_ratio,avg_visit_time")

返回的结果是:

[[['2017/09/12'], ['2017/09/13'], ['2017/09/14'], ['2017/09/15'], ['2017/09/16'], ['2017/09/17'], ['2017/09/18']],   
[[422, 76, 76, 41.94, 221],  [284, 67, 65, 50.63, 215],   [67, 23, 22, 52.17, 153],   [104, 13, 13, 36.36, 243],   [13, 4, 4, 33.33, 66],   [73, 7, 6, 37.5, 652],  [63, 11, 11, 33.33, 385]  ], [], []]

即:翻译成人话就是:

[[[date1,date2,...]], [[date1的pv_count, date1的visitor_count, date1的ip_count, date1的bounce_ratio, date1的avg_visit_time],[date2的pv_count, date2的visitor_count, date2的ip_count, date2的bounce_ratio, date2的avg_visit_time],...,[]],[],[]]

极其反人类的设计。还好用的python,python数组的特性实在太强了。出了可以运用[x for x in range]这类语法之外,还能与三元符(x if y else x+1,如果y成立,那么结果是x,如果y不成立,那么结果是x+1)一起使用,这里注意:如果当天访问量为0,其返回的json结果是'--',所以要判断是不是为'--',归0化,才能在折线图等各种图上显示。下面是pv_count的例子:

pv_count = [x[0] if x[0] != '--' else 0 for x in result[1]]

(3)每周限制2000次
在开通数据导出服务的时候,不知道大家有没有注意到它的说明,即我们是不能实时监控的,只能将它放在临时数据库中,这里我们选择了Redis,并在centos里定义一个定时任务,每天全部更新一次即可。

20170919092505.png

python中redis的使用方法很简单,连接跟mysql类似:

# 字符串
pool = redis.ConnectionPool(host='your host ip', port=port, password='your auth')  # TODO redis地址
r = redis.Redis(connection_pool=pool)

本网站使用redis的数据结构只有set,方法也很简单,就是定义一个key,然后value是数组的字符串获取json。

ip_count = [x[2] if x[2] != '--' else 0 for x in result[1]]
r.set("ip_count", ip_count)
# json
name = [item[0]['name'] for item in data[0]]
count = 0
tojson = []
for item in data[1]:temp = {}temp["name"] = name[count]temp["pv_count"] = item[0]temp["visitor_count"] = item[1]temp["average_stay_time"] = item[2]tojson.append(temp)count = count + 1
r.set("rukouyemian", json.dumps(tojson[:5]))

5.基本代码

下面是基本的使用代码,完整的使用代码就不贴了,有兴趣可以去我的github上看看,完整代码,希望能给个star哈哈哈,感谢

import json
import time
import datetime
import urllib.parse
import urllib.requestbase_url = "https://api.baidu.com/json/tongji/v1/ReportService/getData"class Baidu(object):def __init__(self, siteId, username, password, token):self.siteId = siteIdself.username = usernameself.password = passwordself.token = tokendef getresult(self, start_date, end_date, method, metrics, **kw):base_url = "https://api.baidu.com/json/tongji/v1/ReportService/getData"body = {"header": {"account_type": 1, "password": self.password, "token": self.token,"username": self.username},"body": {"siteId": self.siteId, "method": method, "start_date": start_date,"end_date": end_date, "metrics": metrics}}for key in kw:body['body'][key] = kw[key]data = bytes(json.dumps(body), 'utf8')req = urllib.request.Request(base_url, data)response = urllib.request.urlopen(req)the_page = response.read()return the_page.decode("utf-8")if __name__ == '__main__':# 日期开始today = datetime.date.today()yesterday = today - datetime.timedelta(days=1)fifteenago = today - datetime.timedelta(days=7)end, start = str(yesterday).replace("-", ""), str(fifteenago).replace("-", "")# 日期结束bd = Baidu(yoursiteid, "username", "password", "token")result = bd.getresult(start, end, "overview/getTimeTrendRpt","pv_count,visitor_count,ip_count,bounce_ratio,avg_visit_time")result = json.loads(result)base = result["body"]["data"][0]["result"]["items"]print(base)

6.展示数据

在将数据存进redis中之后,我们需要在博客中使用这些数据来制作图表。在newblog中使用方式也很简单,大概就是使用jedis读取数据,然后使用echarts或者highcharts展示。其中折线图以及线型图我都使用了highcharts,确实比echarts好看的多,但是地域图还是选择了echarts,毕竟中国的产品还是对中国的支持较好。
(1)PV、UV折线图
以图表PV、UV为例,由于存储进redis的是一个数组,所以,可以直接从redis中读取然后放到一个attribute里即可:

String pv_count = jedis.get("pv_count");
String visitor_count = jedis.get("visitor_count");
mv.addObject("pv_count", pv_count);
mv.addObject("visitor_count", visitor_count);

jsp中的使用如下:

<div class="panel-heading" style="background-color: rgba(187,255,255,0.7)"><div class="card-title"><strong>PV和UV折线图</strong></div></div><div class="panel-body"><div id="linecontainer" style="width: auto;height: 330px"></div><script>var chart = new Highcharts.Chart('linecontainer', {title: {text: null},credits: {enabled: false},xAxis: {categories: ${daterange}},yAxis: {title: {text: '次数'},plotLines: [{value: 0,width: 1,color: '#808080'}]},tooltip: {valueSuffix: '次'},legend: {borderWidth: 0,align: "center", //程度标的目标地位verticalAlign: "top", //垂直标的目标地位x: 0, //间隔x轴的间隔y: 0 //间隔Y轴的间隔},series: [{name: 'pv',data:${pv_count}}, {name: 'uv',data:${visitor_count}}]})</script>

效果如下:

20170919012925.png

(2)地域访问量
在python代码中先获取地域的数据,其结果如下,百度统计跟echarts都是百度的,果然,自家人对自己人的支持真是特别友好的。

[{'pv_count': 649, 'pv_ratio': 7, 'visitor_count': 2684, 'name': '广东'}, {'pv_count': 2, 'pv_ratio': 2, 'visitor_count': 76, 'name': '四川'}, {'pv_count': 1, 'pv_ratio': 1, 'visitor_count': 3, 'name': '江苏'}]

地域图目前支持最好的还是百度的echarts,使用方法见echarts的官网吧,这里不再阐述,展示地域图的时候需要获取下载两个文件,china.js(其提供了js和json,这里使用的js),echarts.js。
部分代码:

<script type="text/javascript">var myChart = echarts.init(document.getElementById('diyu'));option = {tooltip: {trigger: 'item'},legend: {orient: 'vertical',left: 'left'},visualMap: {min: 0,max:${diyumax},left: 'left',top: 'bottom',text: ['高', '低'],           // 文本,默认为数值文本calculable: true},toolbox: {show: true,orient: 'vertical',left: 'right',top: 'center',feature: {dataView: {readOnly: false},restore: {},saveAsImage: {}}},series: [{name: '访问量',type: 'map',mapType: 'china',roam: false,label: {normal: {show: true},emphasis: {show: true}},data: [<c:forEach var="diyu" items="${diyu}">{name: '${diyu.name}', value: ${to.pv_count}},</c:forEach>]}]};myChart.setOption(option);
</script>

结果如下:
echartsfawe.png

结语

网上关于日志系统的几乎都是ELK,对于小网站的,隐私不是很重要的还是可以用用百度统计的,这套系统也折磨了我挺久的,特别是它那反人类的返回数据。期初本来是想使用百度统计的,后来考虑了一下ELK,尝试之后发现,服务器配置跑不起来,还是安安稳稳的使用了百度统计,于此做成了这个系统,美观度还是不高,颜色需要优化一下。最后,希望能在GitHub上给我个star吧。
日志系统地址:http://www.wenzhihuai.com/log.html
个人网站网址:http://www.wenzhihuai.com
个人网站代码地址:https://github.com/Zephery/newblog
百度统计python代码地址:https://github.com/Zephery/baidutongji
万分感谢

转载于:https://www.cnblogs.com/w1570631036/p/7551311.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_745923.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转:在网站开发中很有用的8个 jQuery 效果【附源码】

原文地址&#xff1a;http://www.cnblogs.com/lhb25/p/amazing-jquery-effects.html   jQuery 作为最优秀 JavaScript 库之一&#xff0c;改变了很多人编写 JavaScript 的方式。它简化了 HTML 文档遍历&#xff0c;事件处理&#xff0c;动画和 Ajax 交互&#xff0c;而且有成…

mflac格式解密_免费的在线音视频格式转换网站汇总

1、.mov转换为.mp4.mov是QuickTime影片格式&#xff0c;是Apple公司开发的一种音频、视频文件格式。我们只需要iMovie打开相关文件&#xff0c;然后重新导出即可&#xff0c;iMovie默认导出的视频格式就是.mp42、.mp4转换为.gifconvertio&#xff1a;https://convertio.co/zh/m…

为什么wamp 放两个网站 或者多个网站就很卡很慢,问题在这里

PHP的配置比较简单&#xff0c;只需要进行一些基本设置的修改就可以了&#xff0c;依次点击—PHP—php.ini&#xff0c;找到这三个地方&#xff1a;short_open_tag Off&#xff08;是否允许使用 PHP 代码开始标志的缩写形式&#xff08;<? ?> &#xff09;。&#xff…

基于Linux搭建Apache网站服务配置详解

Apache作为一款开源软件&#xff0c;是广泛应用的web应用之一&#xff0c;Apache有两个主要版本1.X和2.X&#xff0c;一般我们使用2.X版本&#xff0c;比起1.X版本它支持很多新的功能&#xff0c;下载Apache源码包的地址为&#xff1a;https://httpd.apache.org &#xff0c;下…

SEO深度解读之HITS链接分析算法

HITS(Hyperlink - Induced Topic Search)链接分析算法诞生在1997年&#xff0c;该算法是由康奈尔大学中的一位博士提出&#xff0c;并且该算法沿用于全球多个搜索引擎当中。当然&#xff0c;不同的搜索引擎针对于该算法的侧重点和内部公式都有不一的算法结构调整&#xff0c;并…

asp.net 2.0多语言网站解决方案

asp.net 2.0中的App_GlobalResources可以用来解决本地化的问题&#xff0c;程序会根据浏览器的语言首选项自动判断显示出本地化的界面。首先在App_GlobalResources新建resx资源文件。如&#xff1a; 不同语言的resx中项目应该具有相同的名称&#xff1a;asp.net 2.0中的App_Glo…

获取实时天气的网站

中国万年历 获取天气的接口&#xff1a;&#xff08;1&#xff09;通过城市名称获取天气数据&#xff1a;http://wthrcdn.etouch.cn/weather_mini?city嘉定 &#xff08;2&#xff09;通过城市代码获取天气数据&#xff1a;http://wthrcdn.etouch.cn/weather_mini?citykey101…

axure 8 表格合并_Axure 免费建个网站

前言Axure 是产品经理们耳熟能详的原型工具&#xff0c;用来画原型写文档&#xff0c;实在不要太方便&#xff1b;但是大部分人不知道Axure更为强大的一面...Axure在日常分享时&#xff0c;可以导出html文件包&#xff0c;别人可以直接打开html文件预览原型&#xff0c;那么其实…

laravel 分词搜索匹配度_巧用分词算法布局关键词SEO技巧分享

在自然语言处理技术中&#xff0c;许多西文的处理方法中文不能直接采用&#xff0c;就是因为中文需要有分词这道工序。而搜索引擎的分词简单的理解&#xff0c;就是把搜索语句分成若干个互相独立、完整、正确的单词&#xff0c;然后在理解每个单词意思的基础上&#xff0c;根据…

google搜索引擎优化指南_搜索引擎优化指南,SEO人员:5个“最”关心的问题

如何提高ROI&#xff0c;SEO投资回报率&#xff0c;是每个SEO主管都需要考量的问题&#xff0c;为了更好的解决这个问题&#xff0c;定期审查SEO诊断报告&#xff0c;并发现与解决其中的问题&#xff0c;很有必要。 蝙蝠侠IT&#xff0c;将通过如下内容&#xff0c;与大家分享其…

前端电脑和浏览器分辨率不同_响应式网站前端设计你了解嘛?

尽管中国的搜索引擎技术还不是很成熟&#xff0c;百度建议移动站和pc网站应该分开。然而&#xff0c;随着技术的发展&#xff0c;响应性网站在未来将会像谷歌一样被认可。毕竟&#xff0c;它更方便&#xff0c;节省了资源和时间成本。以下是我的一些经验&#xff1a;1.使用em和…

360P2建html网站,360 P2路由器管理密码_默认密码是多少?-192路由网

问&#xff1a;360安全路由P2的管理密码是多少&#xff1f;我家里用的是360的安全路由P2&#xff0c;今天重新设置wifi密码时&#xff0c;打开设置界面后。提示需要输入一个管理密码&#xff0c;否则进不去设置界面。现在的问题是&#xff0c;我不记得这个管理密码是多少了&…

毕业生查重必备!!论文降重小技巧 + 查重网站哪家强

我们学校有三次查重机会&#xff0c;所以第一次我头一热没有自己降重&#xff0c;就直接上传了。重复率44%&#xff0c;所以在多数人不需要担心是否在30%以内时&#xff0c;我就很惴惴不安&#xff0c;要努力降重&#xff01;以下就介绍了我写论文的降重方法和查重网站的使用。…

SQL Server练习网站(流程图)

1.SQL Sever 教程版本1&#xff08;概念&#xff09; https://www.w3school.com.cn/sql/sql_alter.asp 2.SQL Sever 教程版本2&#xff08;概念&#xff09; https://www.w3cschool.cn/sql/8zragfoj.html 3.SQL Server教程和在线联系 https://www.liaoxuefeng.com/wiki/1177…

国外项目外包网站接活流程(新手上路版)

关于国外干私活网站的基本运作模式其实已经在Freelance marketplace(外包平台)概要 这篇文章中做过介绍了&#xff0c;不过并不是很详细&#xff0c;所以这里再转载一篇相关的说明性文章&#xff0c;为刚接触这类平台的新手们服务下。什么是freelance? 翻译成中文&#xff0c;…

Session显示网站当前在线人数

一、原理&#xff1a; 简单实现人数统计&#xff0c;也就是对session实现监听&#xff0c;用户访问就创建一个session将计数器1&#xff0c;销毁一个session就将计数器-1。如果是直接访问html那么就必须在servlet中写入request.getSession(true);来创建session对象&#xff0c;…

大型网站架构系列:消息队列(二)

大型网站架构系列&#xff1a;消息队列&#xff08;二&#xff09; 原文:大型网站架构系列&#xff1a;消息队列&#xff08;二&#xff09;本文是大型网站架构系列&#xff1a;消息队列&#xff08;二&#xff09;&#xff0c;主要分享JMS消息服务&#xff0c;常用消息中间件&…

网站根目录的问题

今天在做学习挑战杯的项目的时候&#xff0c;侧边的Layout图片始终出不来&#xff0c;晚上看了好久才发现是最基础的根目录的问题&#xff0c;在vs里面操作之前是直接把图片拉出来&#xff0c;这样子图片就可以直接显示了&#xff0c;但是今天不行。很纳闷呀。 就是这样的显示不…

网站建设教程之PageAdmin建站系统的安装

PageAdmin建站系统最大的特点就是扩展灵活&#xff0c;加上可以免费下载&#xff0c;没有版权信息&#xff0c;国内拥有很多用户&#xff0c;很多中小网站制作公司也采用这款系统来给自己的客户做网站&#xff0c;在此&#xff0c;以本文作为引子&#xff0c;但愿可以把大家带入…

网站后台没有提示声怎么办_收藏 | 没有 PS 怎么办?10个在线作图网站,轻松搞定图片设计...

求职技巧 | 职业技能 | 通关考试&#xff0c;关注公众号&#xff1a;职域goPhotoshop 已经成为大多数工作需要用到的工具&#xff0c;很多时候我们都要用到它来满足一些简单的排版、图片处理、尺寸调整或者是做一些简单的效果。但很多时候&#xff0c;我们手上会因为没有 Photo…