经常清理浏览器的历史记录是个好习惯,但有些记录可能以后会用到,需要先备份后再进行清理,并按清理日期备份历史记录。以下是我的需求:
目标浏览器为 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 数据库只支持单线程操作,关闭谷歌浏览器等占用该线程的资源即可。