けんぞの投資関連ブログ

株を始めて3年半程のひよっこ投資家のブログです。

Pythonで楽天RSSの株価取得するその2

前回の続き Pythonで楽天RSSから株価を取得する - けんぞの投資関連ブログ

楽天RSSで株価を取得する前に、MarketSpeedとRSSを立ち上げる必要があるが、 当然これもプログラムで自動的に立ち上げることができる。

しかし、pythonで立ち上げる処理を作成して立ち上げにも成功しているはずだが、なぜか株価取得がうまくいかなかった。 正確には、銘柄一覧は取得することができたが、株価がなぜか取得することができなかった。

Python以外で起動プログラムを書いてみると、問題なくMarketSpeedとRSSは立ち上がり、Pythonで株価が取得できた。

Pythonですべて完結したい人はこれをどこか改良すれば、株価は取得できるかもしれない

→久々にこのプログラムを見直したところ、RSS実行時にRSSディレクトリに移動して実行すれば問題なさそうでした。

 おそらくRSS内でMarketSpeedにアクセスしているのですが、ディレクトリを移動せずRSSを実行していたため、

 「定義ファイルがみつかりません。」とエラーが出てRSS起動が失敗していました。

import pyautogui

market_speed = None
market_speed_rss = None

# RSSを起動します
def start_rss():
    global market_speed, market_speed_rss
    market_speed_path = r"F:\Program Files\MarketSpeed\MarketSpeed\MarketSpeed.exe"

    market_speed = subprocess.Popen(market_speed_path)
    time.sleep(10)
    pyautogui.keyDown("F3") # F3キーをショートカットキーに登録して、ログイン画面をポップアップさせる
    time.sleep(3)
    pyautogui.typewrite("********")  #パスワード ログインIDは記録させておくため入力しない
    time.sleep(1)
    pyautogui.keyDown("Enter")
    time.sleep(3)
    pyautogui.keyDown("Esc")
    time.sleep(3)

    market_speed_rss_path = r"F:\Program Files\MarketSpeed\MarketSpeed\RSS.exe"
    current_dir = os.getcwd()
    market_speed_dir = os.path.split(market_speed_rss_path)[0]
    os.chdir(market_speed_dir)
    market_speed_rss = subprocess.Popen(market_speed_rss_path)
    os.chdir(current_dir)
    time.sleep(3)


# RSSを停止します
def stop_rss():
    global market_speed, market_speed_rss
    market_speed.kill()
    market_speed_rss.kill()

なぜか、株価取得ができなかったため もともと、VBAで株価を取得する処理を作っていたため、VBAのマクロを呼ぶようにした。

# ExcelマクロをPythonから呼び出す
import xlwings
import app_config
conf = app_config.AppConfig()

# Excelマクロを実行します
def execute_excel_macro(macro_name):
    work_book = xlwings.Book(’excelのPath’)
    macro = work_book.macro(macro_name)
    macro()

VBAでMarketSpeedとRSSをたちあげる

'MarketSpeedProcessID
Dim objMS As Variant
Dim objRSS As Variant

'RSS起動
Public Sub startRSS()
    
    Dim WshShell As Variant
    Dim password As String
    
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.CurrentDirectory = "F:\Program Files\MarketSpeed\MarketSpeed"
    Set objMS = WshShell.Exec("F:\Program Files\MarketSpeed\MarketSpeed\MarketSpeed.exe")
    WshShell.AppActivate (objMS.processID)
    Call waitFor(15)
    WshShell.SendKeys ("{F3}")
    Call waitFor(5)
    WshShell.SendKeys ("*******")
    Call waitFor(5)
    WshShell.SendKeys ("{ENTER}")
    Call waitFor(5)
    WshShell.SendKeys ("{ESC}")
    Call waitFor(5)
    Set objRSS = WshShell.Exec("F:\Program Files\MarketSpeed\MarketSpeed\RSS.exe")
    Call waitFor(5)
End Sub

Public Sub stopRSS()
    Dim strRssProcName
    Dim strMSProcName
    Dim objProcList As Object
    Dim objProcess As Object
    
    strRssProcName = "RSS.exe"
    strMSProcName = "MarketSpeed.exe"
    
    Set objProcList = GetObject("winmgmts:").InstancesOf("win32_process")
    For Each objProcess In objProcList
        
        If objProcess.Name = strRssProcName Or objProcess.Name = strMSProcName Then
            objProcess.Terminate
        End If
    Next
    
    Set objMS = Nothing
    Set objRSS = Nothing
    
    Sleep 1
End Sub