インフラエンジニアなのでSeleniumなどのフロントエンド系は触ることはないのですが、「連載記事をまとめてEvernoteのWebクリッパーでクリップしたい」と考えて自動化する手段を調べた結果、Seleniumによるバッチ処理という答えにたどり着きました。
やっていることはシンプルで、SeleniumからGeckoドライバーでFirefoxを起動したあと、URLを開く、ショートカットキーを押下する、次のURLを開く…を続けるだけ。
PythonでSeleniumやGeckoドライバの配置についてはググっていただき、「listをfor文で回すな」等のツッコミはご容赦下さい…
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def loader_url(filepath):
urllist = list()
with open(filepath, "r") as f:
line = f.readline()
while line:
line_trim = line.strip()
# 空行はスキップする
if len(line_trim) == 0:
line = f.readline()
continue
# 処理の開始
urllist.append(line_trim)
line = f.readline()
return urllist
def evernote_webclip(url, driver=None):
# キー操作
WEBCLIPPER_KICK = "`"
WEBCLIPPER_SIMPLE = "C"
# 待ち時間
LOAD_PAGE = 5 # ページ読取り待ち
SEND_WEBCLIP = 5 # Webクリップ起動まで
LOAD_NEXT_PAGE = 10 # 簡易版の次のページ読み込みを待つ
STORE_WAIT = 10 # ページ保存
if driver == None:
driver = webdriver.Firefox()
driver.get(url)
# 読取り待ち
time.sleep(LOAD_PAGE)
element = driver.find_element_by_tag_name("html")
# Webクリッパーを起動
element.send_keys(WEBCLIPPER_KICK);
# Webクリッパーの起動待ち
time.sleep(SEND_WEBCLIP)
# 簡易版記事の保存
element.send_keys(WEBCLIPPER_SIMPLE);
time.sleep(LOAD_NEXT_PAGE)
element.send_keys(Keys.ENTER);
# Webクリッパーの起動待ち
time.sleep(STORE_WAIT)
if __name__ == '__main__':
firefox_profile = r'C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles\123abcde.default'
url_file = r'C:\Users\user\Documents\selenium_urls.txt'
url_list = loader_url(url_file)
driver = webdriver.Firefox(firefox_profile)
for url in url_list:
evernote_webclip(url, driver=driver)
変数定義などが多いため、実際の処理部分はそんなに多くありませんので詳細はコードを見ていただきたいですが、下記の様な実装になっています。
- loader_url()関数は、渡されたテキストファイルに書かれている1行ごとのURLをリストに格納します
- evernote_webclip()関数は、URLとドライバーを元にEvernote WebClipを使って保存します
- Selenium内でショートカットキーを発行するには、何か要素をつかむ必要があるようなので、適当にhtmlタグをつかませています
- evernote_webclip()関数内で発行しているWebCliperのショートカットキーは「`」でWebCliper起動、「C」で簡易版の記事の保存です