python history.history_只需python两行代码,就能获取你的浏览器历史浏览记录

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 模块的用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值