【SelenimBasic】起動済みのEdgeを用いてSeleniumによるスクレイピングを行う

VBAスクレイピング

こんにちは、blueです。

SeleniumBasicを用いてスクレイピングを行う際、既に開いているEdgeブラウザでログインしたいということはないでしょうか?

今回の方法を用いれば

  • ログインの際ユーザー名、パスワード入力が不要になる
  • (再ログインを要求されないサイトの場合は)ログイン操作自体が不要になる

ということが可能になりますので紹介します(Chrome版はこちら)。

なお後者のメリットを使えば、reCAPTHAが必要なサイトについても一度処理してしまえば以降は内部のクローリング処理が可能になります。

また他のメリットもあるようです(今回のまとめに記載)ので参考にしていただければ幸いです。
なお今回の記事は以下のサイトを参考にしています。
Edgeで起動しているブラウザを操作する【Selenium】【ExcelVBA】
Selenium + WebDriver + Edge でリモートデバッグポートが開いていないことがある

VBAを使ったものではありませんが、Seleniumを勉強する為の基本的な書籍です。ブラウザやキー操作の基本的なコマンドは共通していますのでコードを書く際の参考になります。

こちらもVBAに関してではないですがクローリング全般について書かれた書籍です。webAPIやOuAuth認証などについても書かれていますので長く勉強したい方は参考にしてください。

スポンサーリンク

従来のスクレイピング

SeleniumBasicを用いてスクレイピングを行う場合、基本的には以下のようにユーザーが表示されない状態で立ち上がります。

クリックすると拡大します

これはSeleniumBasicのユーザープロフィールがDefaultであることによるものです(SeleniumBasicフォルダ内に起動時のみ作成されます)。

ただこの状態では毎回ログイン情報を入力したり、2段階承認したりする必要があり面倒です。

そこで今回これを回避する為に

  • リモートデバッグ用のEdgeを作成する
  • リモートデバッグのEdgeを操作する

といった操作を行います。

なお難しい内容に思えるかもしれませんが設定自体は簡単なので安心してください。

リモートデバッグ用のEdgeを作成する

リモートデバッグとはネットワーク上の別のコンピュータで動作しているプログラムをデバッグする機能です。

難しい用語ですが今回は「別に存在するEdgeを操作する」機能と思ってもらえればOKです。


このEdgeの作成方法は以下になります。

1.以下のコードを「ファイル名を指定して実行」の「名前」のところに打ち込む

"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9222 --user-data-dir="C:\Temp_Edge"
クリックすると拡大します

2.新たなEdgeが立ち上がるので、「確認して続ける」、「確認して閲覧を開始する」をクリックする

クリックすると拡大します

ここまで行うと拡張機能などが自動的にインストールされ、既存のEdgeと同じ環境が構築されます。

リモートデバッグ用のEdgeのショートカットを作成する

リモートデバッグ用のEdgeは作成できましたが、毎回ファイル名を指定して実行するのは面倒です

その為に以下の方法でショートカットを作成します。

1 msedge.exeを右クリックしてショートカットを作成する(私の環境下ではC:\Program Files (x86)\Microsoft\Edge\Applicationにあります。デスクトップにショートカットを作ります)

クリックすると拡大します

2 ショートカットを右クリックして「リンク先」のところに先ほどと同じコードをコピー&ペーストする

"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9222 --user-data-dir="C:\Temp_Edge"
クリックすると拡大します

これでリモートデバッグ用のEdgeのショートカットが作成できました。

リモートデバッグ用のEdgeを操作する(SetCapabilityメソッド)

リモートデバッグ用のEdgeを使ってYahooメールにログインするコードは以下のようになります。

なお動かす場合はあらかじめ先ほど作成したEdgeを立ち上げておく必要があるので注意ください。

Sub sample()
    Dim Driver As New Selenium.WebDriver
    
    Driver.SetCapability "ms:edgeOptions", "{""debuggerAddress"":""127.0.0.1:9222""}"
    
    Driver.Start "Edge"
    
    Driver.Get "https://www.yahoo.co.jp/"

    Driver.FindElementByCss("#StatusMail > a > dl").Click
    
    'Driver.FindElementByCss("#username").SendKeys ("ユーザー名") 不要なコード
    
    Driver.FindElementByCss("#btnNext").Click
    
    Driver.Wait 1000
    
    'Driver.FindElementByCss("#passwd").SendKeys ("パスワード") 不要なコード
    
    Driver.FindElementByCss("#btnSubmit").Click
    
