PHPでWebスクレイピングをやってみた

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

前から興味があったけどやったことがなかったPHPでのWebスクレイピング。調べてみると、『PHP Simple HTML DOM Parser』というのがいいらしい(参考:PHP Simple HTML DOM Parserの使用方法 – Webスクレイピング ライブラリ)。
PHP Simple HTML DOM Parser – Browse Files at SourceForge.net

というわけで使ってみることに。まずは上記ページからsimple_html_dom.phpをダウンロードして作成するPHPと同じフォルダに置く。今回のウェブスクレイピングの対象ページははてなブックマークのタグ検索ページ。はてブのタグ検索結果ページのそれぞれのエントリーはsearch-resultというクラスのliタグ内に記述しているようなので、search-resultクラスの要素を取得してforeachでループしたらよさそう。

やってみたら思った以上に簡単にできたので、ちょっといろいろ機能つけくわえてみた。以下、body部分のみ抜粋。

サンプルページ:スクレイピングテスト

内容としては、タグと除外URLを入力してブックマーク数を指定して送信ボタンを押すとはてなブックマークのタグ検索の結果(最高200件まで)を出力するというもの。除外URLを入力すると、表示させないエントリーを指定できる。

例えば、タグに『ニコニコ動画』、除外URLに『http://www.nicovideo.jp/』と入れると、結果はURLに『http://www.nicovideo.jp/』がURLに入ってないエントリーだけが表示される(前方一致ではなく、URLのどこかに含まれていたら除外する)。
http://amyu.minibird.jp/scraping/scraping_test.php?tag=ニコニコ動画&cut=http%3A%2F%2Fwww.nicovideo.jp%2F&users=3

とりあえず、5ページぐらいなら怒られないだろうと思って最初5ページのみを見るようにした。他に影響がでるもんでもないと思うので、XSSとか考えずにコーディングしてます(それ以前にもっとキレイなコードを書くようにしろと怒られそうですが・・・)。

本当、思った以上に簡単にできたので時間があれば何かウェブサービスっぽいものを作ってみたい。

Rでウェブスクレイピングしてみた

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

Rでウェブスクレイピングがやってみたくなったので調べてみた。
データサイエンティスト養成読本』でも、ウェブスクレイピングの章はRではなく、Pythonでの解説だったので、もしかしてRだと難しいのか? と思ったけど、XMLでのデータ取得とほぼ同じようにできた。

やり方は前にRでニコニコ動画APIを取得してみる | while(isプログラマ)で説明したやり方とほぼ同じ。
というわけで、今回ははてなブックマークのニコニコ動画の新着エントリーから、タイトルとURLとブクマ数を取得してデータフレーム化するプログラムを書いてみた。

できたテキストファイルが以下。
nicohatebu

XMLの時との違いは、xmlParseではなくて、htmlParseぐらいで、他は同じなよう。
簡単に何をやっているか説明すると、タイトルはh3タグの中のaタグの中のテキストなので、それを6行目でそのように取得。URLはh3タグの中のaタグの中のhref属性なので、それを7行目で取得。ブクマ数はliタグのdata-bookmark-count属性に書いてあるのでそれを8行目で取得しています。
あまり安全ではない書き方なような気がしますが、今のところこれで大丈夫そうなのでとりあえず。
本当は、個別個別のliをまず取得して、その中からh3タグの中のaタグを取得。というようにしたかったのだけれども、やり方が分かりませんでした。下記のようにやるとできると思ったのですが、うまくいかなくて・・・。

[[1]]の”【疑似m@s】割と熱湯のお風呂 ‐ ニコニコ動画:GINZA”しか取得しないと想定してやってみたのですが・・・。ここでは、『li[[1]]』が外部ポインターオブジェクトというものらしいのですが、まだよく分からないでいます・・・。

Rではてなブックマークの件数を取得してみる

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

またまたRネタ(ところで、Rってものすごい検索に引っかかりにくいような。R言語と書くべきだったか)。

ここのところニコニコ動画のAPIを使ったXMLの解析がつづいたので、今回ははてなブックマークの件数を取得するjsonの解析。Rにはrjsonというjsonを取得してR用に変換してくれるライブラリがあるようなので、今回はそれを利用。
参考:はてなブックマーク件数取得API – Hatena Developer Center
参考:CRAN – Package rjson

とりあえず、複数のURLを取得できるようなので、そのAPIを利用することに(調べてみたら、つい先日リリースされたばかりらしい。参考:(開発者向け情報)はてなブックマーク件数取得APIで複数のURLのブックマーク数をより簡単に取得出来るようになりました – はてなブックマーク開発ブログ)。

これで、jsonが利用できるようになったはずなので、試してみる。

本当なら、”://”のところを”%3A%2F%2F”という具合にURLエンコードしたかったのですが、RのURLencodeメソッドでは:や/はエンコードしてくれないようなので、わざとエンコードせず。

と思ったけど、第二引数をTRUEにしたらできた。

まあ、エンコードせずとも通ったみたいなので、まあいっか。

というわけで、前回作成したニコニコ動画のデータフレームに、はてなブックマークの件数を追加することに。
nicoFrame3.txt
上記ファイル内を全て選択してコピーしたら以下のように記述。

:や/が.に変換されてしまったという。後、データは順番に入っているわけではないっぽい。どういう順番なんだろう? data.frameメソッドを使った時に、何か影響した可能性もありそうだけど。
さて、これをいつもどおりテキストファイルに出力しようと思ったものの、以下の様なエラーが。

うーん・・・さっぱり分からない・・・。

とりあえず検索したら、r – Error writing to csv – Stack Overflowというページが引っかかったので、苦手な英語は読まずに(というより読めない)、なんとか下記のようにしたらうまく出力できた。

結果:nicoFrame4

うーん。Rのリストという概念がよく分からない。apply系のメソッドもよく分かってないし、もうちょっと勉強する必要がありそう。