【5分で理解】Rubyでスクレイピングの基礎を解説!

あなたはスクレイピングをご存知ですか?

このページを見ているという事は多少興味や知識があって検索をし、このページにたどり着いたのだと思います。

スクレイピングに興味があるけど、何かわからない。。
実際にスクレイピングをしてみたい!

とお考えの方はこのページをみれば解決することができるでしょう。

この記事では、

・スプレイピングとは
・スプレイピングの活用法
・Nokogiriでスプレイピングする方法
・スプレイピングの注意点

などについて解説いたします。

目次

スクレイピングとは

スクレイピングとはウェブサイトから情報を抽出したり、抽出した情報を加工して使用する技術のことを言います。

スクレイピングはそれほど難しい技術ではありませんが、今回スクレイピングに使用する言語であるRubyの知識以外にもう一つ、HTMLの知識も必要になってきます。

実は、このスクレイピングはただ取り出すだけでなく、HTML要素として取得されます。

HTMLタグで取得できることは非常に便利なのですが、取得したWEBデータがHTMLタグ付きであると扱いにくいため、多くはその情報を加工して使用します。

スクレイピングの活用法

スクレイピングはwebの情報を取得できるためそういった情報を簡単に取得することができます。

例えば、web上にある天気情報やホームページの更新などを取得することができます。

常時、変更されていく情報をリアルタイムで取得することができるため、そういった使用の仕方をするといいでしょう。

スクレイピングの方法

メインとなるスクレイピングの方法について説明していきましょう。

nokogiriとは

まず、使用するライブラリを紹介します。

以下の2つが今回使用するライブラリです。

  • open-uri
  • nokogiri(gem)

open-uriは標準で入っているライブラリなので特別な作業は必要ありません。

新しく入れる必要があるのは「nokogiri」というライブラリです。

nokogiriはRubyのスクレイピングでよく使われるライブラリで、HTMLやXMLの情報を解析して特定の要素を抽出することができます。

nokogiriのインストールは以下のコマンドで行います。

$ gem install nokogiri

インストールできれば準備完了です。実際にコードを書いていきましょう。

nokogiriでスクレイピング

全てのHTMLを取得

以下のコードをコピーして実行してみてください。

#!/usr/bin/env ruby
#-*- coding: utf-8 -*-

#webに接続するためのライブラリ
require "open-uri"
#クレイピングに使用するライブラリ
require "nokogiri"

#クレイピング対象のURL
url = "https://www.sejuku.net/blog/"
#取得するhtml用charset
charset = nil

html = open(url) do |page|
  #charsetを自動で読み込み、取得
  charset = page.charset
  #中身を読む
  page.read
end

# Nokogiri で切り分け
contents = Nokogiri::HTML.parse(html,nil,charset)

puts contents

実行結果

<!DOCTYPE html>
<!–[if IE 8]><html class=”ie8″><![endif]–><!–[if IE 9]><html class=”ie9″><![endif]–><!–[if gt IE 8]>



<script type=”text/javascript” src=”https://www.sejuku.net/blog/wp-includes/js/wp-embed.min.js?ver=4.6.1″></script>
</body>
</html>

これを実行することで上記のようにすべての要素が取得できると思います。

Nokogiri::HTML.parseは読み込んだHTMLを解析して出力しています。

トップページのタイトルなどを取得

上記のままだと情報が扱いにくいので、試しに「タイトル」のみを取得してみましょう。 読み取った「contens」にタイトルの属性を付加します。

#!/usr/bin/env ruby
#-*- coding: utf-8 -*-

#webに接続するためのライブラリ
require "open-uri"
#クレイピングに使用するライブラリ
require "nokogiri"

#クレイピング対象のURL
url = "https://www.sejuku.net/blog/"
#取得するhtml用charset
charset = nil

html = open(url) do |page|
  #charsetを自動で読み込み、取得
  charset = page.charset
  #中身を読む
  page.read
end

# Nokogiri で切り分け
contents = Nokogiri::HTML.parse(html,nil,charset)

puts contents.title

タイトルが簡単に取得できたと思います。

スクレイピングの注意点

スクレイピングは確かに便利ですが、注意しなければいけない点もあります。

著作権

まず、スクレイピングする時に注意しないといけないことは著作権です。

webには多くの情報があり、今回のスクレイピングのように簡単に情報を抜き取ることができます。

そのため、取得したい情報があるときはそのwebサイトの著作権に気を付けましょう。

抽出した情報を利用する際は、サイトの管理者に問い合わせたり、利用規約を確認するなどして、著作権について確認しましょう。

個人での使用はもちろんのこと、特に商用や社内で使用する際にはトラブルになる危険性がありますので、気を付けるようにしてください。

サーバー負荷

実はここが大きく注意しておいてほしい点になります。

このスクレイピングという技術は大量のリクエストを送るのでサーバーに負荷が大きくかかるものになります。

大量のリクエストと言ってもピンとこないかもしれませんが、PCの処理速度は人間の何倍にもなり、簡単に大量のリクエストを送ることができます。

スクレイピングはwebから情報をとるため、取得するときにリクエストを送ります。

リクエストは人間でいいう、webを閲覧することと同義です。

大量の閲覧のリクエストが同時に来た場合、サーバーがダウンしてしまうことがあります。つまりは、相手のサーバーをダウンさせてしまうかもしれません。

これはDos攻撃というwebのハッキング攻撃に相当する可能性があります。

そうならないためにはリクエストを小分けにするなどの工夫が必要になります。

大量のリクエストを送るスクレイピングを行うと逮捕される場合があるので気を付けてください。

まとめ

いかがだったでしょうか。

スクレイピングは非常に簡単でしかもシンプルだったと思います。

使い道も大きく、いろいろな部分で応用できるかと思います。

重ねてになりますが、気を付けていただきたいのは犯罪を起こさないことです。

繰り返し大量のリクエストを短時間で送信してスクレイピングするとDos攻撃というハッキング手法になることがあります。

リクエストを小分けにしたり、一定時間ごとにリクエストしたりして、スクレイピング先のサーバーに負荷をかけないように配慮しましょう!

この記事を書いた人

いろいろな言語を中心に勉強しながら記事を発信するエンジニアライター。
本職は化学だが、実はプログラミングの方が好き。
化学のノートの端っこに手書きで思いついた処理を書いてしまうタイプの人。
え、手書きでプログラミングとか普通なんだけど。
SECCONや脆弱性が好き。
楽しいよね、Wireshark。

目次