Python(Selenium)ででんき家計簿のcsvダウンロードを自動化(→ 2021/1/31ででんき家計簿が終了し使えなくなった)

以前、でんき家計簿のcsvをGoogle Spreadsheetに登録するようにしたが毎月csvをダウンロードするのが面倒だったので自動化してみた。

前準備として、ここを参考にして macにchromedriverをインストールした。
やったのは

brew cask install chromedriver

あとはSeleniumもpipでinstallする必要がある。

プログラム

from selenium import webdriver
from selenium.webdriver.support.select import Select
import time

MY_ID = 'でんき家計簿のID'
MY_PASSWD = 'でんき家計簿のPassword'

browser = webdriver.Chrome('/usr/local/bin/chromedriver')
browser.set_page_load_timeout(30)
browser.get('https://www.kakeibo.tepco.co.jp/dk/aut/login/')

# テキストボックスに入力
selector = '#idId'
elm = browser.find_element_by_css_selector(selector)
elm.send_keys(MY_ID)

selector = '#idPassword'
elm = browser.find_element_by_css_selector(selector)
elm.send_keys(MY_PASSWORD)

# ボタンを押す
selector = '#idLogin'
elm = browser.find_element_by_css_selector(selector)
elm.click()

# 画面遷移を待つ
time.sleep(3)

# 電気料金・グラフのボタンを押す
selector = "#idNotEmptyImg_contents01\.jpg"
elm = browser.find_element_by_css_selector(selector)
elm.click()

# 使用量・料金一覧のボタンを押す
selector = "#tab-area > div > div.graph_nav > ul > li.nav03.tab03 > a > img"
elm = browser.find_element_by_css_selector(selector)
elm.click()

# csvダウンロードのボタンを押す
selector = "#motion_area3 > div > div.button_area > input:nth-child(1)"
elm = browser.find_element_by_css_selector(selector)
elm.click()

time.sleep(15) # ダウンロードを待つ
browser.quit()

補足

selectorのところにはchromeで表示されているでんき家計簿の画面中の押したいボタンで右クリック→検証を押し、選択されている部分で更に右クリックし copy→copy Selector したものを貼り付ければ簡単。

でんき家計簿のページが変更になったら当然動かなくなる可能性が高いのであしからず。

今回のエッセンス

- Seleniumを使えばchromeでアクセスできるページに簡単にアクセスできる。
- Seleniumのselectorはchromeの検証から簡単にコピペ出来る。

ページ遷移やダウンロードを待つ時間をなんとかしたい(2021/1/16)

ページ遷移やCSVファイルのダウンロードをtime()で待たせると時間がかかるし確実性がないので以下のように修正したら高速になった。

ユーザIDとパスワードは関数の引数に渡すようにした。

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait

def every_downloads_chrome(driver):
   """
   以下の情報より
   https://stackoverflow.com/questions/48263317/selenium-python-waiting-for-a-download-process-to-complete-using-chrome-web?rq=1
   """
   if not driver.current_url.startswith("chrome://downloads"):
       driver.get("chrome://downloads/")
   return driver.execute_script("""
       return document.querySelector('downloads-manager')
       .shadowRoot.querySelector('#downloadsList')
       .items.filter(e => e.state === 'COMPLETE')
       .map(e => e.filePath || e.file_path || e.fileUrl || e.file_url);
       """)
       
def download_denki_csv(user_id, password):
   """
   でんき家計簿のcsvファイルをダウンロードする。
   """
   browser = webdriver.Chrome('/usr/local/bin/chromedriver')
   browser.implicitly_wait(20)  # tagが見つかるまでデフォルトで最大20秒待つ
   
   browser.get('https://www.kakeibo.tepco.co.jp/dk/aut/login/')
   #print (browser.page_source)
   
   # テキストボックスに入力
   selector = '#idId'
   elm = browser.find_element_by_css_selector(selector)
   elm.send_keys(user_id)
   selector = '#idPassword'
   elm = browser.find_element_by_css_selector(selector)
   elm.send_keys(password)
   
   # ボタンを押す
   selector = '#idLogin'
   elm = browser.find_element_by_css_selector(selector)
   elm.click()
   
   # 以下のselectorは押したいボタンで右クリック→検証を押し、選択されている部分で更に右クリックし copy→copy Selector したものを貼り付ける
   # 電気料金・グラフのボタンを押す
   selector = "#idNotEmptyImg_contents01\.jpg"
   elm = browser.find_element_by_css_selector(selector)
   elm.click()
   
   # 使用量・料金一覧のボタンを押す
   selector = "#tab-area > div > div.graph_nav > ul > li.nav03.tab03 > a > img"
   elm = browser.find_element_by_css_selector(selector)
   elm.click()
   
   # csvダウンロードのボタンを押す
   selector = "#motion_area3 > div > div.button_area > input:nth-child(1)"
   elm = browser.find_element_by_css_selector(selector)
   elm.click()
   
   # waits for all the files to be completed and returns the paths
   paths = WebDriverWait(browser, 120, 1).until(every_downloads_chrome)
   print(paths)
   browser.quit()

この記事が気に入ったらサポートをしてみませんか?