1. 两行代码搞定历史浏览器记录
偶然间遇到一个第三方库,竟然可以只用两行代码就能获得浏览器的历史浏览记录,再一次感叹python社区的强大。
使用pip安装
pip install browserhistory
代码示例
import browserhistory as bh
bh.write_browserhistory_csv()
整个源码只有区区不到200行,但却可以轻松的获取谷歌,火狐,safari 这三种浏览器的历史浏览记录,而且支持,mac, linux, windows三种平台。
运行程序,会在当前工作目录下生成浏览器对应的历史记录文件,格式为csv,内容包括url,标题,时间。
2. 源码解读
保持一颗好奇心,是做技术必备的素养。作者是如何做到在不同的平台上获取这三种浏览器的历史浏览记录的呢?打开源码,我们一探究竟。
# platform_table maps the name of user's OS to a platform code
platform_table = {
'linux': 0,
'linux2': 0,
'darwin': 1,
'cygwin': 2,
'win32': 2,
}
# it supports Linux, MacOS, and Windows platforms.
try:
user_platformcode = platform_table[sys.platform]
except KeyError:
class NotAvailableOS(Exception):
pass
raise NotAvailableOS("It does not support your OS.")
作者首先通过sys.platform 获得了平台的名称,据此得知当前程序运行在哪种操作系统上。
def get_database_paths() -> dict:
"""Get paths to the database of browsers and store them in a dictionary.It returns a dictionary: its key is the name of browser in str and its value is the path to database in str."""
platform_code = user_platformcode
browser_path_dict = dict()
# if it is a macOS
if platform_code == 1:
cwd_path = os.getcwd()
cwd_path_list = cwd_path.split('/')
# it creates string paths to broswer databases
abs_safari_path = os.path.join('/', cwd_path_list[1], cwd_path_list[2], 'Library', 'Safari', 'History.db')
abs_chrome_path = os.path.join('/', cwd_path_list[1], cwd_path_list[2], 'Library', 'Application Support', 'Google/Chrome/Default', 'History')
abs_firefox_path = os.path.join('/', cwd_path_list[1], cwd_path_list[2], 'Library', 'Application Support', 'Firefox/Profiles')
# check whether the databases exist
谷歌,火狐,safari 的历史浏览记录都保存在user目录下的固定位置,因此只要知道当前登录用户的user目录就以获得准确的位置。作者在get_database_paths 函数中,根据平台的不同,使用了不同的方法来确定user目录。
def get_browserhistory() -> dict:
paths2databases = get_database_paths()
for browser, path in paths2databases.items():
try:
conn = sqlite3.connect(path)
cursor = conn.cursor()
_SQL = ''
# SQL command for browsers' database table
if browser == 'chrome':
_SQL = """SELECT url, title, datetime((last_visit_time/1000000)-11644473600, 'unixepoch', 'localtime')AS last_visit_time FROM urls ORDER BY last_visit_time DESC"""
elif browser == 'firefox':
_SQL = """SELECT url, title, datetime((visit_date/1000000), 'unixepoch', 'localtime') AS visit_dateFROM moz_places INNER JOIN moz_historyvisits on moz_historyvisits.place_id = moz_places.id ORDER BY visit_date DESC"""
elif browser == 'safari':
_SQL = """SELECT url, title, datetime(visit_time + 978307200, 'unixepoch', 'localtime')FROM history_visits INNER JOIN history_items ON history_items.id = history_visits.history_item ORDER BY visit_time DESC"""
else:
pass
# query_result will store the result of query
query_result = []
try:
cursor.execute(_SQL)
query_result = cursor.fetchall()
except sqlite3.OperationalError:
print('* Notification * ')
print('Please Completely Close ' + browser.upper() + ' Window')
except Exception as err:
print(err)
# close cursor and connector
cursor.close()
conn.close()
# put the query result based on the name of browsers.
browserhistory[browser] = query_result
except sqlite3.OperationalError:
print('* ' + browser.upper() + ' Database Permission Denied.')
return browserhistory
这三种浏览器的数据都存储在sqlite3中,get_browserhistory函数分别将这三种浏览器的历史浏览器记录从数据库中读取出来,这个过程需要你关闭浏览器,浏览器和你的程序无法同时操作sqlite3。
def write_browserhistory_csv() -> None:
"""It writes csv files that contain the browser history inthe current working directory. It will writes csv files base onthe name of browsers the program detects."""
browserhistory = get_browserhistory()
for browser, history in browserhistory.items():
with open(browser + '_history.csv', mode='w', encoding='utf-8', newline='') as csvfile:
csv_writer = csv.writer(csvfile, delimiter=',',
quoting=csv.QUOTE_ALL)
for data in history:
csv_writer.writerow(data)
最后一步,使用csv模块,将不同的浏览器历史浏览记录写入到csv文件中。
受限于篇幅,每段代码只截取关键内容,感兴趣的朋友可以下载源码仔细研究,本文仅做大概介绍
3. 收获
学习使用第三方库,阅读其源码,是非常有效的提升技术水平的途径,不到200行的代码,认真阅读,可以收获以下知识sys.platform
csv 模块使用
sqlite3 读取数据库
获得不同平台,当前登录用户的user目录
os.path 模块的用法