みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。
前回の記事はこちら。
検索入力&ボタンクリックのメソッドを追加しました。
さて、今回はその応用になりますが、ログイン処理をするクラスをつくります。
ログインが必要なサイトのスクレイピングをするならば、メソッド化しておくと便利ですものね。
ということで、エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法です。
では、行ってみましょう!
前回のおさらい
まずは、前回のおさらいからです。
IEを操作するクラスIEObjectは以下の通りです。
Public IE As InternetExplorer
Public Document As HTMLDocument
Private Sub Class_Initialize()
Set IE = New InternetExplorer
IE.Visible = True
End Sub
Private Sub Class_Terminate()
IE.Quit
End Sub
Public Sub Navigate(ByVal url As String)
IE.Navigate url
Wait
Set Document = IE.Document
End Sub
Public Sub Wait()
Do While IE.Busy = True Or IE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
End Sub
Sub InputTextById(ByVal id As String, ByVal keyword As String)
Document.getElementById(id).Value = keyword
End Sub
Sub ClickButtonById(ByVal id As String)
Document.getElementById(id).Click
Wait
Set Document = IE.Document
End Sub
前回作成したのは、以下2つのメソッドでした。
- InputTextByIdメソッド:input要素をidで取得してその値を入力する
- ClickButtonByIdメソッド:input要素をidで取得してクリックする
ちなみに、上記IEObjectクラスのコードは、今回の内容で必要なメンバーだけ掲載しています。
それで、検証用の標準モジュールのプロシージャがこちらですね。
Sub MySub()
Dim ieObj As IEObject: Set ieObj = New IEObject
With ieObj
.Navigate "https://www.yahoo.co.jp/"
.InputTextById "srchtxt", InputBox("キーワードを入力してください")
.ClickButtonById "srchbtn"
End With
Stop
End Sub
さて、今回はログイン処理をしたいわけですが、入力欄に入力して、ボタンをクリックする…という動作でいうと、前回の内容が大いに参考になりますね。
WordPressの管理画面にログインする
今回は、例としてWordPressの管理画面にログインしてみたいと思います。
ログインしていない状態で、管理画面のURL「https://example.com/wp-admin/」にアクセスすると以下の画面になります。
ここで、ユーザー名とパスワードを入力し、ログインボタンをクリックすればログインできます。
それぞれの要素は、以下に示すとおりid属性で取得可能です。
- ユーザー名の入力フォーム:id="user_login"のinput要素
- パスワードの入力フォーム:id="user_pass"のinput要素
- ログインボタン:id="wp-submit"のinput要素
ただ、一度ログインをすると、一定のセッションの間はログイン済みと判定されますので、ログイン処理は不要です。
ログイン処理を行うメソッド
では、以上を踏まえて、クラスIEObjectにログイン処理を行うLogInメソッドを追加しました。
コードはコチラです。
Sub LogIn()
Const LOGIN_URL As String = "https://example.com/wp-admin/" 'ログインURL
With Me
.Navigate LOGIN_URL
With .Document
.getElementById("user_login").Value = "XXXXXX" 'ユーザー名を指定
.getElementById("user_pass").Value = "XXXXXXXX" 'パスワードを指定
.getElementById("wp-submit").Click
End With
End With
End Sub
ログインページへのリンクは、既に作成したNavigateメソッドの力を借ります。
検証用のプロシージャはこちらです。
Sub MySub()
Dim ieObj As IEObject: Set ieObj = New IEObject
ieObj.LogIn
Stop
End Sub
いや~スッキリしますね~。
実行すると、未ログインの状態のときは、うまくログインできます。
しかし、一度ログインした後に、再度実行すると、以下のように実行時エラーとなってしまいます。
前述の通り、WordPressの管理画面は一度ログインすると、しばらくのセッションの間はログイン済みになりますので、ログイン画面に飛ばされずに済みます。
ですから、id="user_login"のinput要素が見つからずにエラーとなってしまうのです。
つまり、ログイン済みかそうでないかの判定が必要になるのです。
WordPressに限らず多くのサイトでは同様の仕組みが敷かれていますよね。
ログイン状態かどうかを判定する
ログイン状態かどうかを判定するには、どうしたらよいでしょうか。
ログイン状態であれば、Navigateメソッドでページ遷移したURLをそのまま開けます。
ただし、未ログイン状態であれば、いったんログイン画面のURLにリダイレクトされる、つまり、その際にIEで開いていれうドキュメントは、別のURLのものになっているわけですよね。
ですから、読み込みが完了したときの、IEのドキュメントのURLが、Constステートメントで定義したURLと等しいかどうかを判定すれば良いわけです。
ログイン状態の判定を踏まえたログインメソッド
ログイン状態の判定を踏まえて、前述のLogInメソッドを修正しました。
こちらです。
Sub LogIn()
Const LOGIN_URL As String = "https://example.com/wp-admin/" 'ログインURL
With Me
.Navigate LOGIN_URL
If .Document.url <> LOGIN_URL Then
With .Document
.getElementById("user_login").Value = "XXXXXX" 'ユーザー名を指定
.getElementById("user_pass").Value = "XXXXXXXX" 'パスワードを指定
.getElementById("wp-submit").Click
End With
End If
End With
End Sub
実行すると、ログイン時も未ログイン時もうまく動作してくれることを確認できるはずです。
まとめ
以上、エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法をお伝えしました。
今回のLogInメソッドは、対象となるサイトが異なれば、都度それに合わせてカスタマイズが必要ですね。
ただ、一度作っておくと標準モジュールが非常にスッキリすると思います。
次回は、読み込み待ち処理で、引数で渡した任意の秒数を待つように変更してみたいと思います。
どうぞお楽しみに!
連載目次:エクセルVBAでIEを操作するクラスを作る
エクセルVBAでInternetExplorerを操作してWebスクレイピング、まだまだ現役で必要となる現場もあるでしょう。このシリーズでは、IEを使ったスクレイピングをするときに便利なクラスの作り方をお伝えします。- エクセルVBAでIEを操作するもっとも簡単なクラスを作成する方法
- エクセルVBAでIEを操作するクラスでWebページを開くメソッドを追加する
- エクセルVBAでIEを操作するクラスに読み込み待ちとドキュメント取得の機能を追加する方法
- エクセルVBAでIEを操作するクラスにname属性で取得した要素から内容を取り出すプロパティを作成
- エクセルVBAでIEを操作するクラスにリンクテキストでa要素を探してリンクする方法
- エクセルVBAでIEを操作するクラスにテーブルのデータを取得するメソッドを追加する方法
- エクセルVBAでIEを操作するクラスにWebページのテーブルデータをシートに書き出すメソッドを追加する
- エクセルVBAでIEを操作するクラスに検索入力&ボタンクリックのメソッドを追加する方法
- エクセルVBAでIEを操作するクラスにログイン処理をするメソッドを追加する方法
- エクセルVBAによるIEを操作するクラスに指定秒数の待ち時間を入れるメソッドを追加する