【VBA×Selenium】Web内にある要素を取得するまでループする処理
みなさんこんにちは。
Webスクレイピングをする際、
特定の要素を取得するのに直接HTMLのxPathを指定するかと思います。
サイトによっては読み込みに時間がかかり、先に処理が進んでしまい思わぬエラーとなることがあるかと思います。
今回は、読み込みに時間がかかる処理を挟むときなど、
Web内にある要素を取得するまでループする処理について紹介したいと思います。
この記事はこんな人におすすめ
この記事はこんな人におすすめです!
- VBAプログラミング:初級者~中級者
- Webスクレイピング初学者
- コードだけサクッと取得したい人
- 効率の良いコードを書きたい人
といったところでしょうか。
要素を取得するまでループする処理を導入するメリット
要素を取得するまでループする処理を導入するメリットは以下のとおりです。
- コードの可読性向上
- 汎用性が高く他のサイトにも応用が利く
- Webスクレイピングの基本が定着する
- 予期せぬエラーの回避
といったところでしょうか。
スクレイピングをする際は、様々なサイトに対してスクレイピングを実施することが多いので、
一度やり方を覚えてしまえばかなり有効的なスキルになるかと思います。
コード紹介
凡例はありませんので、さっそくコードの紹介をさせていただきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | '//////////////////////////////////////////////// ' 要素を取得するまでループする処理 '//////////////////////////////////////////////// Sub Xpath_Check() Dim FWFlag As Boolean Dim myBy As New By Dim count As Integer FWFlag = False Dim driver As New Selenium.WebDriver Dim strXpath as String With driver .Start "Chrome" 'クロームブラウザを立ち上げます。 . Get START_URL strXpath = "" ' ここに取得するXpathを代入します。 Do FWFlag = .IsElementPresent(myBy.xPath(strXpath)) .Wait 100 count = count + 1 Debug.Print strXpath & "が見つかりませんでした。(" & count & "回目)" If count = 100 Then MsgBox "要素を取得できなかったため、処理を終了します。" End End If Loop Until FWFlag = True '↑FWFlagがTrue = 対象XPathがあると Loopから抜ける End With End Sub |
コード解説
1 | strXpath = "" ' ここに取得するXpathを代入します。 |
ここでXpathを指定します。
指定方法については過去の記事でもご紹介しております。
1 | .Wait 100 |
ここでは0.1秒待機します。
1秒待機したい場合は1000と数値を変更します。
1 2 3 4 | If count = 100 Then MsgBox "要素を取得できなかったため、処理を終了します。" End End If |
要素を取得するとDo文を抜ける仕組みとなっていますが、
何度も繰り返しているので無限ループとなってしまいます。
そこでcount変数を設け、100回ループしたら強制的にDo文の中身から抜け出すようにしています。
最後に
いかがでしたでしょうか。
スクレイピングの基本として、確実に要素を取得してから次の処理に進むという
シチュエーションは頻繁に遭遇する場面かと思います。
少しでもご参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、依頼したり、何か聞きたいことがあったりしたら
いつでもお気軽にご相談ください。
また、内容についてご不明点があればメッセージをいただけると幸いです。
Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!