Python(Selenium)で東京ガスのcsvをダウンロード

前回は東京電力のでんき家計簿だったが、今度は東京ガスのガス使用量のcsvを自動でダウンロード。

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

browser = webdriver.Chrome('/usr/local/bin/chromedriver')
browser.set_page_load_timeout(30)
browser.get('https://members.tokyo-gas.co.jp/')

GAS_ID = 'my tokyo gasのID'
GASS_PASSWD = 'my tokyo gasのパスワード'

# loginボタンを押す
selector = "#login_openid"
elm = browser.find_element_by_css_selector(selector)
elm.click()

time.sleep(5)

selector = "#loginId"
elm = browser.find_element_by_css_selector(selector)
elm.send_keys(GAS_ID)

selector = "#password"
elm = browser.find_element_by_css_selector(selector)
elm.send_keys(GASS_PASSWD)

selector = "#submit-btn"
elm = browser.find_element_by_css_selector(selector)
elm.click()

time.sleep(5)

# CSVをダウンロードするAPI
browser.get('https://members.tokyo-gas.co.jp/api/mieru/chargeAmountCsv.jsp?no=0&target=total')

time.sleep(8) # csvダウンロードをちょっと待つ
browser.quit()


今回のエッセンス

でんきの時とほとんど変わらないので特に無し。

更新(2020/12/13)

csvのダウンロードボタンを押すselectorが構成が変わってうまく押せなくなっていたので解析したらcsvダウンロードのAPIを呼ぶことが出来ることがわかったので修正。

更新(2021/1/16)

ページ遷移やCSVのダウンロードの待ち時間を減らすために以下の通り修正。

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_gas_csv(user_id, password):
   """
   ガス料金のcsvファイルをダウンロードする
   """
   browser = webdriver.Chrome('/usr/local/bin/chromedriver')
   browser.implicitly_wait(20)  # tagが見つかるまでデフォルトで最大20秒待つ
   browser.get('https://members.tokyo-gas.co.jp/')
   #print(browser.page_source)
   
   # loginボタンを押す
   selector = "#login_openid"
   elm = browser.find_element_by_css_selector(selector)
   elm.click()
   
   selector = "#loginId"
   elm = browser.find_element_by_css_selector(selector)
   elm.send_keys(user_id)
   
   selector = "#password"
   elm = browser.find_element_by_css_selector(selector)
   elm.send_keys(password)
   
   selector = "#submit-btn"
   elm = browser.find_element_by_css_selector(selector)
   elm.click()
   
   # CSVをダウンロードするAPI
   browser.get('https://members.tokyo-gas.co.jp/api/mieru/chargeAmountCsv.jsp?no=0&target=total')
   
   # 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()

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