@Shin_beginner

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonで自分のChromeの閲覧履歴をExcelに出力したい。

Q&A

Closed

解決したいこと

Qiita,Python初心者です。
Pythonで自分のChromeの閲覧履歴をExcelに出力したいです。

該当するソースコード

import os
import shutil
import sqlite3
import sys
from datetime import datetime, timedelta

"""Query chrome-history
Params:
    query_title           : str. title to query. Set "'%.%'" for empty. ex. "'%queryword%'"
    query_url             : str. url to query. Set "'%.%'" for empty
    dt_to                 : datetime. to  ex. datetime(2022, 1, 1, 0, 0)
    dt_from               : datetime. from 
    tz                    : int. timezone (UTC=0)
    history_file_original : str. full/path/chromehistory/in_your_PC
    history_file_tmp      : str. filename of chromehistory snapshot
    
Set "'%%'" for empty condition of title or url
"""
query_title = "'%%'"
query_url = "'%twitter%'"

dt_to = datetime.now()
dt_from = datetime.now() - timedelta(days=7)
tz = 9

history_file_original = r"C:\Users\******\AppData\Local\Google\Chrome\User Data\Default\History"
history_file_tmp = "chrome-history-snapshot"


def dt2str(dt):
    return dt.strftime("%Y-%m-%d %H:%M:%S")


def date_from_webkit(webkit_timestamp, tz):
    """Convert webkit(utc) to local datetime"""
    epoch_start = datetime(1601, 1, 1)
    delta = timedelta(hours=tz, microseconds=int(webkit_timestamp))
    return epoch_start + delta


def date_to_webkit(dt, tz):
    """Convert local datetime to webkit(utc)"""
    epoch_start = datetime(1601, 1, 1)
    delta = dt - epoch_start - timedelta(hours=tz)
    delta_micro_sec = (delta.days * 60 * 60 * 24 + delta.seconds) * 1000 * 1000
    return delta_micro_sec


def time_range_set(dt_from, dt_to, tz):
    time_to = date_to_webkit(dt_to, tz)
    time_from = date_to_webkit(dt_from, tz)
    return time_from, time_to


def sql_query(time_from, time_to, title, url):

    # Copy history file if updated
    try:
        if os.stat(history_file_original).st_mtime - os.stat(history_file_tmp).st_mtime > 1:
            shutil.copy2(history_file_original, history_file_tmp)
    except FileNotFoundError:
        shutil.copy2(history_file_original, history_file_tmp)

    conn = sqlite3.connect(history_file_tmp)
    c = conn.cursor()
    sql_string = f"""SELECT * FROM urls
                     WHERE {time_from} < last_visit_time
                     AND last_visit_time < {time_to}
                     AND title like {title}
                     AND url like {url}
                     ORDER BY last_visit_time DESC;"""

    c.execute(sql_string)
    fetch_result = c.fetchall()
    return fetch_result


if __name__ == "__main__":

    print(f"Query chrome history")
    print(f"From: {dt2str(dt_from)}, To: {dt2str(dt_to)}")
    print(f"Title {query_title}")
    print(f"Url {query_url}")
    time_from, time_to = time_range_set(dt_from, dt_to, tz)
    fetch_result = sql_query(time_from, time_to, query_title, query_url)
    
    print(f"{len(fetch_result)} results...")

    for i in fetch_result:
        time = i[5]
        url = i[1]
        title = i[2]

        dt = date_from_webkit(time, tz)
        time_str = dt2str(dt)

        # Formatting
        max_len = 72
        if len(title) > max_len:
            title = title[:max_len] + "..."

        print(time_str, title, url)

このコードで、コマンドプロンプト上に閲覧履歴を出力することは出来ました。
ここから、そのデータをエクセルに出力したいのですが、どの部分にコードを追加すれば、エクセルに出力できるようになるのか、調べてもうまく解決することが出来なかったため教えていただけるとありがたいです。
openpyxlはインストールしてあります。

0 likes

1Answer

ここまで書けていれば、すぐだと思います。

考えること(やること)は、
① Excelファイルをオープン(新規に作成するか、既存のExcelに新規シートを追加するか)
② 履歴情報をシートに書き込む
③ Excelファイルをクローズ
だけです。

①は、mainのforループの前で行い、変数rをセット
②は、forループ最後の文print(time_str, title, url)が書き込むデータですね。現在行に3列を書き込む(3つのセル)

ws.cell(row=r, col=1).value = time_str
ws.cell(row=r, col=2).value = title
ws.cell(row=r, col=3).value = url
r += 1

③は、mainのforループを抜けた後

openpyxlの使い方は、ググればわかると思います。例えば、下記記事とか。


pythonでコードを書かなくても、直接ローカルファイル("C:\Users******\AppData\Local\Google\Chrome\User Data\Default\History\chrome-history-snapshot")からExcelにする方法があるかも?

1Like

Comments

  1. @Shin_beginner

    Questioner

    とても分かりやすい回答ありがとうございました。
    回答者様のおかげで、無事エクセルに出力することが出来ました。

  2. 問題が解決したようでしたら、クローズにするといいですよ。

Your answer might help someone💌