こんにちは、blueです。
SeleniumBasicを用いてスクレイピングを行う際、既に開いているChromeブラウザでログインしたいということはないでしょうか?
今回の方法を用いれば
- ログインの際ユーザー名、パスワード入力が不要になる
- (再ログインを要求されないサイトの場合は)ログイン操作自体が不要になる
ということが可能になりますので紹介します(Edge版はこちら)。
なお後者のメリットを使えば、reCAPTHAが必要なサイトについても一度処理してしまえば以降は内部のクローリング処理が可能になります。
また他のメリットもあるようです(今回のまとめに記載)ので参考にしていただければ幸いです。
なお今回の記事は以下のサイトを参考にしています。
◆質問「SeleniumBasic(vba)で既に起動済みのChromeを制御する方法をご教示お願い致します」 – 既に起動済みのChro… – Yahoo!知恵袋
SeleniumのChromeDriverで起動済みのブラウザを操作する – Qiita
VBAを使ったものではありませんが、Seleniumを勉強する為の基本的な書籍です。ブラウザやキー操作の基本的なコマンドは共通していますのでコードを書く際の参考になります。
こちらもVBAに関してではないですがクローリング全般について書かれた書籍です。webAPIやOuAuth認証などについても書かれていますので長く勉強したい方は参考にしてください。
従来のスクレイピング
SeleniumBasicを用いてスクレイピングを行う場合、基本的には以下のようにユーザーが表示されない状態で立ち上がります。
これはSeleniumBasicのユーザープロフィールがDefaultであることによるものです(SeleniumBasicフォルダ内に起動時のみ作成されます)。
ただこの状態では毎回ログイン情報を入力したり、2段階承認したりする必要があり面倒です。
そこで今回これを回避する為に
- リモートデバッグ用のChromeを作成する
- リモートデバッグのChromeを操作する
といった操作を行います。
なお難しい内容に思えるかもしれませんが設定自体は簡単なので安心してください。
リモートデバッグ用のChromeを作成する
リモートデバッグとはネットワーク上の別のコンピュータで動作しているプログラムをデバッグする機能です。
難しい用語ですが今回は「別に存在するChromeを操作する」機能と思ってもらえればOKです。
このChromeの作成方法は以下になります。
1.以下のコードを「ファイル名を指定して実行」の「名前」のところに打ち込む
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -remote-debugging-port=9222 --user-data-dir=C:\Temp_Chrome
2.新たなChromeが立ち上がるので、「Chromeをすでにご利用の場合ログイン」をクリックする
3.Chromeへのログインを要求されるので、登録済みのメールアドレスとパスワードを入力する。
4.以下の画面で同期を「有効にする」をクリックする
ここまで行うと拡張機能などが自動的にインストールされ、既存のChromeと同じ環境が構築されます。
またデスクトップに自動でショートカットも作成されます。
これがリモートデバッグ用のChromeになります。
リモートデバッグ用のChoromeを操作する(SetCapabilityメソッド)
リモートデバッグ用のChromeを使ってYahooメールにログインするコードは以下のようになります。
なお動かす場合はあらかじめ先ほど作成したChromeを立ち上げておく必要があるので注意ください。
Sub sample()
Dim Driver As New Selenium.WebDriver
Driver.SetCapability "debuggerAddress", "127.0.0.1:9222"
Driver.Start "Chrome"
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 "debuggerAddress", "127.0.0.1:9222"
リモートデバッグ用Chromeのアドレスを指定しています。
このアドレスは先ほど「ファイル名を指定して実行」でコピーしたアドレスになります。
このアドレスを指定することでリモートデバッグ用のChromeをキャッチできるようになります。
Driver.Start "Chrome"
リモートデバッグしたChromeを起動します。
実際はすでに起動しているので何も起こりませんが、記載しないと操作できないので注意ください。
'Driver.FindElementByCss("#username").SendKeys ("ユーザー名") 不要なコード
'Driver.FindElementByCss("#passwd").SendKeys ("パスワード") 不要なコード
既存ユーザーにてログインしておりユーザー名やパスワードを記憶している場合は既に入力された状態で表示されます。その為今回の場合は入力が不要になります。
この方法で起動済みのChromeを操作することができます。
なお今回作成したリモートデバッグ用のChromeは以下のように構成されています。
・Google Chromeの実行ファイル・・・C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
・Google Chromeのユーザープロファイル・・・C:\Temp_Chrome
つまり今回作成したものはユーザープロファイルだけになります。
実際の起動にはこれまでと同じChromeとSeleniumを用いている為、Driverの更新の際はこれまでと同様の対応になります。
詳しくは以下をどうぞ。
注意点
今回のコードの場合、サイトのアクセス時に分岐が発生する可能性があります。
- 毎回ログインを要求される
- 一定期間たつとログインを要求される
- ログインを要求されない
毎回ログインを求められる場合は同一コードでよいですが、一定期間ログインを求められないサイトの場合はIf文で分けるなどの処理が必要になります。
2023/2/2追記 リモートデバッグ用のChromeを自動起動させる
上記のコードの最初に以下のコードを追加すると、リモートデバッグ用のChromeの起動も自動化できます。
「リンク先のパス」には起動させたいショートカットのパスを記載ください。
Dim objShell As Object
Set objShell = CreateObject("WScript.Shell")
objShell.Run "リンク先のパス"
なおファイル名に空白があると起動しません。
その場合は”リンク先のパス”に対して“” “”で囲むことで解決できます。
以下のリンクに詳しく書かれています。
VBA Shell 関数:exe を実行する – Tipsfound
今回のまとめ
今回リモートデバッグ用のChromeを作成し、コードに記載することで
・ログインの際ユーザー名、パスワード入力が不要になる
・(再ログインを要求されないサイトの場合は)ログイン操作自体が不要になる
ことが可能になります。
以下noteもご覧ください。このブログ記事をもとにした実コードも公開しています。
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
コメント