【SeleniumBasic】Google検索してシートに書き出す【VBA】【追記有】
- [記事公開]2023.04.18[最終更新]2023.12.24
- VBA
- Chrome, ExcelVBA, SeleniumBasic
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検索結果画面から「次へ」のボタンがなくなっています。今は「もっと見る」ボタンです。
-
前の記事
【労働者向】「相談」と「申告」 2023.04.17
-
次の記事
【労働者向】給与明細はとっておくべき【雇用保険】 2023.04.19