前述の記事で株の短期売買のために自分でツールを作ってみた話をしました。
今回はその中身について公開しようと思います。
ぶっちゃけスクレイピングっていうほど難しいことではないので結論のコード程度で簡単に実装できてしまいます。
ただし、当然対象サイトに対して負荷をかけることになったり注意点はきちんと把握しておきましょう(私の場合は個人利用に限っている認識)
※わざわざ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を使ってパースする
とってきたい要素(画像の赤丸の個所)の一覧をとってくる
まぁ書いてあるまんまなんですが・・・そのような概要になってます。
細かいコードの詳細についてはまた解説していきます!
コメント