开发者社区> dasein58> 正文

一键分析你的上网行为,看看你平时上网都在干嘛?

简介:   简介   想看看你最近一年都在干嘛?看看你平时上网是在摸鱼还是认真工作?想写年度汇报总结,但是苦于没有数据?现在,它来了。   这是一个能让你了解自己的浏览历史的Chrome浏览历史记录分析程序,当然了,他仅适用于Chrome浏览器或者以Chrome为内核的浏览器。   在该页面中你将可以查看有关自己在过去的时间里所访问浏览的域名、URL以及忙碌天数的前十排名以及相关的数据图表。   部分截图   一键分析你的上网行为,看看你平时上网都在干嘛?
+关注继续查看

  简介

  想看看你最近一年都在干嘛?看看你平时上网是在摸鱼还是认真工作?想写年度汇报总结,但是苦于没有数据?现在,它来了。

  这是一个能让你了解自己的浏览历史的Chrome浏览历史记录分析程序,当然了,他仅适用于Chrome浏览器或者以Chrome为内核的浏览器。

  在该页面中你将可以查看有关自己在过去的时间里所访问浏览的域名、URL以及忙碌天数的前十排名以及相关的数据图表。

  代码思路

  1. 目录结构

  首先,我们先看一下整体目录结构

  Code

  ├─ app_callback.py 回调函数,实现后台功能

  ├─ app_configuration.py web服务器配置

  ├─ app_layout.py web前端页面配置

  ├─ app_plot.py web图表绘制

  ├─ app.py web服务器的启动

  ├─ assets web所需的一些静态资源文件

  │ ├─ css web前端元素布局文件

  │ │ ├─ custum-styles_phyloapp.css

  │ │ └─ stylesheet.css

  │ ├─ image web前端logo图标

  │ │ ├─ GitHub-Mark-Light.png

  │ └─ static web前端帮助页面

  │ │ ├─ help.html

  │ │ └─ help.md

  ├─ history_data.py 解析chrome历史记录文件

  └─ requirement.txt 程序所需依赖库

  app_callback.py该程序基于python,使用dash web轻量级框架进行部署。 app_callback.py 主要用于回调,可以理解为实现后台功能。app_configuration.py顾名思义,对web服务器的一些配置操作。app_layout..pyweb前端页面配置,包含html, css元素。app_plot.py这个主要是为实现一些web前端的图表数据。app.pyweb服务器的启动。assets静态资源目录,用于存储一些我们所需要的静态资源数据。history_data.py通过连接sqlite数据库,并解析Chrome历史记录文件。requirement.txt运行本程序所需要的依赖库。

  2. 解析历史记录文件数据

  与解析历史记录文件数据有关的文件为 history_data.py 文件。我们一一分析。

  # 查询数据库内容

  def query_sqlite_db(history_db, query):

  # 查询sqlite数据库

  # 注意,History是一个文件,没有后缀名。它不是一个目录。

  conn=sqlite3.connect(history_db)

  cursor=conn.cursor()

  # 使用sqlite查看软件,可清晰看到表visits的字段url=表urls的字段id

  # 连接表urls和visits,并获取指定数据

  select_statement=query

  # 执行数据库查询语句

  cursor.execute(select_statement)

  # 获取数据,数据格式为元组(tuple)

  results=cursor.fetchall()

  # 关闭

  cursor.close()

  conn.close()

  return results

  该函数的代码流程为:

  连接sqlite数据库,执行查询语句,返回查询结构,最终关闭数据库连接。

  # 获取排序后的历史数据

  def get_history_data(history_file_path):

  try:

  # 获取数据库内容

  # 数据格式为元组(tuple)

  select_statement="SELECT urls.id, urls.url, urls.title, urls.last_visit_time, urls.visit_count, visits.visit_time, visits.from_visit, visits.transition, visits.visit_duration FROM urls, visits WHERE urls.id=visits.url;"

  result=query_sqlite_db(history_file_path, select_statement)

  # 将结果按第1个元素进行排序

  # sort和sorted内建函数会优先排序第1个元素,然后再排序第2个元素,依此类推

  result_sort=sorted(result, key=lambda x: (x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8]))

  # 返回排序后的数据

  return result_sort

  except:

  # print('读取出错!')

  return 'error'

  该函数的代码流程为:

  设置数据库查询语句 select_statement ,调用 query_sqlite_db() 函数,获取解析后的历史记录文件数据。并对返回后的历史记录数据文件按照不同元素规则进行排序。至此,经过排序的解析后的历史记录数据文件获取成功。

  3. web服务器基本配置

  与web服务器基本配置有关的文件为 app_configuration.py 和 app.py 文件。包括设置web服务器的端口号,访问权限,静态资源目录等。

  4. 前端页面部署

  与前端部署有关的文件为 app_layout.py 和 app_plot.py 以及 assets 目录。

  前端布局主要包括以下几个元素:

  上传历史记录文件组件绘制页面访问次数组件绘制页面访问停留总时间排名组件每日页面访问次数散点图组件某日不同时刻访问次数散点图组件访问次数最多的10个URL组件搜索关键词排名组件搜索引擎使用情况组件

  在 app_layout.py 中, 这些组件的配置大多一样,和平常的html, css配置一样,所以我们仅仅以配置 页面访问次数排名组件 为例子。

  # 页面访问次数排名

  html.Div(

  style={'margin-bottom':'150px'},

  children=[

  html.Div(

  style={'border-top-style':'solid','border-bottom-style':'solid'},

  className='row',

  children=[

  html.Span(

  children='页面访问次数排名, ',

  style={'font-weight': 'bold', 'color':'red'}

  ),

  html.Span(

  children='显示个数:',

  ),

  dcc.Input(

  id='input_website_count_rank',

  type='text',

  value=10,

  style={'margin-top':'10px', 'margin-bottom':'10px'}

  ),

  ]

  ),

  html.Div(

  style={'position': 'relative', 'margin': '0 auto', 'width': '100%', 'padding-bottom': '50%', },

  children=[

  dcc.Loading(

  children=[

  dcc.Graph(

  id='graph_website_count_rank',

  style={'position': 'absolute', 'width': '100%', 'height': '100%', 'top': '0',

  'left': '0', 'bottom': '0', 'right': '0'},

  config={'displayModeBar': False},

  ),

  ],

  type='dot',

  style={'position': 'absolute', 'top': '50%', 'left': '50%', 'transform': 'translate(-50%,-50%)'}

  ),

  ],

  )

  ]

  )

  可以看到,虽然是python编写的,但是只要具备前端经验的人,都可以轻而易举地在此基础上新增或者删除一些元素,所以我们就不详细讲如何使用html和css了。

  在 app_plot.py 中,主要是以绘制图表相关的。使用的是 plotly 库,这是一个用于具有web交互的画图组件库。

  这里以绘制 页面访问频率排名 柱状图 为例子,讲讲如何使用 plotly 库进行绘制。

  # 绘制 页面访问频率排名 柱状图

  def plot_bar_website_count_rank(value, history_data):

  # 频率字典

  dict_data={}

  # 对历史记录文件进行遍历

  for data in history_data:

  url=data[1]

  # 简化url

  key=url_simplification(url)

  if (key in dict_data.keys()):

  dict_data[key] +=1

  else:

  dict_data[key]=0

  # 筛选出前k个频率最高的数据

  k=convert_to_number(value)

  top_10_dict=get_top_k_from_dict(dict_data, k)

  figure=go.Figure(

  data=[

  go.Bar(

  x=[i for i in top_10_dict.keys()],

  y=[i for i in top_10_dict.values()],

  name='bar',

  marker=go.bar.Marker(

  color='rgb(55, 83, 109)'

  )

  )

  ],

  layout=go.Layout(

  showlegend=False,

  margin=go.layout.Margin(l=40, r=0, t=40, b=30),

  paper_bgcolor='rgba(0,0,0,0)',

  plot_bgcolor='rgba(0,0,0,0)',

  xaxis=dict(title='网站'),

  yaxis=dict(title='次数')

  )

  )

  return figure

  该函数的代码流程为:

  首先,对解析完数据库文件后返回的 history_data 进行遍历,获得 url 数据,并调用 url_simplification(url) 对齐进行简化。接着,依次将 简化后的富贵url 存入字典中。调用 get_top_k_from_dict(dict_data, k) ,从字典 dict_data 中获取前 k 个最大值的数据。接着,开始绘制柱状图了。使用 go.Bar() 绘制柱状图,其中, x 和 y 代表的是属性和属性对应的数值,为 list 格式 。 xaxis 和 yaxis`分别设置相应坐标轴的标题返回一个 figure 对象,以便于传输给前端。

  而 assets 目录下包含的数据为 image 和 css ,都是用于前端布局。

  5. 后台部署

  与后台部署有关的文件为 app_callback.py 文件。这个文件使用回调的方式对前端页面布局进行更新。

  首先,我们看看关于 页面访问频率排名 的回调函数:

  # 页面访问频率排名

  @app.callback(

  dash.dependencies.Output('graph_website_count_rank', 'figure'),

  [

  dash.dependencies.Input('input_website_count_rank', 'value'),

  dash.dependencies.Input('store_memory_history_data', 'data')

  ]

  )

  def update(value, store_memory_history_data):

  # 正确获取到历史记录文件

  if store_memory_history_data:

  history_data=store_memory_history_data['history_data']

  figure=plot_bar_website_count_rank(value, history_data)

  return figure

  else:

  # 取消更新页面数据

  raise dash.exceptions.PreventUpdate("cancel the callback")

  该函数的代码流程为:

  首先确定好输入是什么(触发回调的数据),输出是什么(回调输出的数据),需要带上什么数据。 dash.dependencies.Input 指的是触发回调的数据,而 dash.dependencies.Input('input_website_count_rank', 'value') 表示当 id 为 input_website_count_rank 的组件的 value 发生改变时,会触发这个回调。而该回调经过 update(value, store_memory_history_data) 的结果会输出到 id 为 graph_website_count_rank 的 value ,通俗来讲,就是改变它的值。对于 def update(value, store_memory_history_data) 的解析。首先是判断输入数据 store_memory_history_data 是否不为空对象,接着读取历史记录文件 history_data,接着调用刚才所说的 app_plot.py 文件中的 plot_bar_website_count_rank() ,返回一个 figure 对象,并将这个对象返回到前端。至此,前端页面的布局就会显示出 页面访问频率排名 的图表了。

  还有一个需要说的就是关于上次文件的过程,这里我们先贴出代码:

  # 上传文件回调

  @app.callback(

  dash.dependencies.Output('store_memory_history_data', 'data'),

  [

  dash.dependencies.Input('dcc_upload_file', 'contents')

  ]

  )

  def update(contents):

  if contents is not None:

  # 接收base64编码的数据

  content_type, content_string=contents.split(',')

  # 将客户端上传的文件进行base64解码

  decoded=base64.b64decode(content_string)

  # 为客户端上传的文件添加后缀,防止文件重复覆盖

  # 以下方式确保文件名不重复

  suffix=[str(random.randint(0,100)) for i in range(10)]

  suffix="".join(suffix)

  suffix=suffix + str(int(time.time()))

  # 最终的文件名

  file_name='History_' + suffix

  # print(file_name)

  # 创建存放文件的目录

  if (not (exists('data'))):

  makedirs('data')

  # 欲写入的文件路径

  path='data' + '/' + file_name

  # 写入本地磁盘文件

  with open(file=path, mode='wb+') as f:

  f.write(decoded)

  # 使用sqlite读取本地磁盘文件

  # 获取历史记录数据

  history_data=get_history_data(path)

  # 获取搜索关键词数据

  search_word=get_search_word(path)

  # 判断读取到的数据是否正确

  if (history_data !='error'):

  # 找到

  date_time=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

  print('新接收到一条客户端的数据, 数据正确, 时间:{}'.format(date_time))

  store_data={'history_data': history_data, 'search_word': search_word}

  return store_data

  else:

  # 没找到

  date_time=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

  print('新接收到一条客户端的数据, 数据错误, 时间:{}'.format(date_time))

  return None

  return None

  该函数的代码流程为:

  contents

  None

  如何运行

  在线演示程序: 39.106.118.77:8090 (普通服务器,勿测压)

  运行本程序十分简单,只需要按照以下命令即可运行:

  # 跳转到当前目录

  cd 目录名

  # 先卸载依赖库

  pip uninstall -y -r requirement.txt

  # 再重新安装依赖库

  pip install -r requirement.txt

  # 开始运行

  python app.py

  # 运行成功后,通过浏览器打开localhost:8090

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
18443 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
18917 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
12637 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
32362 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14000 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
12895 0
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
34095 0
+关注
919
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载