Search

検索したいワードを入力してください

2019年01月17日

Rubyスクレイピングを初心者でもわかるよう徹底解説

Webページを閲覧しているとき、情報が多過ぎて、スクロールして目的の情報を探すのは大変に感じるという方もいるのではないのでしょうか?スクレイピングを利用すると、目的の情報だけを抽出して表示できます。ここでは、Rubyでスクレイピングを行ってみましょう。

スクレイピングでは何ができる?

Webページを閲覧しているとき、情報が多過ぎて、スクロールして目的の情報を探すのは大変に感じるという方もいるのではないのでしょうか?スクレイピングを利用すると、必要な情報を抽出してすべて見ることができます。

スクレイピングの特徴

任意のWebサイトのURLより、HTMLなどによるソースを取得します。そこからソース内の任意のテキストや画像などを、タグ名やXPathなどによって指定することによって、取得したい情報を抽出します。これをスクレイピングといいます。抽出した情報は、作成したプログラムを実行してターミナル上などに出力させることができます。

Rubyでスクレイピングをするには?

Rubyでのスクレイピングには、open-uriおよびnokogiriというGemが用いられます。まず、open-uriによって、解析したいWebページをURLで指定してソースを取得します。その次に、nokogiriによって、指定したタグやXPathから取得したい情報を抽出します。

nokogiriの特徴

解析するWebページのURLをhttp://www.example.com/とします。
Rubyでは、まず以下の文を用いて、HTMLソースのタグやXPathに関する情報を取得します。
doc=Nokogiri::HTML(open("http://www.example.com/"))
次に、タグ名(tagname)、クラス名(classname)を指定する場合、
doc.css(tagname)
doc.css(".#{classname}")
XPath(xpathname)を指定する場合には、
doc.xpath(xpathname)
を用います。

これらは、一つのみヒットした場合はElementクラス、複数ヒットした場合はNodeSetクラス(Elementクラスから成る配列)で返します。内部のテキストは、Elementクラスに属するtext変数で取得できます。

nokogiriで実際にスクレイピングしてみる

nokogiriを導入するには?

Rubyでnokogiriを利用するには、RubyGemsの公式サイトhttps://rubygems.org/gems/nokogiri/versionよりダウンロードします。
2019年1月時点では、1.10.0が最新バージョンですので、ターミナル上で、以下のコマンドでインストールします。
gem install nokogiri-1.10.0-x86-mingw32.gem (32bit)
gem install nokogiri-1.10.0-x64-mingw32.gem (64bit)

エラーが出なければ、セットアップ成功です。
Rubyスクリプトの最初にrequire"nokogiri"と記述すればgemを利用することができます。

nokogiriで天気情報を抽出してみよう!

weathernewsのサイトより、渋谷区の天気情報をnokogiriによるスクレイピングで抽出するRubyスクリプトを作成しましょう。使用するサイトはこちらです。
このページより、場所、時刻、天気、温度、湿度、気圧、風速の情報を抽出します。

クラス名を取得する

Google Chromeブラウザ上で、場所を表す「東京都渋谷区付近の天気」の文字列の上で右クリックメニューを開き、「検証」を選びます。すると、画面下部にHTMLソースが表示され、該当部分が選択されています。h1タグ内を見ると、クラス名が「title_now」であることが分かります。他の項目についても同様の作業を行います。

実装

湿度、気圧、風速は同じクラスobs_sub_valueでした。
css関数はHTMLソースの始めから順番に探索して該当クラスの部分をNodeSetで返すので、Rubyで使用可能な多重代入で取得できます(*)。

以下が、スクレイピングによって抽出するRubyスクリプトです。
require"open-uri"
require"nokogiri"

url="https://weathernews.jp/onebox/35.651604/139.705455/temp=c&q=東京都渋谷区&v=1671e08ac789d4fc5f0ab768a5efeaefce9bb7f9a787bc06a95de1092ab81e4c&lang=ja"

doc=Nokogiri::HTML(open(URI.encode(url)))

#タグ名、クラス名を用いてスクレイピングする
loc=doc.css(".title_now").text #場所
time,weather=doc.css('.sub').text.split(", ") #時刻と天気
tempr=doc.css('.obs_temp_main').text #気温
hmd,prs,wind=doc.css('.table-obs_sub').css('tr').css('.obs_sub_value').text.split(" : ")[1..-1] #湿度、気圧、風速(*)

