バナー画像

本記事では、スクレイピングを解説します。

スクレイピングとは、単純に「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タグの内容も取れてしまいましたが、歴代の総理大臣を取得することができました。

まとめ

スクレイピング、本当に便利ですよね。

自分の好みのサイトを使って、ぜひいろいろ試してみてくださいね!

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。