Python、 jupyter labを使って株価取得をする自動化プログラム。
株価を取得するコードを勉強中、環境はMacOS BigSur
jupyter labを使う理由は視覚的にPythonを実行できて、株価チャートが作成できるから。でもチャートを作る予定は今の所ない。
・現在の管理者のスキル:jupyterLab初心者
・症状
seleniumはpip3でインストールしたのに、Labでエラーになる。
ModuleNotFoundErrorエラー
—————————————————————————
ModuleNotFoundError Traceback (most recent call last)
in
4 import sys
5 import time
—-> 6 from selenium import webdriver
7 import csv
8 import datetime
ModuleNotFoundError: No module named ‘selenium’
・原因
Anaconda NavigatorからjupyterLabを起動している。
つまり、AnacondaとPipでインストールしたライブラリは別ものらしい。
なのでAnacondaで使う場合とPipで使う場合にそれぞれインストールする
必要があるということ
なので、Anacondaからタ~ミルを起動してからSeleniumを別途インストールする。
AnacondaからNew Terminalを起動する。
するとブラウザの中にTerminalが表示される。(OSXでのターミナルとは別物)
そして、chromedriver等を入れて(ずっと下の方に詳細を記述)、ChromeDriverのパスを記載すること(webdriver.Chrome(‘/usr/local/bin/chromedriver’))
・次のエラーが発生
ここではじめのPythonコードを実行するとライブラリは解消したが他のライブラリのエラーが発生
??
もともとのAnacondaのシステムでのエラーっぽい?
そこで、Anacondaのターミナルから以下を実行してみた
conda install -c conda-forge jupyterlab
変わらず??
一旦Anaconda終了してから再度やってみる。2020/06/03
エラーここから
--------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) ~/opt/anaconda3/lib/python3.7/site-packages/selenium/webdriver/common/service.py in start(self) 75 stderr=self.log_file, ---> 76 stdin=PIPE) 77 except TypeError: ~/opt/anaconda3/lib/python3.7/subprocess.py in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, encoding, errors, text) 799 errread, errwrite, --> 800 restore_signals, start_new_session) 801 except: ~/opt/anaconda3/lib/python3.7/subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session) 1550 err_msg += ': ' + repr(err_filename) -> 1551 raise child_exception_type(errno_num, err_msg, err_filename) 1552 raise child_exception_type(err_msg) FileNotFoundError: [Errno 2] No such file or directory: 'chromedriver': 'chromedriver' During handling of the above exception, another exception occurred: WebDriverException Traceback (most recent call last) <ipython-input-1-30c1f880eba7> in <module> 9 10 # 仮想ブラウザ起動、URL先のサイトにアクセス ---> 11 driver = webdriver.Chrome() 12 driver.get('https://www.rakuten-sec.co.jp/') 13 time.sleep(1) ~/opt/anaconda3/lib/python3.7/site-packages/selenium/webdriver/chrome/webdriver.py in __init__(self, executable_path, port, options, service_args, desired_capabilities, service_log_path, chrome_options, keep_alive) 71 service_args=service_args, 72 log_path=service_log_path) ---> 73 self.service.start() 74 75 try: ~/opt/anaconda3/lib/python3.7/site-packages/selenium/webdriver/common/service.py in start(self) 81 raise WebDriverException( 82 "'%s' executable needs to be in PATH. %s" % ( ---> 83 os.path.basename(self.path), self.start_error_message) 84 ) 85 elif err.errno == errno.EACCES: WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
エラーここまで
>>>
要するに「chromedriver」が入っていないか、正しいバージョンではない?
・対処したこと>>できた
参考サイト
https://qiita.com/w5966qzh/items/4c1164bd7c611820c187
1.Chromeに合ったバージョンのwebdriverをダウンロードしてインストールした
2-4はターミナル
2.brew install chromedriver
3.brew tap homebrew/cask
4.brew cask install chromedriver
Labにて以下のコードを変更
5.webdriver.Chrome()
↓
webdriver.Chrome(‘/usr/local/bin/chromedriver’)
に変更する
以下詳細
次にターミナル(通常)で以下を実行
brew install chromedriver
—エラーがでる。これは参考サイトにも書いてあった
Error: No available formula with the name "chromedriver" It was migrated from homebrew/core to homebrew/cask. You can access it again by running: brew tap homebrew/cask And then you can install it by running: brew cask install chromedriver —
brew tap homebrew/cask
をターミナルで実行する
brew cask install chromedriver
をターミナルで実行する
Updating Homebrew... ==> Downloading https://chromedriver.storage.googleapis.com/83.0.4103.39/chromed ######################################################################## 100.0% ==> Verifying SHA-256 checksum for Cask 'chromedriver'. ==> Installing Cask chromedriver ==> Linking Binary 'chromedriver' to '/usr/local/bin/chromedriver'. 🍺 chromedriver was successfully installed!
ここで
「Linking Binary ‘chromedriver’ to ‘/usr/local/bin/chromedriver’.」
にあるパスを
driver = webdriver.Chrome(‘/usr/local/bin/chromedriver’)
のように指定する。ShiftキーとEnterで
これで実行できた
これでクロムが立ち上がる
楽天証券から株価を取得した
当然ながら楽天証券に口座を開設していないとログインはできない。またお気に入り登録に銘柄を登録していないと株価は取得できない
参考サイト
https://qiita.com/shiratatsu/items/9f390970e38b66f0c290
#楽天証券から株価取得 #楽天証券からお気に入り登録している銘柄の情報をスクレイピングする #コマンド入力してtabを押すと補完してくれる。Tabを押さないときは別のツール等をインストールする必要がある #https://qiita.com/shiratatsu/items/9f390970e38b66f0c290 #import sys import time from selenium import webdriver import csv import datetime # 仮想ブラウザ起動、URL先のサイトにアクセス driver = webdriver.Chrome('/usr/local/bin/chromedriver')#ここでエラーになったらパスが違うかchromedriverをインストールする driver.get('https://www.rakuten-sec.co.jp/') time.sleep(1) title = driver.title print(title) # ログイン本来は見せないのでブログではXXXXにする el = driver.find_element_by_name("loginid") el.clear() el.send_keys('XXXXX')# 本来は見せない パスワード el = driver.find_element_by_name("passwd") el.send_keys('XXXXXXX') # 本来は見せない パスワード el = driver.find_element_by_name("loginform") el.submit() time.sleep(1) # お気に入り銘柄ページに遷移 el = driver.find_element_by_id("gmenu_domestic_stock") el.click() time.sleep(3)#待機状態にしないと読み込みが追いつかず、次の画面が表示されない #el = driver.find_element_by_id("jp-stk-top-btn-info-prc-reg-lst")#ここでエラーというかもしかして待ち時間がなかったからかも el = driver.find_element_by_link_text('お気に入り銘柄')# お気に入り銘柄というリンクテキストをクリックする el.click() time.sleep(1) ## # 銘柄情報を取得 dataList = [] #pageCount = driver.find_elements_by_class_name("number") pageCount = 4 for pn in range(0,pageCount):#for pn in range(0,len(pageCount)): print(str(pn+1)+":ページ作業中") pageElem = driver.find_elements_by_class_name("number") pageElem[pn].click() time.sleep(2) # テーブル内容取得 try: tableElem = driver.find_element_by_class_name("tbl-data-01") trs = tableElem.find_elements_by_tag_name("tr") # ヘッダ行は除いて取得 for i in range(1,len(trs)): tds = trs[i].find_elements_by_tag_name("td") line = [] for j in range(0,len(tds)): line.append(tds[j].text) dataList.append(line) # お気に入り登録がないページはスキップ except Exception: print(str(pn+1)+":ページの要素が見つかりませんでした") ## #企業名が2行あるので1つは取得しないようにする[i][0]は空欄なら取得にした。 dataList2 = [] #j = 0 for i in range(0,len(dataList)): if dataList[i][0] == '': dataList2.append(dataList[i]) #j = j+1 #ここまで、2行を1行にするEnd time.sleep(1) # ファイル名で使用する日付情報を取得 now = datetime.datetime.now() YYYY = str(now.year) MM = str(now.month) DD = str(now.day) # 追加モードでファイルをオープンし、1行ずつ書き込み(下記はタブ区切り)'\t with open('{}'+YYYY+MM+DD+'-BrandList.csv', 'a') as f: writer = csv.writer(f, delimiter=',') writer.writerows(dataList2)#dataList # ファイルクローズ f.close() print(dataList[0]) #print(dataList[0][0])#行、列なので0列が空欄なら取得にする。0列に文字列があると取得しないようにする #print(dataList[0][1]) print("作業終了")
CSVをNumbersで開いたところ