class RakutenSecuritiesScraper::RakutenScraper

Public Class Methods

new(login_id, login_pw) click to toggle source
# File lib/rakuten_securities_scraper.rb, line 9
def initialize login_id, login_pw
  @login = {
    login_id: login_id,
    login_pw: login_pw
  }
end

Public Instance Methods

all_history() click to toggle source
# File lib/rakuten_securities_scraper.rb, line 168
def all_history
  @driver = get_selenium_driver(:chrome)
  wait = Selenium::WebDriver::Wait.new(timeout: 100)
  url = "https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html"
  @driver.get url
  @driver.find_element(id: "form-login-id").send_keys @login[:login_id]
  @driver.find_element(id: "form-login-pass").send_keys @login[:login_pw]
  @driver.find_element(id: "login-btn").click
  wait.until { @driver.find_element(id: "header-menu-button-asset") }
  @driver.action.move_to(@driver.find_element(id: "header-menu-button-asset")).perform
  wait.until { @driver.find_element(xpath: "/html/body/div[2]/div/div/div[2]/ul[1]/li[1]/ul/li[1]/a") }
  @driver.find_element(xpath: "/html/body/div[2]/div/div/div[2]/ul[1]/li[1]/ul/li[1]/a").click

  sleep 3
  span_select = Selenium::WebDriver::Support::Select.new(@driver.find_element(:id, "termCd"))
  span_select.select_by(:value, "ALL")

  @driver.find_element(css: "input[type='image']").click
  sleep 2
  rows = @driver.find_elements(xpath: "//tr")
  page_num = rows[8].text.scan(/(.+)件中/)[0][0].to_i
  trade_table_data @driver, page_num
rescue StandardError => e
  puts e
  @driver.quit
end
click_favorite(driver, code) click to toggle source
# File lib/rakuten_securities_scraper.rb, line 76
def click_favorite driver, code
  sleep 2
  driver.find_element(name: "dscrCdNm").clear
  driver.find_element(name: "dscrCdNm").send_keys code
  driver.find_element(name: "dscrCdNm").send_keys(:enter)
  sleep 2
  rows = driver.find_elements(xpath: "//tr")
  value = ""
  num = 0
  rows[3..rows.size - 1].each_with_index do |f, i|
    cells = f.find_elements(:css, "td").map { |a| a.text.strip.gsub(",", "") }
    value = i if cells[1] == code and cells[3] == "東証"
    num += 1
  end
  while value == ""
    driver.find_element(xpath: "//*[@id='str-main-inner']/table/tbody/tr/td/table/tbody/tr/td/form/ul/li[2]/a").click
    rows = driver.find_elements(xpath: "//tr")
    rows[3..rows.size - 1].each_with_index do |f, i|
      cells = f.find_elements(:css, "td").map { |a| a.text.strip.gsub(",", "") }
      value = i + num - 1 if cells[1] == code and cells[3] == "東証"
    end
  end
  driver.find_element(xpath: "//*[@id='#{value}']").click
  sleep 2
  driver.find_element(xpath: "//*[@id='str-main-inner']/table/tbody/tr/td/table/tbody/tr/td/form/div[3]/ul/li/a/img").click
  begin
    return "already exist" if driver.find_element(xpath: "//*[@id='err_msg']").text.include? "すでに登録済みの銘柄が含まれています。"
  rescue
  end
  driver
end
delete_favorite(page_num) click to toggle source
# File lib/rakuten_securities_scraper.rb, line 51
def delete_favorite page_num
  driver = login
  sleep 2
  driver.action.move_to(driver.find_element(id: "gmenu_domestic_stock")).perform
  sleep 2
  driver.find_element(id: "gmenu_domestic_stock").click
  sleep 2
  driver.find_element(link_text: "お気に入り銘柄").click
  sleep 2
  driver.find_element(link_text: page_num).click
  sleep 2
  driver.find_element(name: "editAnchor").click
  sleep 2
  table = driver.find_element(class_name: "tbl-data-01")
  rows = table.find_elements(xpath: "//tr")
  last_row = rows.size - 2
  rows[2..last_row].each do |row|
    driver.find_element(id: "line_delete_button_1").click
    driver.switch_to.alert.accept
    sleep 1
  end
  driver.find_element(id: "prc_save_button1").click
  { status: "success" }
