通过浏览器的浏览历史进行人生的盘点(使用embulk + elasticsearch + kibana进行可视化)

这篇文章是来自「M3贴纸日历2015」的第22天文章。

首先

你好。现在是年末了。提到年末,这是回顾一年的好机会呢。我感觉有些有意识的人会说“这是评估人生的好时机呢★”。

回顧過去時光,唉,發現當初在網路上浪費了多少無謂時間啊…真是感到後悔萬分。但仔細一想,其實自己連當初在瀏覽器上看了些什麼都沒有好好回顧過。既然是個好機會,我在這篇文章中會好好深入探討一下,

可视化和分析个人浏览历史的基础设施

我想要尝试搭建起来。

只是,有一点令人担忧的是,我是

    • chrome => メインブラウザ

 

    firefox => ある特定の用途

我们以战略性方式使用两个浏览器。换句话说,浏览历史数据被分散了。必须满足的要求是将分散的Chrome和Firefox的浏览记录统合起来。

谷歌浏览器和火狐浏览器的浏览历史记录

当我稍微调查之后,我发现在Mac上,Chrome和Firefox的浏览历史都存储在SQLite 数据库中。

    • chrome

/Users/自分のディレクトリ/Library/Application Support/Google/Chrome/Default/History

firefox

/Users/自分のディレクトリ/Library/Application Support/Firefox/Profiles/ユーザーごとに固有の値?.default/places.sqlite

谷歌浏览器

因为直接修改数据库有点可怕,所以我会将它复制到各自的工作目录中,然后查看其内容。

$ cd {作業dir}
$ cp '/Users/自分のディレクトリ/Library/Application Support/Google/Chrome/Default/History' ./
$ sqlite3 History

テーブル一覧

sqlite> .tables
downloads             meta                  urls
downloads_url_chains  segment_usage         visit_source
keyword_search_terms  segments              visits

閲覧日時と閲覧urlを取得

sqlite> select datetime(v.visit_time/1000000-11644473600,'unixepoch','localtime') as visit_time, u.url
   ...> from visits as v
   ...> left outer join urls as u on v.url = u.id
   ...> order by v.id
   ...> limit 1;
2015-09-24 22:05:25|https://www.google.co.jp/

visit_time为从1601/1/1 UTC开始的微秒数,因此需要使用datetime函数进行适当处理,但可以确认可以通过sql获取浏览历史。

请参考这个链接:http://stackoverflow.com/questions/20458406/what-is-the-format-of-chromes-timestamps

火狐浏览器

我也试试看看Firefox。

$ cd {作業dir}
$ cp '/Users/自分のディレクトリ/Library/Application Support/Firefox/Profiles/ユーザーごとに固有の値?.default/places.sqlite' ./
$ sqlite3 places.sqlite

テーブル一覧

sqlite> .tables
downloads             meta                  urls
downloads_url_chains  segment_usage         visit_source
keyword_search_terms  segments              visits

閲覧日時と閲覧urlを取得

sqlite> select datetime(h.visit_date/1000000,'unixepoch','localtime'), p.url
   ...> from moz_historyvisits as h
   ...> left outer join moz_places as p on h.place_id = p.id
   ...> order by h.id
   ...> limit 1;
2012-04-22 13:40:29|http://www.google.co.jp/

经确认,在SQL中可以获取到Firefox访问日期(visit_date),该日期表示自1970/1/1 UTC以来的微秒数。

用embulk + elasticsearch + kibana将浏览历史进行可视化展示。

嗯,说到可视化,那就一定是 elasticsearch + kibana 啦。kibana 那个黑色的仪表盘总让人感到很兴奋。不过,要往 elasticsearch 里面输入数据是需要一些过程的。

    • sqlでjoinとかして必要なデータを抽出する

 

    • urlはhostの部分だけ抜き出すよう加工処理

 

    elasticsearchのAPIへhttpでPOSTする

这种事情需要一个一个地做,唉〜哎呀,看起来有点烦琐。

就用 Embulk 吧!

因此,我开始调查我一直对Embulk感兴趣的事情。

Embulk是一种类似于fluentd的批处理工具,在实时日志收集中被视为常识。它可以从文件和数据库中提取数据,并将其加载到另一个存储或数据库中。与fluentd一样,Embulk采用了插件化架构,因此可以通过使用Ruby或Java编写简单的代码来支持各种文件格式和存储。与fluentd不同的是,Embulk注重速度、事务控制和基于模式的数据验证,并专注于一次性执行或按日或每小时执行的批量处理。

听说是这样的。不知道为什么,感觉这次可以用在这个用途上。

