Google Chromeの履歴をExcelに出力したかったので、Pythonで実装してみた。
流れは以下の通り。
履歴のダウンロード
サイトの指示に従ってGoogle データをダウンロードする。数ステップのみでダウンロードまで完了する。
出力できるデータの一覧からChromeを選ぶ。形式はJSON
で出力される。
全期間の履歴を出力したかったが1年間分だけだった。(仕様なのか、1年前に自分で消去したのかは不明・・・)
Pythonで履歴データをExcelに変換する
履歴データを読み込んで操作する
インポート
import json
import datetime
import pandas as pd
JSONファイルを開いて辞書データに変換する。
json_open = open('./履歴.json', 'r')
json_load = json.load(json_open)
JSONの一番目の階層は、'Browser History'
'Session'
'Typed Url'
になっている。
検索履歴は'Browser History'
に入っている。
# 以下でそれぞれを出力できる
json_load['Browser History']
json_load['Session']
json_load['Typed Url']
'Browser History'
の中はリスト型になっているので、len()
で保存されている履歴の全件数を表示できる。
len(json_load['Browser History'])
107301
また、位置を指定して個別の履歴を出力できる。また、個別の履歴は辞書型になっている。
json_load['Browser History'][104]
{'favicon_url': 'https://cdn.qiita.com/assets/favicons/public/production-c620d3e403342b1022967ba5e3db1aaa.ico',
'page_transition': 'LINK',
'title': 'Qiita',
'ptoken': {},
'url': 'https://qiita.com/',
'client_id': '#######################',
'time_usec': 1706421989661794}
履歴データを取り出す
辞書データから['Browser History']
の情報をリストに書き出すための関数を定義する。
def json_to_list(input):
output = [#input['favicon_url'],
input['page_transition'],
input['title'],
input['ptoken'],
input['url'],
input['client_id'],
input['time_usec']]
return output
関数を実行し、DataFrameに変換する
10万行近くあるデータなので、for
文で繰り返すと時間がかかって効率が悪い。そこで、map
関数を用いて効率的にデータを取り出す。
map
関数の戻り値であるmapオブジェクト
はイテレータなので、そのままではなくlist()
でリスト型にした上で、DatafFrameに変換する。列名は、元データの通りに設定する。
g = map(json_to_list, json_load['Browser History'])
col = ['page_transition', 'title', 'ptoken', 'url', 'client_id', 'time_usec']
df_all = pd.DataFrame(list(g), columns=col)
時刻とサイト名、URLだけを取り出す
新たなDataFrameを作成し、時刻とサイト名、URLだけを取り出す。
以下では、'time_usec'
'title'
'url'
に対応する列を、.iloc[:,[1,3,5]]]
で取り出している。
col = ['time_usec', 'date', 'time', 'title', 'url']
df_time = pd.DataFrame(columns=col)
df_time = pd.concat([df_time, df_all.iloc[:,[1,3,5]]])
タイムスタンプの変換
UNIX時間で記録されているので、これを普通の日付、時間表示に変換するための関数を定義する。タイムスタンプはマイクロ秒単位で記録されているので、引数に渡す際に/1000/1000
することに注意。
def conv_date(time_usec):
dtime = datetime.datetime.fromtimestamp(
time_usec / 1000 / 1000, datetime.timezone(datetime.timedelta(hours=9)))
return dtime.strftime('%Y/%m/%d')
def conv_time(time_usec):
dtime = datetime.datetime.fromtimestamp(
time_usec / 1000 / 1000, datetime.timezone(datetime.timedelta(hours=9)))
return dtime.strftime('%H:%M:%S')
apply
メソッドを用いて変換を実行する。
df_time.loc[:,'date'] = df_time.iloc[:,0].apply(conv_date)
df_time.loc[:,'time'] = df_time.iloc[:,0].apply(conv_time)
df_time
保存
CSVだと文字化けするのでExcelファイルに保存する。
df_all.to_excel('chrome_history_all.xlsx')
df_time.to_excel('chrome_history_time.xlsx')