Ruby on Rails でwebスクレイピングをする:その1

前述の記事で株の短期売買のために自分でツールを作ってみた話をしました。

今回はその中身について公開しようと思います。

ぶっちゃけスクレイピングっていうほど難しいことではないので結論のコード程度で簡単に実装できてしまいます。

ただし、当然対象サイトに対して負荷をかけることになったり注意点はきちんと把握しておきましょう(私の場合は個人利用に限っている認識)

※わざわざRailsで実装する必要もないんですが今後いろいろな機能も実装予定のためRailsで実装しました。

結論こんな感じのコードです

# frozen_string_literal: true

class TradingValueHighRankingsController < ApplicationController
  require 'open-uri'

  URL = 'https://finance.yahoo.co.jp/stocks/ranking/tradingValueHigh?market=all&term=daily'

  def show
    @ranking = load_ranking
  end

  private

  def load_ranking
    htmls = read_htmls
    docs = parse_htmls(htmls)
    pick_ranking_data(docs)
  end

  def read_htmls
    # 200位まで取得するため対象サイトの4ページ目までを読み込む
    (1..4).each_with_object([]) do |i, array|
      array << URI.parse(URL + "&page=#{i}").open.read
    end
  end

  def parse_htmls(htmls)
    htmls.each_with_object([]) do |html, array|
      array << Nokogiri::HTML.parse(html)
    end
  end

  def pick_ranking_data(docks)
    docks.each_with_object([]) do |doc, array|
      doc.css('table tbody tr').each do |element|
        array << element.at_css('ul li').children.text
      end
    end
  end
end

要件について

・とりあえずyahooファイナンスからデータをとってくる

・とってくるデータは1日の売買代金ランキングのうち上位200位まで

・とってくる情報は銘柄コードのみで問題ない

・株のツールの都合上50位ごとに区分けして一覧化しておきたい

以上!

どこの情報をとってきている??

具体的に言うと赤丸の銘柄コード一覧ですね。

これを4ページ分(1ページ50位まで表示されるので要件に従って200位まで)とってきてこれを自サーバーのページに表示させています。

すごーいざっくり処理概要

TradingValueHighRankingsControllerのshwアクションが呼ばれると(showも違和感なので多分indexが適切なアクション名だと思います。)

@rankingに出来高ランキングの情報を設定します(load_ranking)

load_rankingでは

200位分(yahooファイナンスの4ページ分)のHTML情報をとってくる

HTMLをNokogiriを使ってパースする

とってきたい要素(画像の赤丸の個所)の一覧をとってくる

まぁ書いてあるまんまなんですが・・・そのような概要になってます。

細かいコードの詳細についてはまた解説していきます!

コメント

タイトルとURLをコピーしました