朝のルーチンワークを少しでも減らそうとPythonで売上・アクセスデータの集計報告ツールを作って動作させているのですが、ある日正常に動かなくなった話。
売上・アクセスデータ集計報告ツール
- タスクスケジューラからPythonファイルを実行
- SeleniumでGoogle Analyticsへログイン
- Google AnalyticsからCSVデータをダウンロード
- pandasで過去のCSVデータと統合
- Excelで集計・分析
- 対目標・対前年で比較したデータをSlack BotにPOST
こいつが7月に入ってある日突然CSVデータがダウンロードされなくなった。 Google Analyticsにログインすることはできている。でもCSVはダウンロードされない。
いや、まぁ、手でやっても2分もかからない作業ではあるんですが、やっぱり単純作業はやらなくていいならやりたくないですよね。
chromedriver.exeが古かった
結論から言うと原因はchromedriver.exeが2018年3月時点のものだったこと。 そんなに頻繁に更新があるものと思っていなかったため最初はGoogle Analytics側のDOMが変わったのだろうと疑っていた。
しかし実際のところは以下から最新のchromedriver.exeをダウンロードして以前のexeファイルに上書き保存すれば済む話でした・・・。 2018年6月のバージョンを使うことで改善。
ChromeDriver - WebDriver for Chrome http://chromedriver.chromium.org/downloads
見てもしょうがないかもしれませんが、色々試した経緯を残しておきます。
Google AnalyticsのDOMが変わった・・・?
CSVダウロードに必要な箇所は変わっていませんでした。 ちなみにログインからCSVダウンロードまでのプログラムは以下のようなもの
download_directory = 'ダウンロード先ディレクトリ' user_id = 'ユーザー名' user_pass = 'パスワード' driver = init_selenium(download_path=download_directory) # デフォルトダウンロードフォルダ変更 driver.implicitly_wait(10) # 要素表示までの最大待機秒数 driver.get('カスタムレポートのURL') driver.find_element_by_css_selector('#identifierId').send_keys(user_id) driver.find_element_by_css_selector('#identifierNext > content > span').click() driver.find_element_by_name('password').send_keys(user_pass) time.sleep(2) driver.find_element_by_css_selector('#passwordNext span').click() time.sleep(10) # 操作対象をインラインフレームに移す iframe = driver.find_element_by_css_selector('#galaxyIframe') driver.switch_to.frame(iframe) driver.find_element_by_css_selector('.ACTION-exportMenu').click() driver.find_element_by_css_selector('.TARGET-CSV').click() time.sleep(10)
Google Analyticsの画面はレポート表示領域がインラインフレームで形成されています。
故に操作対象をiframeに移す処理switch_to.frame
が必要になるわけです。
途中からブラウザ接続が切断されていた
find_element_by_css_selector
の指定がおかしいのか? でもエラーで止まってるのはフレームに移動する前段階・・・。
driver.switch_to.frame(iframe)
がおかしいのか・・・? でも推奨されている記述どおりで、driver.switch_to_frame(iframe)
は使っていないし・・・。
まずdriver.find_element_by_css_selector('#galaxyIframe')
が正常に動作しているのか・・・?
と思い検証したところAnalyticsにログインした直後からブラウザーとの接続自体が切れており、何の操作も受け付けられていなかったことが判明。
これは明らかにwebdriver自体がおかしいと思い、冒頭の「chromedriver.exe」の更新にたどり着いたということです。
すごい遠回りでしたねー。次からはまず最初にバージョン確認してみることにします!