おーしまブログ

プログラミングやってます

<rails>スクレイピングで自動車のマイナーチェンジ情報を載せる

こんにちは、おーしまです。

今回は、スクレイピングに関してです。

スクレイピングとは、他のサイトのHTMLの要素を持ってくることを言います。

自動車レビューサイトに、自動車のマイナーチェンジなどの最新情報を載せたかったので、スクレイピングベストカーというサイトの情報を掲載したいと思います。スクレイピング著作権に関しての問題ですが、調べたところ、取ってきたデータを悪用したり、大量にアクセスすることがなければ、問題はないらしいので、そのまま掲載しました。

f:id:tomo_bb_aki0118115:20201111232300p:plain

このような感じになりました。

やり方を説明すると、

まず、mechanizeと言うgemを入れます。

gem 'mechanize'

で、bundle install。

次に、私の場合は、scraping.rbというモデルを作りました。

class Scraping

  def self.get_url
    agent = Mechanize.new
    page = agent.get("https://bestcarweb.jp/tags/~~~~~~~~~~~~~~~~~~~~~~~")
    elements = page.links_with(:href => /news/)
  end

end

Scrapingクラスにget_urlというクラスメソッドを作っています。
次に、Mechanize.newでインスタンスを生成しています。
次に、.get("URL")、で取ってきたい要素があるページのURLを記述します。(私の場合は、ベストカーのマイナーチェンジのページのURL)
次に、そのページの中の欲しい要素を取り出します。
.links_with(:href => /news/)、でhref属性に/news/が含まれているリンクを全て取り出しています。
他にも、要素を取り出す方法はいくつかあるので、調べてみてください。

  def index
    @cars = Car.all.limit(14).includes(:user, :tags).order('created_at DESC')
    @elements = Scraping.get_url
  end

コントローラーで、indexアクションの際に掲載するので、Scraping.get_urlで先ほどのモデルのget_urlメソッドを呼び出し、@elementsに入れています。

<% @elements.slice(0,5).each do |element|%>
  <li><%= link_to "#{element}", element.href %></li>
<% end %>

あとは、ビューでこのように表示すれば完成です。
スクレイピングをすると、要素は配列になって、取ってくるのでeachメソッドで繰り返し表示しています。しかし、量が多かったので、slice(0,5)で最新の情報を5つに絞って表示するようにしました。どうやらa要素として取ってきているわけではないのか、<%=element%>だけでは、リンクにならなかったのでlink_toでリンクにしています。


今回はここまでです。
それではまた〜

ここはどこ おれはだれ それに近いものがあんだよ 始めようとした奴らも迷い始めてる 怖がらせないでよ そりゃ甘くはないけど まだまだ 夢見ていい世界なんでしょ {UVERwould「ハイ!問題作」}