End Sub

次に各コードについて説明します。

コードの説明

Driver.SetCapability "ms:edgeOptions", "{""debuggerAddress"":""127.0.0.1:9222""}"

リモートデバッグ用Edgeのアドレスを指定しています。

このアドレスは先ほど「ファイル名を指定して実行」でコピーしたアドレスになります。

このアドレスを指定することでリモートデバッグ用のEdgeをキャッチできるようになります

Driver.Start "Edge"

リモートデバッグしたEdgeを起動します。

実際はすでに起動しているので何も起こりませんが、記載しないと操作できないので注意ください。

'Driver.FindElementByCss("#username").SendKeys ("ユーザー名") 不要なコード
'Driver.FindElementByCss("#passwd").SendKeys ("パスワード") 不要なコード

既存ユーザーにてログインしておりユーザー名やパスワードを記憶している場合は既に入力された状態で表示されます。その為今回の場合は入力が不要になります。

この方法で起動済みのEdgeを操作することができます。


なお今回作成したリモートデバッグ用のEdgeは以下のように構成されています。

・Microsoft Edgeの実行ファイル・・・C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe

・Microsoft Edgeのユーザープロファイル・・・C:\Temp_Edge

つまり今回作成したものはユーザープロファイルだけになります

実際の起動にはこれまでと同じEdgeとSeleniumを用いている為、Driverの更新の際はこれまでと同様の対応になります。
詳しくは以下をどうぞ。

注意点

今回のコードの場合、サイトのアクセス時に分岐が発生する可能性があります。

  • 毎回ログインを要求される
  • 一定期間たつとログインを要求される
  • ログインを要求されない

毎回ログインを求められる場合は同一コードでよいですが、一定期間ログインを求められないサイトの場合はIf文で分けるなどの処理が必要になります。

注意点2

Microsoft Edgeを用いたスクレイピングの際、リモートデバッグ用のEdgeがとらえられないことがあるようです(引用:Selenium + WebDriver + Edge でリモートデバッグポートが開いていないことがある)。

その為、以下の設定をしておきます。

1 Microsoft Edgeの右上の「三点リーダー」をクリックし、「設定」をクリックする

クリックすると拡大します

2 システムとパフォーマンス→「スタートアップブースト」をOFF、「Microsoft Edgeが終了しても~」をOFFにする

クリックすると拡大します

この状態から立ち上げなおすと使用できるようになります。

2023/2/2追記 リモートデバッグ用のEdgeを自動起動させる

上記のコードの最初に以下のコードを追加すると、リモートデバッグ用のEdgeの起動も自動化できます

リンク先のパス」には起動させたいショートカットのパスを記載ください。

Dim objShell As Object
Set objShell = CreateObject("WScript.Shell")
    
objShell.Run "リンク先のパス"

なおファイル名に空白があると起動しません

その場合は”リンク先のパス”に対して“” “”で囲むことで解決できます。

以下のリンクに詳しく書かれています。

VBA Shell 関数:exe を実行する – Tipsfound

今回のまとめ

今回リモートデバッグ用のEdgeを作成し、コードに記載することで

ログインの際ユーザー名、パスワード入力が不要になる

(再ログインを要求されないサイトの場合は)ログイン操作自体が不要になる

ことが可能になります。

以下noteもご覧ください。Chromeですがこのブログ記事をもとにした実コードも公開しています


VBAを使ったものではありませんが、Seleniumを勉強する為の基本的な書籍ですブラウザやキー操作の基本的なコマンドは共通していますのでコードを書く際の参考になります。

こちらもVBAに関してではないですがクローリング全般について書かれた書籍です。webAPIやOuAuth認証などについても書かれていますので長く勉強したい方は参考にしてください。

SeleniumBasicでのWebスクレイピングに関する記事はこちらをどうぞ

Web-APIを用いたデータ取得に関する記事はこちらをどうぞ

【VBA】Web APIを使ってデータを取得する(OpenWeatherMap)1
【VBA】Web APIを使って時間別天気予報を取得する(気象庁API)
【VBA】Web APIを使ってLINE通知を行う(LINE Notify)1

コメント

タイトルとURLをコピーしました