「Rubyではじめるシステムトレード」のPython版開発5

投稿者: | 2024年1月11日

2年ほど放置してしまったので、以前動いていたコードが動かなくなっている。Seleniumのversionが上がったため、下記投稿の”stock_list_maker.py”をそのまま実行するとエラーがでる。エラーのメッセージは”TypeError: WebDriver.init() got multiple values for argument ‘options’”というものだ

「Rubyではじめるシステムトレード」のPython版開発3

調べてみると問題解決には、下記ブログが大変有益であった。

SeleniumとChromeDriverManagerについて(備忘録)

Selenium4 WebDriver の executable_path 使用に伴う警告の回避方法

以下のようにコードを修正すると、上記のエラーが出なくなったが、今度はChromeDriverのバージョンが古すぎるエラーが出るようになった。

import bs4
import traceback
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

CHROMEDRIVER = "C:/Users/itot/chromedriver.exe"
INTERVAL_TIME = 2

class StockListMaker:
    def __init__(self, market):
        self.market = market
        self.data_dir = "data"
        self.stock_info = []
        self.options = Options()
        self.options.add_argument('--hedless')
        self.service = Service(executable_path=CHROMEDRIVER)
        self.driver = webdriver.Chrome(service=self.service, options=self.options)
    
    def get_stock_info(self, code):
        page = self.open_page(code)
        data = self.parse(page)
        if not data:
            return
        if "None" in data:
            return
        data.insert(0,code)
        print(data)
        self.stock_info.append(data)

    def save_stock_list(self):
        with open('./list.txt', 'w', encoding='utf-8') as f:
            print(*self.stock_info, sep='\n', file=f)
        f.close()

    ## Private 
    def open_page(self, code):
        try:
            base_url = "https://kabutan.jp/stock/?code="
            url = base_url + code
            self.driver.get(url)
            self.driver.implicitly_wait(10)
            page_source = self.driver.page_source
            time.sleep(INTERVAL_TIME)
            return page_source
        except Exception as e:
            print("Exception\n" + traceback.format_exc())
            return None

    def parse(self, page):
        try:
            soup = bs4.BeautifulSoup(page, features='lxml')
            base_elem = soup.find("div", class_="si_i1_1")
            if base_elem:
                market = None
                unit = None
                market_elem = base_elem.find("span", class_="market")
                unit_elem = soup.find("div", id="stockinfo_i2")
                if market_elem:
                    market = market_elem.text
                if unit_elem:
                    unit = unit_elem.find_all("dd")
                data = [market,unit[1].text]
                return data
        except Exception as e:
            print("Exception\n" + traceback.format_exc())
            return None

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です