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