end
favorite(num, codes) click to toggle source
# File lib/rakuten_securities_scraper.rb, line 26
def favorite num, codes
  driver = login
  sleep 2
  driver.action.move_to(driver.find_element(id: "gmenu_domestic_stock")).perform
  sleep 2
  driver.find_element(id: "gmenu_domestic_stock").click
  sleep 2
  driver.find_element(link_text: "お気に入り銘柄").click
  sleep 2
  driver.find_element(link_text: num).click
  sleep 2
  driver.find_element(name: "editAnchor").click
  sleep 2
  codes.each do |code|
    driver.find_element(name: "addAnchor").click
    sleep 1
    driver.switch_to.frame driver.find_element(:id, "TB_iframeContent")
    result = click_favorite driver, code.to_s
    sleep 1
    puts "hey" if result == "already exist"
  end
  driver.find_element(id: "prc_save_button1").click
  { status: "success" }
end
get_selenium_driver(mode = :chrome) click to toggle source
# File lib/rakuten_securities_scraper.rb, line 287
def get_selenium_driver(mode = :chrome)
  case mode
  when :firefox_remote_capabilities
    firefox_capabilities = Selenium::WebDriver::Remote::Capabilities.firefox
    Selenium::WebDriver.for(:remote, url: "http://hub:4444/wd/hub", desired_capabilities: firefox_capabilities)
  when :firefox
    Selenium::WebDriver.for :firefox
  else
    options = Selenium::WebDriver::Chrome::Options.new
    # options.add_argument("--ignore-certificate-errors")
    options.add_argument("--disable-popup-blocking")
    options.add_argument("--disable-translate")
    # options.add_argument("-headless")
    Selenium::WebDriver.for :chrome, options: options
  end
end
login() click to toggle source
# File lib/rakuten_securities_scraper.rb, line 16
def login
  driver = get_selenium_driver(:chrome)
  url = "https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html"
  driver.get url
  driver.find_element(id: "form-login-id").send_keys @login[:login_id]
  driver.find_element(id: "form-login-pass").send_keys @login[:login_pw]
  driver.find_element(id: "login-btn").click
  driver
end
todays_history() click to toggle source
# File lib/rakuten_securities_scraper.rb, line 195
def todays_history
  driver = get_selenium_driver(:chrome)
  wait = Selenium::WebDriver::Wait.new(timeout: 100)
  url = "https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html"
  driver.get url
  driver.find_element(id: "form-login-id").send_keys @login[:login_id]
  driver.find_element(id: "form-login-pass").send_keys @login[:login_pw]
  driver.find_element(id: "login-btn").click
  sleep 2
  # wait.until { driver.find_element(id: "header-menu-button-asset") }
  driver.action.move_to(driver.find_element(id: "header-menu-button-asset")).perform
  sleep 2
  wait.until { driver.find_element(xpath: "/html/body/div[2]/div/div/div[2]/ul[1]/li[1]/ul/li[1]/a") }
  sleep 2
  driver.find_element(xpath: "/html/body/div[2]/div/div/div[2]/ul[1]/li[1]/ul/li[1]/a").click
  sleep 3
  driver.find_element(css: "input[type='image']").click
  sleep 2
  rows = driver.find_elements(xpath: "//tr")
  begin
    page_num = rows[8].text.scan(/(.+)件中/)[0][0].to_i
  rescue
    return "no data"
  end
  trade_table_data driver, page_num
ensure
  driver.quit
