Pythonでブラウザの閲覧履歴を調べる

FirefoxやChrome(とChromium)では、Webページの閲覧履歴がSQLite3のデータベースとして保存されているようです。

ご存知の通り、SQLiteはローカルファイルを使ったDBMSなので、コネクション実装とSQLが吐ける管理ツールがあれば中身を調べること自体は可能です。
とは言え、今回はPythonでやってしまおうと思います。

もくじ:

はじめに

とりあえずCSVにしておけばExcelなり他のスクリプトで再利用なりできると思いますので、まずは対象のテーブルをCSVへ書き出すことを考えます。

取得する情報はページのタイトルとURL、最終閲覧時刻(タイムスタンプ)です。閲覧回数など他の情報も同様に取得することもできますが、単にどのページを見たのかを知りたいだけならシンプルにできます。

また、ファイルの場所を判別するのが面倒だったので、今回はWindowsのみを対象としています。SQL(クエリ)を投げて必要な情報を取得するところ以降はどのプラットフォームでも同じだと思います。サンプルは最後のほうに記載します。

1. ブラウザ履歴の取得

ブラウザによって履歴を格納しているSQLiteファイルの所在や、テーブルのスキーマなど微妙に異なっています。

1.1 ファイルのコピー作成

ブラウザが起動中の場合など競合を避けるために、ブラウザが使用しているDBファイルではなく、コピーを作成した上で操作を行います。

1.2 テーブル

今回は閲覧したページのタイトル、URLなどが取得できればよいので、とりあえずは履歴URLを格納しているテーブルを参照します。
Firefoxの場合はmoz_placesテーブル、Chromeの場合はurlsテーブルが対象です。

Select文でタイトル、URL、最終閲覧時刻を指定します。
ただし、テーブル名はもちろん最終閲覧時刻についても、FirefoxとChromeではカラム名(とフォーマット)が異なるので考慮が必要です。

1.3 CSVへの保存

sqlalchemypandasを使ってDBへのクエリとCSVへの書き出しを実行します。もちろん標準のsqlite3モジュールで頑張ってDBを参照することもできますが長くなるので。

これらのモジュールは環境によっては追加で導入が必要かも知れません。無い場合(ImportErrorになる)はpipで導入できます。

pandasが便利なのは、テーブル(クエリの結果)からそのままDataframeを生成できるところですね。
たまにタイトルがないデータがあるので、不要な場合は削っておきます。

若干の注意が必要なのは、CSVをExcelで開く場合はBOM付きでないと文字化けすること。エンコードをDataFrame.to_csv()のオプションで指定します。

2. 直近の履歴のみを取り出す

CSVをロードして一旦Dataframeとして扱えるようになれば、ここ最近にアクセスした履歴のみを抽出することもできます。

要は最終閲覧時刻をもとに判断すればいいのですが、そのフォーマットがブラウザによってちょっと異なる点に注意が必要です。
Firefoxの場合はPOSIXタイムスタンプのマイクロ秒、Chromeの場合はUTCで1601年からのマイクロ秒です。

3. サンプル

今回の使い方はこんな感じ。コマンドラインでCSVの作成とロードを実行できます。

サンプル全体は次の通りです。

おわり。