さくら VPS Python Selenium Web 自動操作
Money Partners サイトに入る前準備
ここまでで、Money Partners のサイトに自動的に入ることができるようになります。
でもその前にしなければいけない設定があります。
引き続き Money Partners サイトに入る前準備を行なっていきます。
- ダウンロードディレクトリ変更
prefs オプションを設定、デフォルトのダウンロードディレクトリを変更しておきます。
options.add_experimental_option("prefs", {
"download.default_directory": "/home/yamada/public_html/manep"
}) 元の記述 - ダウンロードディレクトリ変更(2023/3/23日変更)
options.headless = True
を有効にして、ヘッドレスで実行すると、デ-タをダウンロ-ドしてくれないことに気がつきました。
もともとヘッドレス実行ではデ-タをダウンロ-ドができなかったのですが、最近は可能でした。
しかし、2023年3月よりまたできない設定に Google は戻したようです。
対応の方法は
Selenium CSV ファイルダウンロード Chromium 画面なし
の中で説明していますので参照してください。
変更内容は上記 元の記述内容 を削除し次の内容を追記します。
なお、Page.setDownloadBehavior コマンドは非推奨になりました。
Browser.setDownloadBehavior を使用します。# 20230323 追加 driver.command_executor._commands["send_command"] = ( 'POST', '/session/$sessionId/chromium/send_command' ) params = { 'cmd': 'Browser.setDownloadBehavior', 'params': { 'behavior': 'allow', 'downloadPath': '/home/yamada/public_html/manep' } } driver.execute("send_command", params=params) # 追加ここまで
- ウィンドウ最大化
Money Partners のサイトは横幅が広く作られているので、クリックボタンが見えるように、 ウィンドウを最大化します。
options.add_argument('--kiosk') - 認証情報を環境変数から取得
認証情報を環境変数から取得します。
load_dotenv()
MANEPA_ID = os.environ['MANEPA_ID']
MANEPA_PA = os.environ['MANEPA_PA'] - 140日前の年月日を取得
今日から140日前の年月日を取得を取得します。
now = datetime.datetime.now()
# 140日 減算
now100 = now - datetime.timedelta(days=140)
now100str = now100.strftime('%Y%m%d') - マネパ Login 画面を開く
マネパ Login 画面を開きます。
serv = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=serv, options=options)
driver.get('https://www.moneypartners.co.jp/login/')
wait = WebDriverWait(driver, 5)
すべてのページが表示されるまで待機します。
今回は最大5秒とします。element = wait.until(expected_conditions.visibility_of_all_elements_located)
2022/10/10日追記
ウィンドウ画面が小さいと 「お困りの方へ」のポップアップが「ログイン」画面にかぶってしまい ログインボタンがクリックできないことが判明しました。
これを回避するため、垂直方向に 200 ピクセル下にスクロールします。
driver.execute_script("window.scrollBy(0, 200);")
そして、タイトルに'マネーパートナーズ'が含まれていることを確認します。
assert 'マネーパートナーズ' in driver.title
これで、マネパ Login 画面が開きました。
以上をまとめると、以下のようになります。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver import ChromeOptions
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
import time
options = webdriver.ChromeOptions()
# options.headless = True
# prefs オプションを設定、デフォルトのダウンロードディレクトリを変更
# 2023/3/23日削除
# options.add_experimental_option("prefs", {
# "download.default_directory": "/home/yamada/public_html/manep"
# })
# ここまで削除
# 20230323 追加
driver.command_executor._commands["send_command"] = (
'POST',
'/session/$sessionId/chromium/send_command'
)
params = {
'cmd': 'Browser.setDownloadBehavior',
'params': {
'behavior': 'allow',
'downloadPath': '/home/yamada/public_html/manep'
}
}
driver.execute("send_command", params=params)
# 追加ここまで
# ウィンドウを最大化
options.add_argument('--kiosk')
serv = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=serv, options=options)
driver.get('https://www.moneypartners.co.jp')
wait = WebDriverWait(driver, 5)
# すべてのページが表示されるまで待機:今回は最大5秒
element = wait.until(expected_conditions.visibility_of_all_elements_located)
# 垂直方向に 200 ピクセル下にスクロール
driver.execute_script("window.scrollBy(0, 200);")
# タイトルに'マネーパートナーズ'が含まれていることを確認
assert 'マネーパートナーズ' in driver.title
マネパ CSV ダウンロードファイル作成後半
マネパからダウンロードできる CSV ファイルには多種多様のものがあります。
今回は、ID とパスワ-ドを入力して、豪ドル/円 100日(カレンダでは140日)分の日足デ-タを取得をします。
ID,Password 入力
ID と Password を入力し、ログインボタンをクリックします。
id = driver.find_element_by_name('loginId') id.send_keys(MANEPA_ID) password = driver.find_element_by_name('password') password.send_keys(MANEPA_PA) time.sleep(1) # ログインボタンをクリック login_button = driver.find_element_by_id('loginBtn') print("login_button 発見") login_button.click() time.sleep(1)
ログイン完了
ここまででマネーパートナーズ会員専用サイトにログインできましたので パートナーズFX - チャート足情報サイトに移動します。
driver.get('https://account.moneypartners.co.jp/retail/pfx_download_chart.do')
次に、日付欄にダウンロ-ドしたいデ-タの開始日 now10str を入力します。
開始日入力欄は
fr_date = driver.find_element_by_id('dateFrom')
で見つけることができます。
ここには現在の日付があらかじめ入力されていますのでこれを一旦選択し削除します。
fr_date.send_keys(Keys.CONTROL, "a")
fr_date.send_keys(Keys.DELETE)
そして開始日を入力します。
fr_date.send_keys(now10str)
そして足種欄をさがし、7番目にある日足を選択します。
tp_chat = driver.find_element_by_id('chartType')
select = Select(tp_chat)
select.select_by_value('7')
銘柄選択を豪ドル/円 に変更
commo = driver.find_element_by_id('commodity') select = Select(commo) select.select_by_value('3') # value"3" option 選択(豪ドル)状態
送信ボタンをクリック
後はタイミングをとりながら送信ボタンをクリックしログアウトし、ブラウザーを終了します。
time.sleep(1) send_button = driver.find_element_by_id("outputChart") send_button.click()time.sleep(1) # 秒 logout_but = driver.find_element_by_id("logout") logout_but.click()time.sleep(3) # 秒
ログアウト
2022/10/10日追記
ウィンドウ画面が小さいと
「ログアウト」ボタンが見えないことが判明しました。
ログアウトボタンを探すのは止めて
3秒待ってブラウザーを終了するようにします。
ログアウトボタンをクリックすると
[OK]ボタンと[Cancel]ボタンがポップアップします。
これを処理する必要があります。
そのためには Alert クラスが必要です。
ダイアログを制御するクラスです。
まずは Alert を import します。
from selenium.webdriver.common.alert import Alert
少し待って
time.sleep(4)
"OK or Cancel" の確認で OK を選択します。
Alert(driver).accept()
time.sleep(4) # 秒
driver.quit() # ブラウザーを終了する。
ここまでで、求めるファイルをダウンロ-ドできました。
引き続き、ダウンロ-ドしたファイル名を変更していきます。