经常清理浏览器的历史记录是个好习惯,但有些记录可能以后会用到,需要先备份后再进行清理,并按清理日期备份历史记录。以下是我的需求:
目标浏览器为 Google 浏览器;
备份当前时间之前所有的历史记录到 txt 文件,文件命名格式为:history_{clear_date}.txt;
统计并打印备份记录数,总共耗时等信息。
Windows 上的 Google 浏览器会在
\AppData\Local\Google\Chrome\User Data\Default 路径下的 history目录下存在两个数据表:urls表、visits表。
urls 表的大致字段为:id, url, title,visit_count,typed_count,ast_vist_time,hidden...
visits 表的大致字段为:id, url,visit_time, from_visit, transition, segment_id , visit_duration....
我需要的字段有:urls.id, urls.url, urls.title, visits.visit_time, urls.visit_count
因此,通过 python 实现的代码如下:
- import os.path
- import sqlite3
- import time
-
- def getChromeHistory(history_db):
- start_time = time.perf_counter()
- clear_date = time.strftime(time.strftime("%Y-%m-%d", time.localtime()))
- # 连接历史记录数据库
- con = sqlite3.connect(history_db)
- # 查询
- cursor = con.cursor()
- sql_statement = "SELECT urls.id, visits.visit_time, urls.title, urls.url, urls.visit_count FROM urls,visits WHERE urls.id=visits.url;"
- cursor.execute(sql_statement)
- records = cursor.fetchall() # 抓取所有
- # records = cursor.fetchmany(1000) # 1000条测试
- # 保存到txt文件
- print(f"正在备份{len(records)}条历史记录......")
- for data in records:
- strings = str(data[0]) + ", " + str(data[1]) + ", " + data[2] + ", " + data[3] + ", " + str(data[4])
- with open(f"D:\\XXX\\history_{clear_date}.txt", 'a+', encoding='utf-8') as fw:
- fw.writelines(strings + '\n')
- print(f"历史记录备份完成!耗时:{time.perf_counter() - start_time}秒!")
-
- if __name__ == '__main__':
- # 历史记录数据库所在位置
- db_path = os.path.expanduser('~') + r"\AppData\Local\Google\Chrome\User Data\Default"
- history = os.path.join(db_path, 'history')
- getChromeHistory(history)
测试效果:
- 正在备份1000条历史记录......
- 历史记录备份完成!耗时:0.3269138秒!
测试过程中,遇到的问题:

原因:SQLite 数据库只支持单线程操作,关闭谷歌浏览器等占用该线程的资源即可。