仔细调查了一下embulk的插件,

    • sqliteからの入力 => embulk-input-jdbcプラグイン

 

    • urlからhostの部分抜き出し => embulk-filter-evalプラグイン

 

    elasticsearchへの出力 => embulk-output-elasticsearchプラグイン

我已经发现已经存在了这样的东西。可以根据以下的方式,将Chrome和Firefox的浏览历史放入Elasticsearch中。

スクリーンショット 2015-12-22 23.17.27.png

我们分别下载吧

事先只是简单地查了一下,发现Embulk的elasticsearch输出插件的最新版本似乎还不支持elasticsearch 2系,所以我们决定使用1系的最新版本。
– https://github.com/muga/embulk-output-elasticsearch

    • elasticsearch 1.7.4

 

    kibana 4.1.4

我决定采用这种方式。请注意,要运行以下内容需要Java(建议使用1.8或更高版本)。

embulk = Embulk

按照 GitHub 上的 readme 文件进行下载,可以获取最新版本的 embulk(截止至2015年12月22日,版本号为0.7.10)。

$ curl --create-dirs -o ~/.embulk/bin/embulk -L "http://dl.embulk.org/embulk-latest.jar"
$ chmod +x ~/.embulk/bin/embulk
$ echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc

如果您在以下命令中看到帮助信息,则表示一切正常。

$ embulk -h

弹性搜索1.7.4版本

下一步是安装全文搜索引擎elasticsearch。

$ wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.4.zip
$ unzip elasticsearch-1.7.4.zip
$ cd elasticsearch-1.7.4

headプラグインを入れます。インデックスの状況をブラウザでさらっと見れるので
$ ./bin/plugin install mobz/elasticsearch-head

embulk_sandboxというクラスタ名で起動してみます
$ ./bin/elasticsearch --cluster.name=embulk_sandbox

如果能够访问以下内容,就可以了。

基于Kibana 4.1.4版本

下载可以酷炫可视化Elasticsearch索引的Kibana。

因为有Mac版,所以我会下载它。

$ wget https://download.elastic.co/kibana/kibana/kibana-4.1.4-darwin-x64.zip
$ tar zxvf kibana-4.1.4-darwin-x64.zip
$ cd kibana-4.1.4-darwin-x64
$ ./bin/kibana

如果可以访问以下内容,就可以了。

使用embulk将浏览历史推送到elasticsearch中

好,现在让我们终于开始使用embulk将数据导入到elasticsearch。首先,我们将尝试将Chrome的浏览历史导入到elasticsearch中。

embulk-input-jdbc 这个库是用来将数据库中的数据导入到 Embulk 数据流中的工具。

在从SQLite中提取数据的部分,我们将使用名为embulk-input-jdbc的插件。

使用embulk gem命令已经完成安装。

$ embulk gem install embulk-input-jdbc

由于要使用jdbc,因此需要下载sqlite3-jdbc的jar包。

$ wget https://bitbucket.org/xerial/sqlite-jdbc/downloads/sqlite-jdbc-3.8.11.2.jar

在这种情况下,可以创建以下的yml文件。您可以在query项目中指定任意的SQL。非常方便。

in:
  type: jdbc
  driver_path: /Users/hidenorimaehara/sandbox/browser_history_search/sqlite-jdbc-3.8.11.2.jar
  driver_class: org.sqlite.JDBC
  url: jdbc:sqlite:History
  query: |
    select
      datetime(t_v.visit_time/1000000-11644473600,'unixepoch','localtime') as visit_time,
      t_u.url,
      'chrome' as browser
    from
      visits as t_v
        left outer join urls as t_u
        on t_v.url = t_u.id
    order by
      t_v.id desc
  column_options:
    visit_time: {value_type: string}
    url: {value_type: string}
    browser: {value_type: string}

执行embulk的preview命令后,会在标准输出中显示从sql中提取出来的结果。

$ embulk preview chrome_config.yml

数据转换滤镜-评估

我打算在这次分析中仅提取URL的主机部分。因为有一个可以编写Ruby语法的过滤插件,所以我决定使用它。

$ embulk gem install embulk-filter-eval

在eval_columns的项目中,您可以指定要为筛选器编写的列名称以及任意的Ruby语法。

in:
(略)
filters:
  - type: eval
    eval_columns:
      - url: "require 'uri'; URI.parse(value).host"
$ embulk preview chrome_config.yml

+---------------------+-------------------------------+----------------+
|   visit_time:string |                    url:string | browser:string |
+---------------------+-------------------------------+----------------+
| 2015-12-23 05:32:12 |              www.google.co.jp |         chrome |
| 2015-12-23 05:31:12 |              www.google.co.jp |         chrome |

我已经成功地提取出了URL中的主机部分。

Elasticsearch 输出插件 Embulk

最后是将结果输出到elasticsearch。

