読者です 読者をやめる 読者になる 読者になる

はてなブックマークのデータ解析をPythonでマネ

春一番が吹いたらしい今日の良き日、今日は自宅にこもっていた。
お腹はすくのでスーパーに買い物に行ったりはするのだが。

今日は休日である。
なんとなく毎日酒を飲む生活を続けていた私は、
このままではアル中になるのではないかと思っていた。
この状況を脱するために、今日は酒を飲むまないことにしていた。

昼間から酒を飲まないために、
何か小難しいことをやろうと思った。
そこで、最近見かけた記事を利用することにした。

内容は、はてなブックマークのデータ解析だ。
元記事はこれ「Javaはてなブックマークのデータ解析入門(sqliteへの格納編)」。

www.yutorism.jp



コンサルタント先生(見習と謙遜されている)がご創造なさったJavaのプログラムを、
Pythonに移植してみる。
自分では何も考えることはないし、
アル中一歩手前の自分にもなんとかなるだろう。

それで作ってみたのが以下の Python スクリプト

import sys
import traceback
import sqlite3
import urllib.parse
import urllib.request
import json
from bs4 import BeautifulSoup

create_table_sql = '''CREATE TABLE  IF NOT EXISTS BOOKMARKS (
    EID          VARCHAR (4000),
    BOOKMARKUSER VARCHAR (4000),
    URL          VARCHAR (4000),
    STARCOUNT    NUMERIC (5),
    TIMESTAMP    TIME,
    COMMENT      VARCHAR (4000),
    TAG          VARCHAR (4000),
    SITE         VARCHAR (4000),
    PRIMARY KEY (
        EID,
        BOOKMARKUSER
    )
);'''

target = sys.argv[1]
top = "1" #sys.argv[2]
sqliteConnStr = "test.sqlite3" # sys.argv[3]

jsonlite_url = "http://b.hatena.ne.jp/entry/jsonlite/?url="
bookmark_list = []

for i in range(int(top)):
    try:
        entrylist_url = "http://b.hatena.ne.jp/entrylist?sort=hot&layout=headline&" + urllib.parse.urlencode({"url":target}) + "&of=" + str(i * 20);
        with urllib.request.urlopen(entrylist_url) as entrylist_response:
            the_page = entrylist_response.read()
            soup = BeautifulSoup(the_page, "html.parser")
            for li in soup.find_all("li", class_="entrylist-unit"):
                url = "http://b.hatena.ne.jp/entry/jsonlite/?" + urllib.parse.urlencode({"url": li.a.get("href")})
                with urllib.request.urlopen(url) as url_response:
                    page = json.loads(url_response.read().decode("utf8"))
                    for bm in page["bookmarks"]:
                        bookmark_list.append((page["url"], page["eid"], bm["user"], 0, bm["timestamp"], bm["comment"], ",".join(bm["tags"])))
    except:
        print(traceback.format_exc())
        sys.exit()

try:
    with sqlite3.connect(sqliteConnStr, isolation_level="EXCLUSIVE") as conn:
        conn.execute(create_table_sql)
        conn.execute("DELETE FROM BOOKMARKS")
        conn.executemany("insert into BOOKMARKS(URL,EID,BOOKMARKUSER,STARCOUNT,TIMESTAMP,COMMENT,TAG) values(?,?,?,?,?,?,?)", bookmark_list)
        conn.commit()
except:
        print(traceback.format_exc())
        sys.exit()


Python 自体が勉強中なのでググり倒しながら作ったのだが、
一応動いた。ので、自分にちょっとごほうびを与えた。

やっていることは元記事と同じなので、実行結果も元記事と同じ。
何も新しい発見はない。
元記事と同じ結果が出るだけだ。

が、よく見ると、この元記事の人にもっともブックマークしているのは
実質的にはあのかんどーさんではないですか。
あの、美しいだけでなく面白い個人ブロガー。

アル中の記事www.kandosaori.com
を読んで大変そうだなーと思ったのですが、
今私が飲んでいる酒量は適量であるし、
夜に向けてこれ以上飲まなければまったく問題ないのである。