Javaではてなブックマークのスクレイピングに挑戦しよう(ブックマークデータの収集編)
こんにちは、らくからちゃです。
わたしは、学生の頃からデータの解析をするのが大好きで、いつも色んなグラフを見ながら『これってこういうことなんかな?』なんて考えて過ごしてきました。そんなこんなで、書いている記事も、なんか気がつけばグラフまみれになっているんですよねー。
さて、以前から何回か『はてなブックマーク』のデータについて、解析した結果を投稿させて頂きました。
役所が公表しているデータを元に解析するのも楽しいんですけど、こうやって一からデータを作り上げて行う解析も、中々ワクワクするんですよね(笑)。さて、こういった記事を投稿する度『これ、どうやってるんですか?』『なんか大変そうだなあ』といったコメントを頂きます。
こういった記事の元ネタになるデータは、プログラムを書いて一括で取得するようにしています。ですので、データ量が多くてもあんまり手間はありませんし、過去に作ったプログラムをちょいちょい手直ししながらデータ収集を行わせて頂いております。
プログラムは、Javaで実質数十行程度のコードで書かれています。わたし自身、職業エンジニアではなく、ただの下っ端コンサルですのでVBくらいしかまともには書けません。おそらく、普段書いているコードは『JavaでHelloWorldが書ける程度の実力があれば多分OK』なレベルです。ちょっと自信がない人は、きしださんの
が超お勧めなので、まずはこの本からはじめましょう。 一応目標としては、
- ブックマークデータの収集
- 収集対象のURLの取得
- sliteへの格納
- gephiでの解析
といった感じで進めていきましょうか。ではでは、
いっくぞー( ・`д・´)
開発環境について
まず、簡単に開発環境についてご説明いたします。わたしの環境は、
- Mac OSX(10.10.5 Yosemite)
- NetBeans8.1
- Java 1.7.0.21
です。たぶん、WindowsでもEclipseでも問題ないとは思います。Netbeansなのは、ねこびーんが好きだからです。深い理由はない(笑)。
ねこびーん、可愛いよ。下記からDLできるので、インストールの手順とかは適当に調べてみてちょーだい!
ライブラリの取得と新規プロジェクトの作成
インストールができたら、まず下記サイトから最新のjsonicをダウンロードしておいて下さい。詳細は後程ご説明致します。
取得できたら、Netbeansを起動し、新しいプロジェクトを『ファイル(F)』から作成しましょう。カテゴリはJava、プロジェクトはJavaアプリケーションで問題有りません。プロジェクト名は、『HatenaBookmark』にしておきましょう。
プロジェクトができたら、『プロジェクト』メニューから右クリック→プロパティで『プロジェクトプロパティ』を開き、下記のように指定します。
まずは、先ほどDLしたjsonicを『jar/フォルダの追加』から追加します。
また、実行時引数に『http://www.yutorism.jp/』を指定します。ここで指定したURLのブックマークを取得します。
ソースコードの貼り付けと実行
さて、これで一通りの準備はOKです。もうひとまず、ソースコードを貼り付けて実行しちゃいましょう!
あとは、そのまま実行してみたら、こんな感じで出力されるはずです。
run:
kkentt,
sokuraterusu,
mizuki68490kobe,
uedako,
hick34d5,
strtok,
tamachan_kosugimick,
ncpapa,はてなブログで『ゆとりずむ』の読者になりました!
matomember_net,
arabasta,“こんにちは、らくからちゃです。”という気持ち悪い書き出しに変わった前後から、ブログ主の自己顕示欲があまりにも見え透くようになって、見るのが辛くなってRSSフィードから外した。
datemegane0523,
hiyopata,はてなブログで『ゆとりずむ』の読者になりました!
lacucaracha,
kerodon,すごいなあ。ブックマーク1つですらもらえるの大変なのに(私の場合ね)1000オーバーって。でも本当に良いエントリーだったからな。
kleinteich,インテリ
kozokaeru,
ゆとりずむ
ビルド成功(合計時間: 0秒)
引数に指定する箇所をいろいろと置き換えれば、まずは指定のブックマーク情報を、CSVっぽい感じで出力できるはずです。
解説
はてなブックマークでは、下記のURLに対し、青い部分を置き換えれば、そのページのブックマーク情報をJSON形式で取得することが出来ます。
http://b.hatena.ne.jp/entry/jsonlite/?url=http://www.yutorism.jp
ただ、そのままでは扱いづらいので、
でJavaのクラスオブジェクトに変換し、格納しています。まず、リンク先のデータを取得している箇所がこちら。
url = "http://b.hatena.ne.jp/entry/jsonlite/?url=" + URLEncoder.encode(args[0], "utf-8");
connect = (HttpURLConnection) new URL(url).openConnection();
connect.setRequestMethod("GET");
connect.setConnectTimeout(100000);
is = connect.getInputStream();
str = convertString(is);
引数に指定したURLを、UTF形式に変換。そしてそのURLを接続します。タイムアウトは、100,000ミリ秒に指定されてますので、100秒くらいはお返事をお待ちしています。
Page page = JSON.decode(str, Page.class);
for(Bookmark bookmark:page.getBookmarks()){
System.out.println(bookmark.getUser()+","+bookmark.getComment());
}
そしてjsonicで取得したデータをpage形式に変換して格納します。データは、
- Page ・・・各ページ別の情報
- Bookmarks ・・・ ページに対する各コメントの情報
となっています。Pageには、下記の情報が設定されています。
- title・・・タイトル
- count・・・ブックマークしている合計ユーザ数
- url・・・ブックマークされているURL
- entry_url・・・はてなブックマークエントリーページのURL
- screenshot・・・スクリーンショット画像のURL
- eid・・・エントリーID
- bookmarks・・・各ブックマーク(コメント)の情報
ひとつのページ情報に、ブックマーク情報は複数存在しております。bookmarksには、下記の情報が設定されています。
- user・・・ブックマークしたユーザ名
- tags・・・タグの配列
- timestamp・・・ブックマークした時刻。
- comment・・・ブックマークコメント
それぞれのデータはgetXXXの形式でデータが取得できます。その為、二行目のforで取得し、bookmarkに格納し、データを表示させ標準出力にだせば、簡単にブックマークのデータを表示させることが出来ます。
こんな感じで、ブックマークのURLさえ渡せば、誰がどんなコメントをつけているのかは、簡単に取得することが出来ます。次は、ブックマークがついたURLをどのように取得するのか?について見ていきたいと思いますね。