🤖

selenum4 / ubuntu で Amazon購入履歴を取る

2025/02/18に公開

自動化で確定申告に間に合わせる

取り敢えずやっつけ仕事でPDFがほしいという話になって例によって・・・

https://qiita.com/K_SIO/items/f442dd419f1d8fdd8689
Python と selenium でAmazonの購入履歴を取得する)

恥を忍んで「初心者」様のコードをまるまる🐒真似するわけですけど、何かが古いので動かないのであります。

install 関係

基本 python のものは pip で入ります。簡単ですが・・・

  • Ubuntu に Pythonの管理をさせるか、 python/pip に委ねるかで 度々警告が出ます。
note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

まあ繊細なPython環境が壊れたらもうだめXXじゃう人以外はあまり考えることなく突っ込めという気はします。Python2.7→Python3.0で苦しい思いをしたことを思い出せば大したことはありません(=へんなたいせいがついている)

selenuim4 での変更点

権威あるところに確認:https://www.selenium.dev/ を確認しました。 よれば

* By Class
"find_element_by_id" が すべて find_element(By.ID ...
という構造になったとのことです。 初期時に "By" という Class 宣言を拾います。

  • Keys Class
    "key_down" もなくなっていましたので、これも "Keys" Class を必要とします。
from selenium.webdriver.common.by import By # ver.4
from selenium.webdriver.common.keys import Keys # ver.4

MFA対応

Amazonに限らず、もう MFAに対応しないとどうにもなりません。

  • 自動にしたい。
    調べればMFA用のTOTPライブラリを持ってくれば良いのですが、日常に使うもので、このことだけに再設定をするのが面倒。頻繁にアクセスしてfetchするなら、必須ですが**年に一回しか使いません**

  • 手動で行こう。
    WebDriver を ループさせて MFAダイアログの特有のURLが所期のURLに変わるまで待ってもらいます。設定保存させられれば良いのかもですが、毎回入力でも面倒くさいのはテストのときだけですので省きます。

# ここでダイアログ出るので手動で対応する。
url = driver.current_url # get current url 
while url != ENTRY:
     time.sleep(2)
     url = driver.current_url

ubuntu に対応

OSの差異は細々と。

  • ダウンロード Path 問題
    結局、OS間でのマルチバイト文字ファイル名問題はUnicodeが普及しても解決されません。結局実装間差異が残っているので余計な苦労はします。Windows/MacOS/Linux の三つをつかっているだけでもソレだけで相当ロスがあります。
    普段は Firefox(gnome..) 使いなので、google-chrome でも ~/ダウンロード とかいう i18n な path が使われると思うのですが、とかく selenium とは相性が悪そうです。

https://stackoverflow.com/questions/76175638/unable-to-change-default-download-directory-for-chrome-selenium-instance-linux/76176954

→  回避策: ~/download は作っておき、以下の設定を足しておく

prefs = {
            'download.default_directory': '{USER}/download/',
            'savefile.default_directory': '{USER}/download/',

{USER} は /home/strnh とか 利用中のアカウントの HomeDir とか。

  • Webdriverは Manager を通す
    Windowsでは、 chromedriver.exe なんて実行ファイルに投げるんですが、Selenium4/Ubuntu 環境ではマネージャ経由で・・・

個人的な修正

  • 2024年分だけにする。
# 直接2024年分全オーダを出す様に変更。
ENTRY = 'https://www.amazon.co.jp/your-orders/orders?timeFilter=year-2024&ref_=ppx_yo2ov_dt_b_filter_all_y2024'
  • 保存先 → ~/kaikei/2024/amazon

  • sleep を足した箇所がいくつか
    2ページ目後を失敗するので、もしかして多重ループにする?と考えたんですが、どうも遷移そのものは問題ではなく処理が終わってないということだったようです。 非同期かつコントロールはしていないので、 Promise 使うところかもですね。

とりあえず動けばいい。

というところで今回はおしまいです。

https://github.com/strnh/selenium-study

Discussion