pythonでfirefox3の検索履歴の上位25ワードを表示するグラフを表すgoogle chart apiのURLを生成する

タイトルが全てな感じ。結構前のエントリでfirefox3の検索履歴から検索回数の多いワードを表示させてみた。コマンドラインから回数だけでるのはわかりにくいのでグラフで出してみる。

参考:デベロッパーガイド

#! /bin/python
# coding: utf8

import sqlite3

# sqliteDBへのパス
dbpath = "path to sqlite db"

def querywords():
    # 検索ワードをリストで返す
    conn = sqlite3.connect(dbpath)
    curs = conn.cursor()
    ncurs = curs.execute("select value from moz_formhistory where fieldname='q' or fieldname='searchbar-history'")
    ws = [x[0] for x in ncurs.fetchall()]
    conn.close()
    return ws

def dictionarize(lst):
    # {単語: 出現回数}の辞書にする関数
    # 英字は小文字化する
    d = {}
    for n in lst:
        keys = n.lower().split()
        for k in keys:
            if k in d:
                d[k] += 1
            else:
                d[k] = 1
    return d

def main():
    import urllib
    import webbrowser
    from random import randint

    ws = querywords()
    dic = dictionarize(ws)

    top = 25
    lst = sorted(dic.iteritems(), key=lambda x:x[1], reverse=True)[:top]

    total = float(sum(n[1] for n in lst))
    chd = ",".join(str(n[1]) for n in lst)
    chm = "|".join("t%s,000000,0,%d,12" % (urllib.quote(n[1][0].encode("utf8")), n[0]) for n in enumerate(lst))

    base = "http://chart.apis.google.com/chart"
    data = {"chd": "t:"+chd, "cht":"bhg", "chs": "300x800",
            "chtt": urllib.quote("検索上位"+str(top)),
            "chm": chm}
    follow = "&".join(key +"="+ data[key] for key in data)
    webbrowser.open( base + "?" + follow )

if __name__ == '__main__':
    main()

実行結果

こんなの

エクセルでやれとか言わないでー。
ところで、検索ワードってその人の人となりをかなり強く反映しますよねー。
これをjavascriptでできればおもしろそーだ。特定のサイトにアクセスするとこれまでの検索履歴がグラフで表示されます!みたいな。けどjavascriptだとローカルファイルのsqliteデータベースにアクセスできないんだよなー。それに、特定のマシンに対して実行すると、複数台のマシンで作業するなどといった場合に適切なグラフなのかどうかってのが心配な気がする。そうか、検索窓から検索する度にサーバーに検索ワードを送信して、pythonで集計してgoogle chart apiを使ってグラフを書いてくれる、そんなプログラムを書けばいいんだ。あとで書く。かも。