end
todays_order() click to toggle source
# File lib/rakuten_securities_scraper.rb, line 108
def todays_order
  driver = get_selenium_driver(:chrome)
  wait = Selenium::WebDriver::Wait.new(timeout: 100)
  url = "https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html"
  driver.get url
  driver.find_element(id: "form-login-id").send_keys @login[:login_id]
  driver.find_element(id: "form-login-pass").send_keys @login[:login_pw]
  driver.find_element(id: "login-btn").click
  sleep 2
  driver.action.move_to(driver.find_element(id: "gmenu_domestic_stock")).perform
  sleep 2
  driver.find_element(id: "gmenu_domestic_stock").click
  sleep 2
  driver.find_element(id: "nav-sub-menu-order-arrow").click
  wait.until { driver.find_element(xpath: "//*[@id='str-main-inner']/table/tbody/tr/td/form/div[2]/div/ul/li[3]/a") }
  driver.find_element(xpath: "//*[@id='str-main-inner']/table/tbody/tr/td/form/div[2]/div/ul/li[3]/a").click
  sleep 2
  span_select = Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "orderStatus"))
  span_select.select_by(:value, "5")
  sleep 1
  driver.find_element(css: "input[type='image']").click
  sleep 2
  tables = driver.find_elements(xpath: "//tr")
  page_num = driver.find_element(class_name: "mtext").text.scan(/(.+)件中/)[0][0].to_i
  row_nums = (21..(21 + (page_num * 3) - 1)).to_a
  records = []
  row_nums.each_slice(3).to_a.map do |col_num|
    detail = {}
    tables[col_num[0]..col_num[2]].map.with_index do |row, i|
      cells = row.find_elements(:css, "td").map(&:text)
      case i
      when 0
        detail[:order_id] = cells[0] if cells[0]
        detail[:order_status] = cells[1] if cells[1]
        detail[:order_date] = cells[2] if cells[2]
        detail[:stock_name] = cells[3].split("\n")[0] if cells[3]
        detail[:code] = cells[3].split("\n")[1].split(" ")[0] if cells[3]
        detail[:market] = cells[3].split("\n")[1].split(" ")[1] if cells[3]
        detail[:trade_type] = cells[4] if cells[4]
        detail[:buy_sell] = cells[5] if cells[5]
        detail[:order_amount] = cells[7] if cells[7]
        detail[:unit_price] = cells[8] if cells[8]
        detail[:executed_price] = cells[8] if cells[8]
      when 1
        detail[:order_condition] = cells[2] if cells[2]
        detail[:account_type] = cells[3] if cells[3]
        detail[:executed_price] = cells[5] if cells[5]
        detail[:fee] = cells[6] if cells[6]
      else
        detail[:order_expire_date] = cells[2] if cells[2]
        detail[:order_type] = cells[3] if cells[3]
      end
      records << detail
    end
  end
  records
ensure
  driver.quit
end
trade_table_data(driver, page_num) click to toggle source
# File lib/rakuten_securities_scraper.rb, line 224
def trade_table_data driver, page_num
  run_times = page_num.divmod(20)
  trade_records = []
  (1..run_times[0] - 1).each do |f|
    rows = driver.find_elements(xpath: "//tr")
    rows[10..29].map do |row|
      cells = row.find_elements(:css, "td").map { |a| a.text.strip.gsub(",", "") }
      trade_records << {
        bit_date: cells[0].split("\n")[0],
        gain_date: cells[0].split("\n")[1],
        stock_name: cells[1].split("\n")[0],
        code: cells[1].split("\n")[1].split(" ")[0],
        market: cells[1].split("\n")[1].split(" ")[1],
        account: cells[2],
        trade_type: cells[3].split("\n")[0],
        buy_sell: cells[3].split("\n")[1],
        credit: cells[4].split("\n")[0],
        due: cells[4].split("\n")[1],
        stocks: cells[5].split("\n")[0].gsub(" 株", ""),
        price: cells[5].split("\n")[1],
        fee: cells[6].split("\n")[0],
        tax: cells[6].split("\n")[1],
        charge: cells[7].split("\n")[0],
        tax_type: cells[7].split("\n")[1],
        total_price: cells[8]
      }
    end
    puts trade_records
    return trade_records if page_num < 20
    driver.find_element(link: "次の20件").click
  end
  sleep 2
  begin
    driver.find_element(link: "次の#{run_times[1]}件").click
  rescue
    return trade_records
  end
  rows = driver.find_elements(xpath: "//tr")
  rows[10.."1#{run_times[1]}".to_i - 1].map do |row|
    cells = row.find_elements(:css, "td").map { |a| a.text.strip.gsub(",", "") }
    trade_records << {
      bit_date: cells[0].split("\n")[0],
      gain_date: cells[0].split("\n")[1],
      stock_name: cells[1].split("\n")[0],
      code: cells[1].split("\n")[1].split(" ")[0],
      market: cells[1].split("\n")[1].split(" ")[1],
      account: cells[2],
      trade_type: cells[3].split("\n")[0],
      buy_sell: cells[3].split("\n")[1],
      credit: cells[4].split("\n")[0],
      due: cells[4].split("\n")[1],
      stocks: cells[5].split("\n")[0].gsub(" 株", ""),
      price: cells[5].split("\n")[1],
      fee: cells[6].split("\n")[0],
      tax: cells[6].split("\n")[1],
      charge: cells[7].split("\n")[0],
      tax_type: cells[7].split("\n")[1],
      total_price: cells[8]
    }
  end
  trade_records
end