pythonコード、株探のチャート部分をキャプチャ、CSV読み込み
株探のチャート部分をキャプチャ
目的:株探のチャート部分をキャプチャする。
レイアウト変更されたら数値を変更
銘柄コードは、CSVファイルに記載し、見出し1行目、2行目以降にコードを記載。
コメントが多いのは、後学のためと必要に応じて修正がすぐにできるようにしたいので、汚いコードになってる
環境:Windows10 Python、selenium,pandas
コード中にコメントが多く汚いのは、後学のためと必要に応じて修正がすぐにできるようにしたいから。
キャプチャ後の画像
キャプチャ前は余白が多い
以下Pythonコード、スクロールは地道にずらして適した位置を割り出したので効率が悪かったけど思い当たる方法を知らんかった
>追記、2025/02/27 更に改良、日付をファイル名に追加した。capture_日付_コード銘柄名.pngのようになるcapture_2025年02月27日(木)_5301東海カーボン.png
参考サイト
https://atmarkit.itmedia.co.jp/ait/articles/2111/09/news015.html
CSVはタブ区切りに変更(delimiter='\t')、辞書dicを使って連想配列にして、「コード (tab)銘柄名」で管理する。これでコード銘柄名としたファイル名にする
import os from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By #from webdriver_manager.chrome import ChromeDriverManager import time import datetime #https://atmarkit.itmedia.co.jp/ait/articles/2111/09/news015.html import pandas as pd#pip でインストールした #目的:株探のチャート部分をキャプチャする。レイアウト変更されたら数値を変更 #銘柄コードは、CSVファイルに記載し、見出し1行目、2行目以降にコードを記載。 #コメントが多いのは、後学のためと必要に応じて修正がすぐにできるようにしたいので、汚いコードになってる # #改良、 #辞書dicを使って連想配列にして、「コード (tab)銘柄名」で管理する。これでコード銘柄名としたファイル名にする #タブ区切りなのでdelimiter='\t'にした #Googleスプレッドシートからコードと銘柄名の行列をコピーしてテキストエディタにそのままペーストできる。 #参考サイト #https://choco-weblog.com/selenium_python_full-screen-capture/ #2025/02/21 スクロールがうまくできなかったのでコメントになってる #時間があれば修正する options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--hide-scrollbars') #driver = webdriver.Chrome(ChromeDriverManager().install(), options=options) driver = webdriver.Chrome() driver.implicitly_wait(10) capture_save_dir = r"C:\Users\mased\Pictures\Screenpresso" def full_capture(filename, url): # ################# # キャプチャ取得 株探のチャート部分をキャプチャする。レイアウト変更されたら数値を変更 # ################# driver.set_window_size(690,920)#375,300 #filename += '_sp' #iw = '' #ih = '' #height = '' driver.get(url) time.sleep(3) #ページの高さを取得 #height = driver.execute_script("return document.body.scrollHeight") #ループ処理で少しづつ移動 #for x in range(1,height): # driver.execute_script("window.scrollTo(0, "+str(x)+");") driver.execute_script("window.scrollTo(0, "+str(280)+");") #iw = driver.execute_script("return document.body.clientWidth") #ih = driver.execute_script("return document.body.clientHeight") #ih += 100 # 画面下部が途中で切れないように余分に100px分プラス #time.sleep(3) #driver.set_window_size(iw, ih) driver.save_screenshot(capture_save_dir + '//' + filename + '.png') print(filename) time.sleep(2) #フル画面キャプチャ取得対象サイト # ################# # MAIN # ################# if __name__ == "__main__": t_delta = datetime.timedelta(hours=9) JST = datetime.timezone(t_delta, 'JST') now = datetime.datetime.now(JST) # 曜日を含む日付 #dYmd = now.strftime('%Y年%m月%d日(%a)') #print(d) # 2021年11月04日(Thu) #https://atmarkit.itmedia.co.jp/ait/articles/2111/09/news015.html d_week = {'Sun': '日', 'Mon': '月', 'Tue': '火', 'Wed': '水', 'Thu': '木', 'Fri': '金', 'Sat': '土'} key = now.strftime('%a') w = d_week[key] dYmd = now.strftime('%Y年%m月%d日') + f'({w})' #f'{now:%Y年%m月%d日}({w})' #print(dYmd) # 2021年11月04日(木) #例)full_capture('キャプチャ画像ファイル名', 'ページURL') #codeList=[] #リスト配列は、Pandasを使ってCSV読み込みにしたほうが楽だろう。python_rakuten_trade02.pyを参考にして。2025/02/25 #codelist.csvを作成済 #1行目 "コード"見出し #2行目からデータ "5803" #次に、辞書を使って連想配列にして、「コード、銘柄名」で管理する。これでコード銘柄名としたファイル名にする #タブ区切りなのでdelimiter='\t'にした dicCodeList={}#辞書作成、「コード、銘柄名」の2列を扱う 重複は上書きになる、ただしキーは銘柄名なので、銘柄名が少しでも違うと登録できる df = pd.read_csv(r"C:\Users\mased\Documents\株2025\約定照会\python\codelist.csv",usecols=["コード","銘柄名"],delimiter='\t') #複数見出しがあればusecolsに追加できる #例 usecols=["約定日","取引","売買","コード","銘柄名","約定単価(円)"] 必要な見出し列だけで選べる。全部書く必要はない。 mydataFrame=pd.DataFrame(df) for i in range(len(df)): code=mydataFrame.loc[i, 'コード'] meigara=mydataFrame.loc[i, '銘柄名'] #codeList.append(str(code)) #dicCodeList[meigara]=code dicCodeList[code]=meigara #コードをキーにしたら重複が上書きでいいのかな、後で試す #codeList={'6501'} #captureName="" #銘柄名の重複は上書きになる、ただしキーは銘柄名なので銘柄名が簡略されたら登録できるので、 # コードの重複を削除するようにしたほうがよさそう #と思ったら、現在の dicCodeList[meigara]=code を逆に したらいいのかな、後で試す captureURL='https://kabutan.jp/stock/chart?code=' for k,v in dicCodeList.items():#タプルで取得 #full_capture('capture_'+ str(v) + k, captureURL+str(v)) full_capture('capture_'+str(dYmd)+'_'+ str(k) + v, captureURL+str(k)) print("キャプチャ取得が完了しました") driver.close() driver.quit()
CSVはタブ区切りに変更(delimiter='\t')、辞書dicを使って連想配列にして、「コード (tab)銘柄名」で管理する。これでコード銘柄名としたファイル名にする
ファイル名は以下のようにコード+銘柄名になる
import os from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By #from webdriver_manager.chrome import ChromeDriverManager import time import pandas as pd#pip でインストールした #目的:株探のチャート部分をキャプチャする。レイアウト変更されたら数値を変更 #銘柄コードは、CSVファイルに記載し、見出し1行目、2行目以降にコードを記載。 #コメントが多いのは、後学のためと必要に応じて修正がすぐにできるようにしたいので、汚いコードになってる # #改良、 #辞書dicを使って連想配列にして、「コード (tab)銘柄名」で管理する。これでコード銘柄名としたファイル名にする #タブ区切りなのでdelimiter='\t'にした #Googleスプレッドシートからコードと銘柄名の行列をコピーしてテキストエディタにそのままペーストできる。 #参考サイト #https://choco-weblog.com/selenium_python_full-screen-capture/ #2025/02/21 スクロールがうまくできなかったのでコメントになってる #時間があれば修正する options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--hide-scrollbars') #driver = webdriver.Chrome(ChromeDriverManager().install(), options=options) driver = webdriver.Chrome() driver.implicitly_wait(10) capture_save_dir = r"C:\Users\mased\Pictures\Screenpresso" def full_capture(filename, url): # ################# # キャプチャ取得 株探のチャート部分をキャプチャする。レイアウト変更されたら数値を変更 # ################# driver.set_window_size(690,920)#375,300 #filename += '_sp' #iw = '' #ih = '' #height = '' driver.get(url) time.sleep(3) #ページの高さを取得 #height = driver.execute_script("return document.body.scrollHeight") #ループ処理で少しづつ移動 #for x in range(1,height): # driver.execute_script("window.scrollTo(0, "+str(x)+");") driver.execute_script("window.scrollTo(0, "+str(280)+");") #iw = driver.execute_script("return document.body.clientWidth") #ih = driver.execute_script("return document.body.clientHeight") #ih += 100 # 画面下部が途中で切れないように余分に100px分プラス #time.sleep(3) #driver.set_window_size(iw, ih) driver.save_screenshot(capture_save_dir + '//' + filename + '.png') print(filename) time.sleep(2) #フル画面キャプチャ取得対象サイト # ################# # MAIN # ################# #例)full_capture('キャプチャ画像ファイル名', 'ページURL') #codeList=[] #リスト配列は、Pandasを使ってCSV読み込みにしたほうが楽だろう。python_rakuten_trade02.pyを参考にして。2025/02/25 #codelist.csvを作成済 #1行目 "コード"見出し #2行目からデータ "5803" #次に、辞書を使って連想配列にして、「コード、銘柄名」で管理する。これでコード銘柄名としたファイル名にする #タブ区切りなのでdelimiter='\t'にした dicCodeList={}#辞書作成、「コード、銘柄名」の2列を扱う df = pd.read_csv(r"C:\Users\mased\Documents\株2025\約定照会\python\codelist.csv",usecols=["コード","銘柄名"],delimiter='\t') #複数見出しがあればusecolsに追加できる #例 usecols=["約定日","取引","売買","コード","銘柄名","約定単価(円)"] 必要な見出し列だけで選べる。全部書く必要はない。 mydataFrame=pd.DataFrame(df) for i in range(len(df)): code=mydataFrame.loc[i, 'コード'] meigara=mydataFrame.loc[i, '銘柄名'] #codeList.append(str(code)) dicCodeList[meigara]=code #codeList={'6501'} #captureName="" captureURL='https://kabutan.jp/stock/chart?code=' for k,v in dicCodeList.items():#タプルで取得 full_capture('capture_'+ str(v) + k, captureURL+str(v)) print("キャプチャ取得が完了しました") driver.close() driver.quit()
こっちは、CSVカンマで銘柄コードのみの配列版 import os from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By #from webdriver_manager.chrome import ChromeDriverManager import time import pandas as pd#pip でインストールした #目的:株探のチャート部分をキャプチャする。レイアウト変更されたら数値を変更 #銘柄コードは、CSVファイルに記載し、見出し1行目、2行目以降にコードを記載。 #コメントが多いのは、後学のためと必要に応じて修正がすぐにできるようにしたいので、汚いコードになってる #参考サイト #https://choco-weblog.com/selenium_python_full-screen-capture/ #2025/02/21 スクロールがうまくできなかったのでコメントになってる #時間があれば修正する options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--hide-scrollbars') #driver = webdriver.Chrome(ChromeDriverManager().install(), options=options) driver = webdriver.Chrome() driver.implicitly_wait(10) capture_save_dir = r"C:\Users\mased\Pictures\Screenpresso" def full_capture(filename, url): # ################# # キャプチャ取得 株探のチャート部分をキャプチャする。レイアウト変更されたら数値を変更 # ################# driver.set_window_size(690,920)#375,300 filename += '_sp' #iw = '' #ih = '' #height = '' driver.get(url) time.sleep(3) #ページの高さを取得 #height = driver.execute_script("return document.body.scrollHeight") #ループ処理で少しづつ移動 #for x in range(1,height): # driver.execute_script("window.scrollTo(0, "+str(x)+");") driver.execute_script("window.scrollTo(0, "+str(280)+");") #iw = driver.execute_script("return document.body.clientWidth") #ih = driver.execute_script("return document.body.clientHeight") #ih += 100 # 画面下部が途中で切れないように余分に100px分プラス #time.sleep(3) #driver.set_window_size(iw, ih) driver.save_screenshot(capture_save_dir + '//' + filename + '.png') print(filename) time.sleep(2) #フル画面キャプチャ取得対象サイト # ################# # MAIN # ################# #例)full_capture('キャプチャ画像ファイル名', 'ページURL') codeList=[] #リスト配列は、Pandasを使ってCSV読み込みにしたほうが楽だろう。python_rakuten_trade02.pyを参考にして。2025/02/25 #codelist.csvを作成済 #1行目 "コード"見出し #2行目からデータ "5803" df = pd.read_csv(r"C:\Users\mased\Documents\株2025\約定照会\python\codelist.csv",usecols=["コード"]) #複数見出しがあればusecolsに追加できる #例 usecols=["約定日","取引","売買","コード","銘柄名","約定単価(円)"] 必要な見出し列だけで選べる。全部書く必要はない。 mydataFrame=pd.DataFrame(df) for i in range(len(df)): code=mydataFrame.loc[i, 'コード']#1見出しなのでlocは必要ないけど、列が増えたときのためにlocを使用 codeList.append(str(code)) #codeList={'6501'} #captureName="" captureURL='https://kabutan.jp/stock/chart?code=' for i in codeList: full_capture('capture_'+i, captureURL+i) #複数あれば、full_capture()を複数並べて置けば良い。>>修正してFOR分とCSVのリストに変えた #full_capture('capture_5202', 'https://kabutan.jp/stock/chart?code=5202') #full_capture('capture_5301', 'https://kabutan.jp/stock/chart?code=5301') print("キャプチャ取得が完了しました") driver.close() driver.quit()