Open4

IEモードの自動化

shuyin02shuyin02

吐くほど使いたくなかったが、仕方ないのでseleniumを使った。
ドライバーとブラウザのバージョン合わせるのが大変ですしね。

社内システムからデータを取得するので会社回線でつながないといけないが、ドライバーマネージャーは会社回線だとドライバーのダウンロード時にこけるので、ここは手動で管理しないといけない。

という問題があるので、普段だったらブラウザこみでドライバー管理不要なpuppeteerTypeScriptで実装するが、今回はPythonで実装。

shuyin02shuyin02

EdgeのIEモード起動

  def open_browser(self):
    """Edge IEモードで指定されたURLにアクセスします。"""
    logging.info("Edge IEモードを起動します。")
    iedriver_path = os.path.abspath("./template/IEDriverServer.exe")
    ie_service = IEService(executable_path=iedriver_path)
    edge_path = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
  
    # IEモード用オプション設定
    ie_options = webdriver.IeOptions()
    ie_options.attach_to_edge_chrome = True
    ie_options.edge_executable_path = edge_path
    ie_options.ignore_protected_mode_settings = True
    
    self.driver = webdriver.Ie(service=ie_service, options=ie_options)
    self.driver.get("web-url")
    self.wait = WebDriverWait(self.driver, self.default_timeout)
    logging.info("ログインページにアクセスしました。")

ポイントとなるのは、

  • IEのdriverを利用する
    • PC自体はwin11の64bitだが、recommendedのIEDriverServer_Win32_4.14.0で問題なかった
  • ie_options.ignore_protected_mode_settings = True
    • 本来であれば保護モード(Protected Mode)の設定を揃えることで実施したいが、会社PCの設定上できなかったので無視した
  • 起動にはEdgeを利用するので絶対パスを指定する

Edgeのパス取得

Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\msedge.exe" | Select-Object -ExpandProperty '(Default)'

保護モードの統一

会社PCでできなかったが参考として

https://qiita.com/jsakamoto/items/c7821a6dbca2989fd808

shuyin02shuyin02

IEモードでのDOM解析

IE モードで対象の Web ページを開く

Microsoft Edge で対象の Web ページを開き、右上の「…」メニューから「その他のツール」→「Internet Explorer モードで再読み込み」を選択します。これにより、ページが IE モードで表示されます。

IEChooser.exe を使用して DevTools を起動する

IE モードでは通常の F12 キーや右クリックメニューから DevTools を開くことができません。代わりに、以下の手順で IEChooser.exe を使用して DevTools を起動します:

Windows の「ファイル名を指定して実行」ダイアログを開きます(Windows キー + R)。

以下のパスを入力し、Enter キーを押します:

%systemroot%\system32\f12\IEChooser.exe

表示される「デバッグするターゲットの選択」画面で、先ほど IE モードで開いたページのタイトルを選択します。

選択すると、対象ページの DevTools が起動し、DOM 要素の解析や編集が可能になります。

shuyin02shuyin02

ダウンロード対策

  • IEでダウンロードをしようとすると、ダイアログが開きクリックする動作が必要となる。
  • IEの設定で変更できるが、IE自体はPC上に見当たらず(あるのかもしれないが開けないようにコントロールされているかと)、他者のPCで動作させることも考えて、コーディングで処理することとした。

https://chatgpt.com/share/e/689468ce-5368-8003-b495-75c6ddd2967d

なので、IE上でクリックするのではなくダウンロードリンクのURLを取得し、GETリクエストを再現することで直接ダウンロードを実行するように変更した

download_link_element = self.wait.until(EC.presence_of_element_located((By.NAME, "lnkDown")))
download_url = self.driver.execute_script("return arguments[0].getAttribute('href');", download_link_element)
print(download_url)
save_file_path = os.path.join("data", file_name)
cookies = {cookie['name']: cookie['value'] for cookie in self.driver.get_cookies()}
download_file_via_requests(download_url, save_file_path, session_cookies=cookies)

def download_file_via_requests(url: str, save_path: str, session_cookies=None, headers=None):
  """
  URLから直接ファイルをHTTP GETで取得して保存する。
  セッション認証が必要ならcookiesやheadersを渡す。
  """
  with requests.get(url, stream=True, cookies=session_cookies, headers=headers) as r:
    r.raise_for_status()
    with open(save_path, 'wb') as f:
      for chunk in r.iter_content(chunk_size=8192):
        if chunk:
          f.write(chunk)
  print(f"ファイルを保存しました: {save_path}")

こんな感じ