首先,在elasticsearch中创建映射。索引名称设置为embulk_browser_history,类型名称设置为history。

$ curl -XPUT 'http://localhost:9200/embulk_browser_history' -d '{
  "mappings": {
    "history": {
      "properties": {
        "visit_time": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss"
        },
        "url": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}'

作为下一步,我们需要安装Embulk插件- embulk-output-elasticsearch,因为映射已经创建完成。

$ embulk gem install embulk-output-elasticsearch

请指定索引(index)和索引类型(index_type)为上述映射中创建的内容。请指定 cluster_name 为先前运行 Elasticsearch 时的集群名称。

in:
(略)
filters:
(略)
out:
  type: elasticsearch
  nodes:
  - {host: localhost}
  cluster_name: embulk_sandbox
  index: embulk_browser_history
  index_type: history

好了,现在终于要深入讨论了。

$ embulk run chrome_config.yml
スクリーンショット 2015-12-23 6.10.43.png

可以插一脚!

我们来查一下Firefox的浏览历史吧。

鑒於成功運作,我們也將嘗試火狐版本。

顺便提一下,根据上述步骤,Chrome的设置文件应该是以下这样的。

Chrome 配置文件.yml

in:
  type: jdbc
  driver_path: /Users/hidenorimaehara/sandbox/browser_history_search/sqlite-jdbc-3.8.11.2.jar
  driver_class: org.sqlite.JDBC
  url: jdbc:sqlite:History
  query: |
    select
      datetime(t_v.visit_time/1000000-11644473600,'unixepoch','localtime') as visit_time,
      t_u.url,
      'chrome' as browser
    from
      visits as t_v
        left outer join urls as t_u
        on t_v.url = t_u.id
    order by
      t_v.id desc
  column_options:
    visit_time: {value_type: string}
    url: {value_type: string}
    browser: {value_type: string}
filters:
  - type: eval
    eval_columns:
      - url: "require 'uri'; URI.parse(value).host"
out:
  type: elasticsearch
  nodes:
  - {host: localhost}
  cluster_name: embulk_sandbox
  index: embulk_browser_history
  index_type: history

火狐配置文件.yml

根据上述内容,我将为Firefox创建一个新的版本。由于数据库和表格结构不同,我会对Chrome的版本进行微调。

in:
  type: jdbc
  driver_path: /Users/hidenorimaehara/sandbox/browser_history_search/sqlite-jdbc-3.8.11.2.jar
  driver_class: org.sqlite.JDBC
  url: jdbc:sqlite:places.sqlite
  query: |
    select
      datetime(t_mh.visit_date/1000000,'unixepoch','localtime') as visit_time, 
      t_mp.url,
      'firefox' as browser
    from
      moz_historyvisits as t_mh
        left outer join moz_places as t_mp
        on t_mh.place_id = t_mp.id
    where
      visit_time >= '2015-09-22 00:00:00'
    order by
      t_mh.id desc
  column_options:
    visit_time: {value_type: string}
    url: {value_type: string}
    browser: {value_type: string}
filters:
  - type: eval
    eval_columns:
      - url: "require 'uri'; URI.parse(value).host"
out:
  type: elasticsearch
  nodes:
  - {host: localhost}
  cluster_name: embulk_sandbox
  index: embulk_browser_history
  index_type: history

执行吧!

$ embulk run firefox_config.yml

Elasticsearch已经很好地投入使用了!

スクリーンショット 2015-12-23 0.21.02.png

基本上,Kibana is a data visualization and exploration tool in the Elastic Stack that allows users to interact with and analyze data stored in Elasticsearch.

如果你能做到这一点,剩下的就是根据自己的喜好调整Kibana,仅需对可视化的结果进行分析。在Kibana上创建仪表板大致如下。

スクリーンショット 2015-12-23 0.42.31.png

好酷!

最近一周的浏览器访问量(按照浏览器分类)

终于到了面对过去的时刻了。。让我们来看看最近一周每个浏览器的访问量。

スクリーンショット 2015-12-23 0.12.47.png

嗯嗯!最近火狐浏览器的使用量好像特别高的一天。。。

过去一周内的前10个浏览网站

让我们来查看最近一周的访问网站前10名,看看今天到底访问了哪些网站。

スクリーンショット 2015-12-23 0.12.54.png

自律管理!

明年的目标

通过查看浏览器的浏览历史,我能够对人生进行一次盘点。明年的目标是什么。

    • Firefoxの閲覧比率を20%以下にする

 

    閲覧サイトTOP10を、人に見せられるようにする

我决定这样做。

各位是否考虑利用自己的浏览器历史记录来进行人生的梳理呢?

广告
将在 10 秒后关闭
bannerAds