動機
- 普段、私は社員食堂で昼食を取っているのだが、体型を考慮してなるべく高タンパク・低カロリーのメニューを選択したい。
- メニュー表は社内ポータルに公開されているのだが、いちいちログインして取得するのが面倒。(忘れてしまう時もある。)
環境
- メニュー表はsharepoint上に、PDFファイルで公開されている。
- 新しいメニュー表は(恐らく)週末にポータルにアップロードされている。
- 社内標準ブラウザはIEである。
コード
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import pyautogui
from time import sleep
URL = ''
# webドライバ読み込み
driver = webdriver.Ie("./IEDriverServer.exe")
# ポータルにアクセス
driver.get(URL)
driver.implicitly_wait(10) # 秒
# メニュー表が掲載されているページのリンク取得
link = driver.find_element_by_link_text("食堂メニュー").get_attribute("href")
## 新しいタブでリンクを開く
# driver.execute_script('window.open()')
# driver.switch_to.window(driver.window_handles[1])
# リンクを開く
driver.get(link)
# メニュー表(PDFファイル)へのリンク取得
menu = driver.find_element_by_partial_link_text("週間メニュー表") # partialを使用して部分検索
# 右クリックメニューの「名前を付けてリンク先を保存」からファイル保存
ActionChains(driver).context_click(menu).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform()
sleep(5) # ファイル保存ダイアログ表示待ち時間
pyautogui.press('enter') # ダイアログ画面に対してはActionChainsのsendkeyが及ばないのでpyautoguiを利用
# ドライバ終了
driver.quit()
工夫した点
- リンク先を新しいウインドウ(もしくはタブ)で開いてもいいのだが、リンク元に戻る操作がないことから、都度、driverに与えるURLを更新する方針とした。
- コード内のコメントにもある通り、対象ファイルがPDFのため、seleniumによるファイルダウンロードが行えず、また、ファイルを開いてスクショとして保存しようにもPDFViewer上ではスクショが正しく撮れないため、コンテキストメニューから対象ファイルを保存する方針とした。
- このとき、「名前を付けて保存」のウインドウを開くまではActionChainsで行えるのだが、最後の保存ボタンのクリックはできないのでpyautoguiを使用してキー入力を送っている。
改善点
- 保存先を指定できない。(恐らく、前回ファイル保存したディレクトリが設定される)
- 時間ベースでのwait処理があり、ホストの環境に依存する作りになっている。
留意点
これをwindowsのタスクスケジューラに登録することで、所定時刻にポータル上からメニュー表を取得するようにします。