【SeleniumBasic】Google検索してシートに書き出す【VBA】【追記有】

Yahoo!知恵袋で回答した中からご紹介します。Google検索をSeleniumBasic×VBA×Chromeで実行し、検索結果をExcelのワークシートに書き出したいというものです。

質問

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10278526765

VBA selenumu を使い、google 検索で20ページ分のタイトルのみを取得して出力したいのですが、ページをクリックして下記でコマンドで前後の表示されたページのデータ取得し繰り返すコマンドの使い方及び方法が色々試しても分かりません。
素人が調べてどうにか下記の手順まで間違っているかもしれませんが、どうにか出来ましたが?
ご指導御願いできないでしょうか?宜しくお願い申し上げます。

Dim botdata As New ChromeDriver
Dim kmoji as string
’検索文字
kmoji = Range(“AA1”).Value

***不明
botdata.Get “https://www.google.com/search?q=” & kmoji
botdata.FindElementsByCss(“.yuRUbf h3”).Text.ToExcel Range(“A1”)

‘次の検索ページに移動する
With Driver.FindElementsByCss(“#pnnext”)
If .Count > 0 Then Driver.FindElementByCss(“#pnnext”).Click ‘”次へ”のボタンがあればクリック
If .Count = 0 Then Exit For ‘”次へ”のボタンがあるか確認する、無ければそのキーワードの検索終了
End With

***不明

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10278526765

CSSセレクタをご質問者様がすでに調べてくれていますので、実装コードだけ考えればよいから比較的容易な質問だと思いました。

スクレイピングで一番難しいのは、どのセレクタで要素を特定するかですから。

回答

私が考えたコードはこちらです。

Option Explicit
'
'作成:野口香
'作成:2023/04/16
'
Public Sub Google検索()
    '作業用シート
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Worksheets(1)
    
    'Seleniumを用意
    Dim driver As Object
    Set driver = CreateObject("Selenium.WebDriver")
    
    'スクレイピングのお作法・・・wait時間
    Const clWAIT As Long = 100
    
    'Chromeをスタート
    driver.Start "Chrome"
    
    'ブラウザを最大サイズに
    driver.Window.Maximize
    
    '検索文字をワークシートから取得
    Dim stMoji As String
    stMoji = sh.Range("B1").Value
    
    'ワークシートの前回検索結果をクリアコンテンツ
    sh.Range("A1").Resize(sh.Rows.Count, 1).ClearContents
    
    'GoogleURL
    Dim stUrl As String
    stUrl = "https://www.google.com/search?q=" & stMoji
    
    '検索
    driver.Get stUrl
    driver.Wait clWAIT
    
    '検索結果を取得
    Dim elements As Selenium.WebElements
    Set elements = driver.FindElementsByCss(".yuRUbf h3")
    driver.Wait clWAIT
    
    '検索結果をExcelに転記
    Dim Cnt As Long
    Cnt = elements.Count
    Dim ii As Long
    Dim lRow As Long
    lRow = 2
    For ii = 1 To Cnt
        sh.Cells(lRow, 1).Value = elements(ii).Text
        lRow = lRow + 1
    Next ii
    
    '次へがあるか調査
    Dim myBy As Selenium.By
    Set myBy = New Selenium.By
    Do While driver.IsElementPresent(myBy.Css("#pnnext"))
        driver.Wait clWAIT
        '次へがあるなら次へをクリック
        driver.FindElementByCss("#pnnext").Click
        driver.Wait clWAIT
        
        '検索結果を取得
        Set elements = driver.FindElementsByCss(".yuRUbf h3")
        driver.Wait clWAIT
        
        '検索結果をExcelに書き込む
        Cnt = elements.Count
        For ii = 1 To Cnt
            sh.Cells(lRow, 1).Value = elements(ii).Text
            lRow = lRow + 1
        Next ii
            
    Loop
    '終了
    driver.Close
    
    'オブジェクト解放
    Set sh = Nothing
    Set driver = Nothing
    Set myBy = Nothing
    
    '終了メッセージ
    MsgBox "終了"
End Sub

解説

参照設定が必要です。VBEでツール→参照設定→Selenium Type Libraryにチェックしてください。

こういうワークシートを用意します。シート名は今回使っていないので何でもよいですが、使うのは先頭ワークシートです。ブックの先頭に置いてください。

セルB1に検索したい文字列を入力しておきます。

ボタンはフォームで作成し、「Google検索」マクロを登録しておきます。

実行するとこんな感じになります。

9行目から数行空白の行が続いていますが、これは、

Googleが「ほかの人はこちらも質問」というのを同じCssセレクタ(“.yuRUbf h3”)で列挙しているためです。

これを出力したくないなら、セレクタを工夫する(変える)必要があります。

今回作ったファイルをZIPにして置いておきます。例によってSeleniumBasicですから、このマクロブックだけでは動きません。SeleniumBasicだのWebDriverだの.NetFramworkだのが必要ですからご注意を。

https://kn-sharoushi.com/wp-content/uploads/2023/04/20230417Google検索.zip

【追記】

2023年12月20日現在、この記事で紹介したコードは使えなくなっています。

そもそもGoogle検索結果画面から「次へ」のボタンがなくなっています。今は「もっと見る」ボタンです。