Open4
IEモードの自動化
吐くほど使いたくなかったが、仕方ないのでseleniumを使った。
ドライバーとブラウザのバージョン合わせるのが大変ですしね。
社内システムからデータを取得するので会社回線でつながないといけないが、ドライバーマネージャーは会社回線だとドライバーのダウンロード時にこけるので、ここは手動で管理しないといけない。
という問題があるので、普段だったらブラウザこみでドライバー管理不要なpuppeteer
とTypeScript
で実装するが、今回はPython
で実装。
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でできなかったが参考として
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 要素の解析や編集が可能になります。
ダウンロード対策
- IEでダウンロードをしようとすると、ダイアログが開きクリックする動作が必要となる。
- IEの設定で変更できるが、IE自体はPC上に見当たらず(あるのかもしれないが開けないようにコントロールされているかと)、他者のPCで動作させることも考えて、コーディングで処理することとした。
なので、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}")
こんな感じ