こんにちは、おーしまです。
今回は、スクレイピングに関してです。
スクレイピングとは、他のサイトのHTMLの要素を持ってくることを言います。
自動車レビューサイトに、自動車のマイナーチェンジなどの最新情報を載せたかったので、スクレイピングでベストカーというサイトの情報を掲載したいと思います。スクレイピングの著作権に関しての問題ですが、調べたところ、取ってきたデータを悪用したり、大量にアクセスすることがなければ、問題はないらしいので、そのまま掲載しました。
このような感じになりました。
やり方を説明すると、
まず、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でリンクにしています。
今回はここまでです。
それではまた〜