puts"#{loc}(#{time}現在)"
puts
puts"天気: #{weather}","温度: #{tempr}℃","湿度: #{hmd}","気圧: #{prs}","風速: #{wind}"

実行結果

※実行時刻によって異なる結果になります
東京都渋谷区付近の天気(13:30現在)

天気: くもり
温度: 5.1℃
湿度: 52 %
気圧: 1015 hPa
風速: 北 1 m/s

スクレイピングを使った作例紹介

作例1: Google検索結果を表示

ここではXPathを用います。「検証」で表示されたHTMLコードの選択行の上で右クリックメニューを開き、「Copy XPath」を選択した後ペーストして使用できます。

#検索ワードはコマンドライン引数で指定する
require 'nokogiri'
require 'open-uri'

abort"ワードが指定されていません" unless ARGV[0]

query=ARGV.join(" ")
url="https://www.google.com/search?q=#{query}&oe=utf-8&hl=ja"

doc=Nokogiri::HTML(open(URI.encode(url)))

#結果件数をスクレイピング
puts format"結果件数: %s",doc.xpath("//*[@id='resultStats']/text()")
puts
#検索結果をスクレイピング
doc.xpath('//h3/a').each_with_index do |link,idx|
puts format"(%2d)%s",idx+1,link.content
end

作例2: Yahoo!ニュースを最新10件表示

require"open-uri"
require"nokogiri"

url="https://news.yahoo.co.jp/list/?d="+Time.now.strftime("%Y%m%d")+"&mc=f&mp=f"

doc=Nokogiri::HTML(open(url))

for i in 1..10
#ニュースタイトルをスクレイピング
puts doc.xpath("//*[@id='main']/div[1]/div[1]/div[4]/ul/li[#{i}]/a/dl/dt").text
end

作例3: Amazon 本の売れ筋ランキングを表示

require"open-uri"
require"nokogiri"

url="https://www.amazon.co.jp/gp/top-sellers/books/ref=crw_ratp_ts_books"

doc=Nokogiri::HTML(open(url))

count=0

%w(critical nonCritical).each do |type|
for i in 1..20
#本のタイトルをスクレイピング(取得できない場合はスキップ)
next if (title=doc.xpath("//*[@id='zg_#{type}']/div[#{i}]/div[1]/div/div[2]/a/div").text.strip).empty?
count+=1
puts format("(%2d): %s",count,title)
end
end

スクレイピングでは、目的の部分を抽出して表示できる

以上のことから、スクレイピングは、多くの文字情報から必要な情報を抽出して表示するのに有効な手法であることが分かります。当記事で紹介したRubyスクリプトはターミナル上での利用なので、画像を取得して表示することはできませんでした。

画像の表示は、Ruby on Railsなどで、Rubyスクリプト内のスクレイピングによって、自作のWebページ上に反映させることで可能となります。

スクレイピングをより使いこなすために

当記事で紹介した他にも、株価情報や、荷物の配達情報のような、普段よく閲覧する情報をスクレイピングによって抽出したいということもあるでしょう。そこで、おしまいに、以下の書籍をご紹介します。

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

この書籍では、Rubyスクリプトによる、nokogiri、anemoneや、Yahoo!APIによる形態素解析などを用いたWebスクレイピングの手法が豊富に記載されています。また、掲載されているRubyスクリプトをWebページよりダウンロードすることができます。

テスト用のサーバーをつくるところからはじまって、応用までと意欲的な構成ですが、中身はanemoneとnokogiriの紹介を中心として、いろいろな例を出しているものの、著者のやりかたを教科書的に簡単に紹介しているようです。クローラーの作成をやった経験のある人(当然nokogiriもつかった経験ある)が、実務的な疑問があったり、他の人のうまいやり方を参考に発展させたい、というような場合は、この本には答はないかも知れません。ささっつと基礎をおさらいするにはいいかも知れませんが、詳しいことには深入りしていないので、実際にこれをみてクローラーをつくってみようという、初心者向けだと思います。

出典: https://www.amazon.co.jp/gp/customer-reviews/R1OCR40DNINP... |

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related