今回はnokogiriを使ったスクレイピングについて書きます。
スクレイピングとは
ウェブスクレイピング(Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。
ウェブスクレイピング - Wikipediaより
Webプログラミングやるのであればどっかしらで必要になるものですよね。要はウェブサイトから情報をガーーーッと取得したいときにプログラムを書いて自動化しようぜ、というものです。こういうことができるようになると、インターネットがもっと楽しくなります。
たのしいRuby 第3版に分かりやすく解説されていたのでそれを参考にしました。
やり方
簡単なことならjQueryの初歩的なDOM操作みたいな感じで出来ます。
使うもの
言語
早速、抽出する
全部出す
さっそくHTMLをとってきましょう。
uri = "http://shgam.hatenadiary.jp" doc = Nokogiri::HTML(open(uri),nil,"utf-8") puts doc
HTMLを全部とってきて、それをまんま出力するにはこれでおっけーです。
HTMLがばーーっと出力されるはずです。HTMLをとってくるだなんて、ブラウザになった気分ですね。
CSSの記法で欲しいものをとってくる
doc.css("h1").each do |h1| puts h1 end
これでh1タグのものが全部出力されます。でも、例えば記事タイトルだけ欲しいんだよなということでクラス名を指定してあげることもできます。
doc.css("h1.entry-title").each do |title| puts title end
まんまCSSですね。jQuery使える人ならもうウハウハだと思います。
あれ、でもタグもそのまんまじゃなくて中身のテキストだけが欲しい時ありますよね。
doc.css("h1.entry-title").each do |title| puts title.text end
.textでとれます。便利ですね。説明の必要が無いですね。あと、記事のリンクも欲しいでしょう。
クラス名で指定するとか、
doc.css(".entry-title-link").each do |link| puts link["href"] end
「記事タイトル下のリンク」という感じで指定してもいいんじゃないでしょうか。
doc.css("h1.entry-title > a").each do |link| puts link["href"] end
とまあ、こんな感じです。
スクレイピングが必要になった経緯
今年の春ごろからあるスポーツのウェブサイト運営をお手伝いしているのですが、その作業の一つに「当月のブログ記事のタイトルと更新日とリンクをエクセルファイルにまとめる」というものがあります。
ブラウザから月ごとのページに行って、5記事ずつ表示されるそれを手作業でコピー・ペーストするのは辛いです。ChromeのJavaScriptコンソールから対応するDOMをとってきてみても、十分面倒くさい。ページに表示されるのは5記事ずつなので、その度ページ遷移が必要になります。
Rubyでちょっとしたスクリプトを書いてターミナルから1発でとってこれるようにしたら良いのでは、というのがnokogiriによるスクレイピングの個人的な目的でした。
書いたコードそのものは大したことないんですが、こういう考え方ができるようになってきたことにプログラミングやっててよかったなーとしみじみ感じています。今度はRubyからエクセルに書き込む方法を調べてまとめたいです。