基于python分析你的上网行为 看看你平时上网都在干嘛

简介

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

这是一个能让你了解自己的浏览历史的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..py

web前端页面配置,包含html, css元素。

  • app_plot.py

这个主要是为实现一些web前端的图表数据。

  • app.py

web服务器的启动。

  • 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

该函数的代码流程为:

  1. 首先,对解析完数据库文件后返回的history_data进行遍历,获得url数据,并调用url_simplification(url)对齐进行简化。接着,依次将简化后的url存入字典中。
  2. 调用get_top_k_from_dict(dict_data, k),从字典dict_data中获取前k个最大值的数据。
  3. 接着,开始绘制柱状图了。使用go.Bar()绘制柱状图,其中,x和y代表的是属性和属性对应的数值,为list格式。xaxis和yaxis`分别设置相应坐标轴的标题
  4. 返回一个figure对象,以便于传输给前端。
  5. 而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是否不为空,接着将客户端上传的文件进行base64解码。并且,为客户端上传的文件添加后缀,防止文件重复覆盖,最终将客户端上传的文件写入本地磁盘文件。
写入完毕后,使用sqlite读取本地磁盘文件,若读取正确,则返回解析后的数据,否则返回None

如何运行

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

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

# 跳转到当前目录
cd 目录名
# 先卸载依赖库
pip uninstall -y -r requirement.txt
# 再重新安装依赖库
pip install -r requirement.txt
# 开始运行
python app.py
# 运行成功后,通过浏览器打开http://localhost:8090

补充

完整版源代码存放在github上,有需要的可以下载

项目持续更新,欢迎您star本项目

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python学习笔记之文件的读写操作实例分析

    本文实例讲述了Python文件的读写操作.分享给大家供大家参考,具体如下: 读写文件 读取文件 f = open('my_path/my_file.txt', 'r') # open方法会返回文件对象 file_data = f.read() # 通过read方法获取数据 f.close() # 关闭该文件 首先使用内置函数 open 打开文件.需要文件路径字符串.open 函数会返回文件对象,它是一个 Python 对象,Python 通过该对象与文件本身交互.在此示例中,我们将此对象赋值给变

  • Python时间和字符串转换操作实例分析

    本文实例讲述了Python时间和字符串转换操作.分享给大家供大家参考,具体如下: 例子: #!/usr/bin/python # -*- coding: UTF-8 -*- import time # 格式化成2016-03-20 11:45:39形式 print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 格式化成Sat Mar 28 22:24:24 2016形式 print time.strftime("

  • python实现各种插值法(数值分析)

    一维插值 插值不同于拟合.插值函数经过样本点,拟合函数一般基于最小二乘法尽量靠近所有样本点穿过.常见插值方法有拉格朗日插值法.分段插值法.样条插值法. 拉格朗日插值多项式:当节点数n较大时,拉格朗日插值多项式的次数较高,可能出现不一致的收敛情况,而且计算复杂.随着样点增加,高次插值会带来误差的震动现象称为龙格现象. 分段插值:虽然收敛,但光滑性较差. 样条插值:样条插值是使用一种名为样条的特殊分段多项式进行插值的形式.由于样条插值可以使用低阶多项式样条实现较小的插值误差,这样就避免了使用高阶多项

  • Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析

    本文实例讲述了Python面向对象程序设计类变量与成员变量.类方法与成员方法用法.分享给大家供大家参考,具体如下: 类变量与成员变量 在类中声明的变量我们称之为类变量[静态成员变量], 在init()函数中声明的变量并且绑定在实例上的变量我们称之为成员变量. 类变量直接可以通过类名来调用. 1.若类变量与成员同时存在并且同名 使用对象来调用的时候,获取的结果是成员变量的值, 使用类名来调用,获取的是类变量的值. 2.若类变量存在,成员变量不存在, 使用对象来调用的时候,它首先寻找成员变量, 如果

  • PowerBI和Python关于数据分析的对比

    前言 如果你对数据分析有一定的了解,那你一定听说过一些亲民好用的数据分析的工具,如Excel.Tableau.PowerBI等等等等,它们都是数据分析的得力助手.像经常使用这些根据的伙伴肯定也有苦恼的时候,不足之处也是显而易见:操作繁琐,复用性差,功能相对局限单一. 很多经常会用到数据分析的伙伴会问有没有一款便捷好用的工具!肯定有啊,Python的出现和普及,很容易就能改变这些窘境! 怎么解决呢?--Python Python有很多优点,如果你能很好的运用到工作中,会发现工作效率大大提升,涨薪也

  • python flask框架实现传数据到js的方法分析

    本文实例讲述了python flask框架实现传数据到js的方法.分享给大家供大家参考,具体如下: 首先要清楚后台和前端交互所采用的数据格式. 一般选JSON,因为和js完美贴合. 后台返回的数据进行序列化 在/homepageRecommend 路由的 view方法中返回序列化数据 dict = {"a":1, "b":2}<br data-filtered="filtered"> import json json.dumps(di

  • Python中利用LSTM模型进行时间序列预测分析的实现

    时间序列模型 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征.这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺序的,同样大小的值改变顺序后输入模型产生的结果是不同的. 举个栗子:根据过去两年某股票的每天的股价数据推测之后一周的股价变化:根据过去2年某店铺每周想消费人数预测下周来店消费的人数等等 RNN 和 LSTM 模型 时间序列模型最常用最强大的的工具就是递归神经网络(recurrent neural n

  • 基于python分析你的上网行为 看看你平时上网都在干嘛

    简介 想看看你最近一年都在干嘛?看看你平时上网是在摸鱼还是认真工作?想写年度汇报总结,但是苦于没有数据?现在,它来了. 这是一个能让你了解自己的浏览历史的Chrome浏览历史记录分析程序,当然了,他仅适用于Chrome浏览器或者以Chrome为内核的浏览器. 在该页面中你将可以查看有关自己在过去的时间里所访问浏览的域名.URL以及忙碌天数的前十排名以及相关的数据图表. 部分截图 代码思路 1. 目录结构 首先,我们先看一下整体目录结构 Code ├─ app_callback.py 回调函数,实

  • 基于python历史天气采集的分析

    分析历史天气的趋势. 先采集 代码: #-*- coding:utf-8 -*- import requests import random import MySQLdb import xlwt from bs4 import BeautifulSoup user_agent=['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36'

  • 基于Python词云分析政府工作报告关键词

    前言 十三届全国人大三次会议作了政府工作报告.这份政府工作报告仅有10500字左右,据悉是改革开放40年以来最短的一次.受到疫情影响,今年的两会会议适当缩短,政府工作报告也大幅压缩,体现了"实干为要"的理念.那么,这份政府工作报告突出强调了哪些关键词呢?我们其实可以基于Python技术进行词频分析和词云制作! import matplotlib.pyplot as plt#绘图库 import jieba from wordcloud import WordCloud # 读入文本数据

  • 基于Python实现股票收益率分析

    目录 前言 案例详情 编程任务 编程提示 参考代码 任务1的代码 任务2的代码 任务3的代码 前言 金融行业的Python学习,不同于IT系统开发,我们并不需要达到程序员的水平.然而,学会Python可以让你实现一个人写完一个交易系统的需求,真正的一个人当成一支军队. 在量化交易里,Python是工具,金融是Sense,它可以让你的想法快速实现并得到验证.而在金融领域运用Python就必然会涉及资本市场最重要的部分——股票.“股市如此多娇,引无数投资者竞折腰”,用Python来分析股票投资组合收

  • 基于python实现cdn日志文件导入mysql进行分析

    目录 一.本文需求背景 二.需求落地如下 三.自定义查询 一.本文需求背景 周六日出现CDN大量请求,现需要分析其请求频次与来源,查询是否存在被攻击问题. 本文以阿里云CDN日志作为辅助查询数据,其它云平台大同小异. 系统提供的离线日志如下所示: 二.需求落地如下 日志实例如下所示: [9/Jun/2015:01:58:09 +0800] 10.10.10.10 - 1542 "-" "GET http://www.aliyun.com/index.html" 20

  • 基于Python开发chrome插件的方法分析

    本文实例讲述了基于Python开发chrome插件的方法.分享给大家供大家参考,具体如下: 谷歌Chrome插件是使用HTML.JavaScript和CSS编写的.如果你之前从来没有写过Chrome插件,我建议你读一下这个.在这篇教程中,我们将教你如何使用Python代替JavaScript. 创建一个谷歌Chrome插件 首先,我们必须创建一个清单文件:manifest.json. { "manifest_version": 2, "name": "Py

  • Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】

    本文实例讲述了Python分析微信好友性别比例和省份城市分布比例的方法.分享给大家供大家参考,具体如下: 安装itchat pip install itchat 使用 新建wxfx.py,拷贝以下代码 # -*- coding: utf-8 -*- #导入模块 from wxpy import * ''' 微信机器人登录有3种模式, (1)极简模式:robot = Bot() (2)终端模式:robot = Bot(console_qr=True) (3)缓存模式(可保持登录状态):robot

  • 基于Python实现人脸识别和焦点人物检测功能

    写在前面的话 基于dlib库的模型,实现人脸识别和焦点人物的检测.最后呈现的效果为焦点人物的识别框颜色与其他人物框不一样. 准备工作 需要安装好python环境,安装好dlib.opencv-python库等,具体可以看报错信息(可以使用PyCharm来运行和编辑py文件),然后把需要的库补全,文章最后会有完整代码,但是需要与shape_predictor_68_face_landmarks.dat模型文件同处一个路径下,然后启用.(百度可以下载到) 设计过程 因为是在自己电脑完成的必做题设计,

  • 基于python select.select模块通信的实例讲解

    要理解select.select模块其实主要就是要理解它的参数, 以及其三个返回值. select()方法接收并监控3个通信列表, 第一个是所有的输入的data,就是指外部发过来的数据,第2个是监控和接收所有要发出去的data(outgoing data),第3个监控错误信息在网上一直在找这个select.select的参数解释, 但实在是没有, 哎...自己硬着头皮分析了一下. readable, writable, exceptional = select.select(inputs, ou

  • 基于Python和Scikit-Learn的机器学习探索

    你好,%用户名%! 我叫Alex,我在机器学习和网络图分析(主要是理论)有所涉猎.我同时在为一家俄罗斯移动运营商开发大数据产品.这是我第一次在网上写文章,不喜勿喷. 现在,很多人想开发高效的算法以及参加机器学习的竞赛.所以他们过来问我:"该如何开始?".一段时间以前,我在一个俄罗斯联邦政府的下属机构中领导了媒体和社交网络大数据分析工具的开发.我仍然有一些我团队使用过的文档,我乐意与你们分享.前提是读者已经有很好的数学和机器学习方面的知识(我的团队主要由MIPT(莫斯科物理与技术大学)和

随机推荐