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

gaaamiiのブログ

悪気なく間違ったことを書いている時があります。コメントやTwitter、ブコメなどでご指摘ください

nokogiriを使ったスクレイピング入門

今回はnokogiriを使ったスクレイピングについて書きます。

スクレイピングとは

ウェブスクレイピング(Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。
ウェブスクレイピング - Wikipediaより

Webプログラミングやるのであればどっかしらで必要になるものですよね。要はウェブサイトから情報をガーーーッと取得したいときにプログラムを書いて自動化しようぜ、というものです。こういうことができるようになると、インターネットがもっと楽しくなります。

たのしいRuby 第3版に分かりやすく解説されていたのでそれを参考にしました。

やり方

簡単なことならjQueryの初歩的なDOM操作みたいな感じで出来ます。

使うもの

言語
gem
  • open-uri
  • nokogiri

今回のスクレイピングrubyでやっていきます。PHPとどっちが簡単かわからないけど多分Rubyの方が簡単なんじゃないですかね。

ということで、まずは

gem install nokogiri

してから、

require 'open-uri'
require 'nokogiri'

しておきましょう。

早速、抽出する

全部出す

さっそく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記事ずつ表示されるそれを手作業でコピー・ペーストするのは辛いです。ChromeJavaScriptコンソールから対応するDOMをとってきてみても、十分面倒くさい。ページに表示されるのは5記事ずつなので、その度ページ遷移が必要になります。

Rubyでちょっとしたスクリプトを書いてターミナルから1発でとってこれるようにしたら良いのでは、というのがnokogiriによるスクレイピングの個人的な目的でした。

書いたコードそのものは大したことないんですが、こういう考え方ができるようになってきたことにプログラミングやっててよかったなーとしみじみ感じています。今度はRubyからエクセルに書き込む方法を調べてまとめたいです。

追記

なお、nokogiri使えばいいというのはTwitter@ToraDadyさんに教えて頂きました。本当にありがとうございます。

このブログは親切なフォロワーさん,読者さんに支えられています。