Javaではてなブックマークのスクレイピングに挑戦しよう(ブックマークデータの収集編)

こんにちは、らくからちゃです。

わたしは、学生の頃からデータの解析をするのが大好きで、いつも色んなグラフを見ながら『これってこういうことなんかな?』なんて考えて過ごしてきました。そんなこんなで、書いている記事も、なんか気がつけばグラフまみれになっているんですよねー。

さて、以前から何回か『はてなブックマーク』のデータについて、解析した結果を投稿させて頂きました。

役所が公表しているデータを元に解析するのも楽しいんですけど、こうやって一からデータを作り上げて行う解析も、中々ワクワクするんですよね(笑)。さて、こういった記事を投稿する度『これ、どうやってるんですか?』『なんか大変そうだなあ』といったコメントを頂きます。

こういった記事の元ネタになるデータは、プログラムを書いて一括で取得するようにしています。ですので、データ量が多くてもあんまり手間はありませんし、過去に作ったプログラムをちょいちょい手直ししながらデータ収集を行わせて頂いております。

プログラムは、Javaで実質数十行程度のコードで書かれています。わたし自身、職業エンジニアではなく、ただの下っ端コンサルですのでVBくらいしかまともには書けません。おそらく、普段書いているコードはJavaでHelloWorldが書ける程度の実力があれば多分OK』なレベルです。ちょっと自信がない人は、きしださんの

が超お勧めなので、まずはこの本からはじめましょう。 一応目標としては、

  1. ブックマークデータの収集
  2. 収集対象のURLの取得
  3. sliteへの格納
  4. gephiでの解析

といった感じで進めていきましょうか。ではでは、

いっくぞー( ・`д・´)

開発環境について

 まず、簡単に開発環境についてご説明いたします。わたしの環境は、

  • Mac OSX(10.10.5 Yosemite)
  • NetBeans8.1
  • Java 1.7.0.21

です。たぶん、WindowsでもEclipseでも問題ないとは思います。Netbeansなのは、ねこびーんが好きだからです。深い理由はない(笑)。

f:id:lacucaracha:20160130100143p:plain

ねこびーん、可愛いよ。下記からDLできるので、インストールの手順とかは適当に調べてみてちょーだい!

ライブラリの取得と新規プロジェクトの作成

インストールができたら、まず下記サイトから最新のjsonicをダウンロードしておいて下さい。詳細は後程ご説明致します。

取得できたら、Netbeansを起動し、新しいプロジェクトを『ファイル(F)』から作成しましょう。カテゴリはJava、プロジェクトはJavaアプリケーションで問題有りません。プロジェクト名は、『HatenaBookmark』にしておきましょう。

プロジェクトができたら、『プロジェクト』メニューから右クリック→プロパティで『プロジェクトプロパティ』を開き、下記のように指定します。

まずは、先ほどDLしたjsonicを『jar/フォルダの追加』から追加します。

f:id:lacucaracha:20160130101318p:plain

また、実行時引数に『http://www.yutorism.jp/』を指定します。ここで指定したURLのブックマークを取得します。

f:id:lacucaracha:20160130101321p:plain

ソースコードの貼り付けと実行

さて、これで一通りの準備はOKです。もうひとまず、ソースコードを貼り付けて実行しちゃいましょう!

gistb97ccafc23488c4de5d2

あとは、そのまま実行してみたら、こんな感じで出力されるはずです。

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をどのように取得するのか?について見ていきたいと思いますね。

続き

lacucaracha2.hatenablog.jp