本記事では、スクレイピングを解説します。
スクレイピングとは、単純に「Webページからデータを抽出すること」と理解すれば十分です。
HTMLは、要はタグで記述されたデータのかたまりです。
であれば、タグを手がかりにそこに書かれているデータを抽出できそうですね。
スクレイピングをもう少し詳しく
スクレイピングの定義を、Wikipediaに求めてみましょう。
ウェブスクレイピング(英: Web Scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。ウェブ・クローラーあるいはウェブ・スパイダーとも呼ばれる。
要するに、ウェブサイトから欲しい情報を取り出す技術のようですね。
本記事ではスクレイピングのツールとしてnokogiriというgemを使います。
nokogiriのセットアップ
nokogiriはgemとして提供されているので、とても簡単にセットアップできます。
このページのInstallationを見ると、以下でインストールできるようです。
gem install nokogiri
このようなメッセージが返って来ればOKです。
Building native extensions. This could take a while... Successfully installed nokogiri-1.8.1 1 gem installed
とりあえずnokogiri
こちらのGitHub上のサイトでサンプルを見てみましょう。
冒頭部分のみです。
require 'nokogiri' require 'open-uri' # Fetch and parse HTML document doc = Nokogiri::HTML(open('http://www.nokogiri.org/tutorials/installing_nokogiri.html'))
何だかよくわかりませんが、どうもdocというオブジェクトに何か入れているようです。
中身を見るために、とりあえずdocをputsしてみましょう。
require 'nokogiri' require 'open-uri' # Fetch and parse HTML document doc = Nokogiri::HTML(open('http://www.nokogiri.org/tutorials/installing_nokogiri.html')) puts doc #とりあえずそのまま出力
[実行結果]
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Installing Nokogiri - Nokogiri 鋸</title> <meta name="author" content="Team Sparklemotion"> (・・・後略・・・)
よく見るとページのソースっぽいですね。
サンプルにあるURLに直接アクセスして確認してみると、どうもページのソースそのまま取れたようです。
それらを使って、ページの内容を取れないでしょうか?
ではもう少しサンプルを使ってやってみましょう。
require 'nokogiri' require 'open-uri' # Fetch and parse HTML document doc = Nokogiri::HTML(open('http://www.nokogiri.org/tutorials/installing_nokogiri.html')) puts "### Search for nodes by css" doc.css('nav ul.menu li a', 'article h2').each do |link| puts link.content end
[実行結果]
### Search for nodes by css Docs GitHub Build Status Installation Tutorials Getting Help Install with included libraries (RECOMMENDED) Install with system libraries Install with custom / non-standard libraries
うーん、何だか分かりませんね。
でも、ちょっと待ってください。
ページを見てみましょう。
navバーのあたりが取れているようです。
結果から見ると「doc.css(‘nav ul.menu li a’, ‘article h2’).each do |link|」の行は取得したい対象を書きます。
では、以下のように差し替えるとどうなるでしょうか?
doc.css('a').each do |link|
[実行結果]
### Search for nodes by css Nokogiri 鋸 Docs GitHub Build Status Installation Tutorials (・・・中略・・・) Parsing an HTML/XML document → sparklemotion/nokogiri.org-tutorials Octopress Oscailte
ページ中にあるaタグの中身が全て取れました!
お目当のデータを抜き取る
要素を指定してデータを取れるということが分かったので、もう少し込み入ったことをしましょう。
Wikipediaの内閣総理大臣のページを見てみましょう。
ここから総理大臣の一覧を一気にぬきとります。
ページのHTMLソースにて、伊藤博文のあたりを確認してください。
<td><a href="It%C5%8D_Hirobumi.jpg" class="image" title="伊藤博文">
tdタグの中のaタグ、ということが分かったので、以下のようにしてみましょう。
require 'nokogiri' require 'open-uri' # Fetch and parse HTML document doc = Nokogiri::HTML(open('https://ja.wikipedia.org/wiki/%E5%86%85%E9%96%A3%E7%B7%8F%E7%90%86%E5%A4%A7%E8%87%A3%E3%81%AE%E4%B8%80%E8%A6%A7')) puts "### Search for nodes by css" doc.css('table tr td a').each do |link| puts link.content end
[実行結果]
(・・・省略・・・) 伊藤博文 黑田清隆 山縣有朋 松方正義 大隈重信 (・・・省略・・・)
出ました!!
こうやって歴代の総理大臣を取り出すことができました。
「doc.css(‘table tr td a’)」は、取得したいタグを指定しています。tableタグのtrのtdのaタグを取れ、という指定になります。
よって、他のaタグの内容も取れてしまいましたが、歴代の総理大臣を取得することができました。
まとめ
スクレイピング、本当に便利ですよね。
自分の好みのサイトを使って、ぜひいろいろ試してみてくださいね!