IEの代わりにSeleniumを使うVBAコードを考えてみた。

InternetExplorer(IE)は2022年6月15日にサポートが終わります。IEリソースが今後使えなくなることにともない、じゃあどうするか?と考え、勉強がてら作ってみました。

IEリソースのVBAサンプル

IEを使ったVBAのサンプルは、以下を参照しました↓単純で分かりやすかったからです。

VBAのIE操作でツイッターのツイート数・フォロー数・フォロワー数の自動取得

↑こちらはIEを使っていますが、今後は別のブラウザを使うことになります。VBAでブラウザを使うにはSeleniumというドライバーを使うのがよいと思います。以下はSeleniumを使ったVBAコードの説明です。

Seleniumをダウンロードしてインストールする方法は、Web上にあふれていますので、ここでは説明しません。

WebDriver を使用して Microsoft Edge を自動化する

↑こういったサイトを参考にSeleniumを導入してください。

SeleniumでEdgeを使ったVBA

Sub sample()
    Dim driver As Object
    Dim stBuffer As String
    
    Set driver = CreateObject("Selenium.WebDriver")
    
    driver.Start "MicrosoftEdge"
    
    'twitterアカウントページを表示
    driver.Get "https://mobile.twitter.com/" & ActiveSheet.Cells(2, 2).Value

    driver.Wait 3000
    
    'following数取得
    ActiveSheet.Cells(2, 3).Value = driver.FindElementByXPath("//span[contains(text(),""フォロー中"")]/../../span[1]/span").Text
    'follower数取得
    ActiveSheet.Cells(2, 4).Value = driver.FindElementByXPath("//span[contains(text(),""フォロワー"")]/../../span[1]/span").Text
    'tweet数取得。「○○件のツイート」という表現なので、数字部分だけに編集してからセルに転記。
    stBuffer = driver.FindElementByXPath("//*[@id=""react-root""]/div/div/div[2]/main/div/div/div/div/div/div[1]/div[1]/div/div/div/div/div[2]/div/div").Text
    ActiveSheet.Cells(2, 5).Value = Replace(stBuffer, "件のツイート", "")
    
    driver.Quit
    Set driver = Nothing

End Sub

実際に使うためにはTwitter.comとの利用規約を守る必要があります。このコードを使ったことでの、損害、被害等について当方は一切責任を持てませんので、悪しからずご了承ください。

コードの説明

コードは標準モジュールに書きます。ワークシートのセルB2にあらかじめツイッターアカウントのスクリーンID(アットマークで始まる英数字の文字列)を記入しておきます。開発タブのマクロからsampleを起動します。

SeleniumをVBAで使うには、参照設定する方法と、動的生成する方法とがありますが、私は後者で対応しました。CreateObject部分がそれです。”Selenium.WebDriver”と書いてある部分は、”Selenium.EdgeDriver”とすることもできます。”Selenium.EdgeDriver”とした場合は、単にdriver.startすればよく(引数なし)、”Selenium.WebDriver”と書いた場合は、driver.Start “MicrosoftEdge”というように、どのドライバーをスタートさせるのか、引数で指定する必要があります。

Selenium「Edge/Chromeの起動をする」【ExcelVBA】

↑こういったサイトを参考にしてください。

Webページを表示するのは、Getメソッドを使います。引数にURL文字列を与えます。

driver.wait 3000は必ず入れましょう。3秒待ちます。Sleepと似たような動作です。これは対象となるWebサイトによってはスクレイピングを嫌うところも多いので、迷惑をかけないよう、動作をゆっくりするためのコードです。もっと長くてもよいかもしれません。スパムや攻撃と間違えられないよう、謙虚になるためのコードだと私は思っています。

値の取得にはFindElementBy○○○といったメソッドを使います。○○○の部分にはTagやClassなどが入ります。今回、XPathを使いました(FindElementByXPath)。XPathというのは相対パス指定もできます。Webページの中に”フォロー中”という文字列を含む要素を探し出し、そこを基点にして、いったん2階層上(../../)に戻り、そこからspan[1]/spanというタグをたぐっています。なんでこんなめんどいことをしているかというと、元の参考にしたコードだと、単純に数値だったら(IsNumeric)でフォロー中の数を取得していましたが、「1.7万フォロー中」というようなアカウントの場合対応できなくなると思ったからです。もう一つ、アカウントによってはフォロー中の数字までのXPathが異なっていたからという理由もあります。

「フォロワー」数を取得する部分も同様です。

「○○件のツイート」の部分は、完全にXPathをフルパスで取得して貼り付けました。その後、文字列部分をダブルクォーテーション1個から2個に修正しました。VBAでは”(ダブルクォーテーション)がエスケープシーケンスとなっていますので、”(ダブルクォーテーション)そのものを使いたいときは2つ重ねる必要があるのです。

あとは、Quitでdriverを終了させています。お行儀よくやりたかったら、Quitの前にCloseも入れてください。