LoginSignup
9
16

More than 3 years have passed since last update.

【rails】urlからサイトの情報を引き出す。【スクレイピング】

Last updated at Posted at 2017-06-05

不特定多数のサイトから、情報を取得したい!
なんとなくそんな気分になることもあるかと思います。
今回はスクレイピングでhtml情報を取得し、欲しい要素を抽出するの二段階と考えてみます。

・HTML情報の取得 -- Mechanizeを利用して、スクレイピングできるようにする。
・欲しい要素の抽出 --  headのmetaタグから情報を取得する。

head内は個人の趣味のページだとちゃんとmetaタグが記述されていないこともありますが、
SNSに取り上げられることを視野に入れたある程度規模の大きなサイトであればしっかりと記述してあります。
以下が参考です。↓

OGPとは
https://uideal.net/knowledge/glossary/ogp/

Mechanizeを利用して、スクレイピングできるように。

まずはmechanizeというgemをインストールします。

gemfileに以下を記述

gemfile
gem 'mechanize'

bundle updateして再起動しましょう。

mechanize(公式)
https://github.com/sparklemotion/mechanize

Rails スクレイピング手法 Mechanizeの使い方
http://qiita.com/shizuma/items/d04facaa732f606f00ff

headのmetaタグから情報を取得する。

まずはmetaタグではないですがページタイトルから。これは簡単です。

article_controller.rb
agent = Mechanize.new
page = agent.get(params[:article][:url])

title = page.title
#titleを取得

これで取得できます。簡単ですね。

次にサイトの概要ですが。これはmetaタグの中にあります。
metaタグなんて、普段触らないし、どう指定すればいいの?という方もいるかと思います。
中カッコ[]で指定します。

article_controller.rb
agent = Mechanize.new
page = agent.get(params[:article][:url])

content = page.at('meta[property="og:description"]')
#metaタグのうち、property="og:description"のものを取得

ストロングパラメータ内でまとめて取得できますね。

article_controller.rb
def create
  Article.create(article_params)
end


def article_params
  agent = Mechanize.new
  page = agent.get(params[:article][:url])
  content = page.at('meta[property="og:description"]')[:content]
  params.require(:article).permit(:url)params.require(:article).permit(:url).merge(title: page.title,text: content,source: site_name)
end

これでスクレイピングしたものを保存できます。用途に合わせて画像を取得してもいいかも知れません。その場合はいかが参考になるかと思います。

og:image 徹底解説、意味も設定画像スペックもこれでばっちり!2015年5月時点最新版
https://blog.sixapart.jp/2012-06/ogimage.html

9
16
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
16