VBA技術解説
VBA+SeleniumBasicで検索順位チェッカー作成

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2019-05-18 最終更新日:2019-06-22

VBA+SeleniumBasicで検索順位チェッカー作成


VBAでSeleniumBasicを使って検索順位チェッカーを作ってみます。
SEO対策として各キーワードでの検索順位チェックは欠かせませんが、
簡単に使えてキーワードを大量に指定できる良いツールがなかなかありません。


Google検索をスクレイピングすることは、Google利用規約に反する可能性があります。
ここには技術解説としてVBAコードを掲載しますが、この利用を推奨しているものではありません。
掲載したVBAコードの利用については、各自のご判断でお願いします。


そこで、エクセルVBAでSeleniumBasicを使い、Googleの検索結果から順位を取得するVBAを作成してみました。
Seleniumについて

VBAのスクレイピングを簡単楽にしてくれるSelenium
・SeleniumBasicのインストール ・VBEでの参照設定 ・WEBサイトを表示してみましょう ・Seleniumの基本的な使い方(株価情報を取得してみる) ・色々なパターンでのseleniumの使い方 ・色々組み合わせて目的の画面にたどり着きます ・elementをコレクションで取得する ・新規ページが開かれる場合 ・上手くいかない特殊な場合の対処方法 ・Seleniumの実践例例 ・最後に

今回は技術解説というより、上記記事の実践編サンプルとしての位置づけになります。


VBAコードについて特に解説が必要な部分もみあたりません。
コードだけを掲載しておきますので参考にしてください。
css selectorや、class,tagについては、chromeデベロッパーツールで確認してください。
VBA自体は難しいものではないと思います。
作成時間の多くは、対象の適切なエレメントを探す時間に費やされることになります。

シート構成

VBA マクロ スクレイピング

C1:サイトURL
A4~:キーワード(個数制限なし)
B3:取得日
C4~:検索結果に掲載されているページタイトル
B4~:検索結果に掲載されているページURL
E列以降:前回以前の順位履歴

検索順位チェッカーのVBA全コード

Option Explicit

Private Driver As Selenium.WebDriver
Private Const gUrl As String = "https://www.google.co.jp/"
'検索ボックスのCSS selector
Private Const gSearch As String = "#tsf > div:nth-child(2) > div > div.RNNXgb > div > div.a4bIc > input"

Sub RankCheker()
  '起動シートの初期処理
  Dim ws As Worksheet
  Set ws = ActiveSheet
  Dim siteUrl As String
  siteUrl = ws.Range("C1") 'サイトURL
  
  'Seleniumの初期処理
  Dim sKey As New Selenium.Keys
  Dim elm As Selenium.WebElement
  Set Driver = New Selenium.WebDriver
  Driver.Start "chrome"
  
  Dim i As Long
  Dim cntRank As Long
  With ws
  
    '前回実行日は前日以前なら履歴を残す
    If .Range("B3").Value < Date Then
      .Columns("E").Insert
      Intersect(.Range("A3").CurrentRegion, .Columns("B")).Copy _
        Destination:=.Range("E3")
      .Columns("E").AutoFit
    End If
    
    '出力範囲を初期クリア
    .Range("A3").CurrentRegion.Offset(1, 1).Resize(, 3).ClearContents
    For i = 4 To .Cells(.Rows.Count, 1).End(xlUp).Row
      Driver.Get gUrl
      Set elm = Driver.FindElementByCss(gSearch)
      
      '検索ボックスへキーワード送信
      elm.Clear
      elm.SendKeys .Cells(i, 1)
      elm.SendKeys sKey.Enter
      
      '検索結果からサイト掲載要素を取得
      Set elm = getElement(siteUrl, _
                .Cells(i, 1).Value, _
                cntRank)
      If Not elm Is Nothing Then
        .Cells(i, 2) = cntRank
        .Cells(i, 3) = elm.FindElementByTag("h3").Text
        .Cells(i, 4) = elm.Attribute("href")
      Else
        .Cells(i, 2) = "圏外"
      End If
    Next
    
    '実行日設定
    .Range("B3") = Date
  End With
  
  '終了処理:Close,Quitは無くても良いけど
  Driver.Close
  Driver.Quit
  Set Driver = Nothing
  MsgBox "取得完了"
End Sub

'指定selectorの要素を取得:ページ内に無い場合は「次へ」
Private Function getElement(ByVal siteUrl As String, _
              ByVal sCss As String, _
              ByRef cntRank As Long) _
              As Selenium.WebElement
  Set getElement = Nothing
  Dim elm As Selenium.WebElement
  Dim elms As Selenium.WebElements
  Dim cntPage As Long
  cntRank = 0
  On Error Resume Next
  Do
    '検索結果表示領域全体:キーワードにより表示が違う場合あり
    Set elm = Driver.FindElementByCss("#rso > div:nth-child(2) > div")
    If Err Then
      Err.Clear
      Set elm = Driver.FindElementByCss("#rso > div > div")
      If Err Then
        Exit Function
      End If
    End If
    '10件表示が<div class="g">で繰り返されている
    Set elms = elm.FindElementsByClass("g")
    If Err Then Exit Function

    For Each elm In elms
      cntRank = cntRank + 1
      '<div class="g">の中に入っているので
      Set elm = elm.FindElementByClass("r").FindElementByTag("a")
      If Err Then Exit Function
      If elm.Attribute("href") Like siteUrl & "*" Then
        Set getElement = elm
        Exit Function
      End If
    Next
    
    '100位まで
    cntPage = cntPage + 1
    If cntPage >= 10 Then
      Exit Function
    End If
    
    Driver.FindElementByLinkText("次へ").Click
    If Err Then
      Exit Function
    End If
  Loop
End Function

動作が安定しないときは、画面切り替わり直後に適宜待ち時間を入れてください。
Driver.Wait ミリ秒

短時間に大量の検索を行うとエラーになります。
Google検索のスクレイピングはGoogle利用規約に反する可能性もあり、
過度な検索実行は控えてください。

最後に

掲載したVBAについては、ご自由に改変してお使いください。

実行してみると分かりますが、意外と早く取得できます。
お好みに合わせて変更し、上手く使えば結構役に立つツールにできると思います。



同じテーマ「マクロVBA技術解説」の記事

VBAでのSQLの基礎(SQL:Structured Query Language)

・SQL文 ・SELECT文 ・SQLの学習について ・実践例
VBAで正規表現を利用する(RegExp)
・メタ文字 ・正規表現 ・正規表現RegExpの使い方 ・RegExpオブジェクト ・RegExpの使用例 ・RegExp関連のオブジェクト ・Execute(Matches,Match,SubMatches)の使用例 ・Replaceの使用例 ・先読み:肯定先読み、否定先読み ・正規表現の実践例
VBAでメール送信する(CDO:Microsoft Collaboration Data Objects)
・バインディング方法 ・CDOを使ったメール送信のサンプルVBA ・CDOのプロパティ ・CDOのメソッド ・CDO.Configuration.Fields.Item ・CDO.Fields.Item ・ConstantやEnumについて
VBAでのOutlook自動操作
・Outlookインスタンスの生成と、ログオン、全て送受信 ・Outlookを起動して指定フォルダーを表示 ・フォルダーの取得 ・メールの一覧を取得 ・メールを送信 ・メールを返信 ・最後に
ADO(ActiveX Data Objects)の使い方の要点
・データベースの種類 ・SQL(SQL:Structured Query Language) ・ADOを使う準備 ・ADOでのDB接続方法 ・ADODB.Recordsetの取得方法 ・ADODBのレコードセットの扱い方 ・ADODBのトランザクション処理 ・ADODB.Commandの使い方 ・VBA100本ノックでの実践例 ・最後に注意点等
特殊フォルダの取得(WScript.Shell,SpecialFolders)
・WScript.Shell ・SpecialFolders プロパティ ・WshShellのSpecialFoldersのマクロVBA使用例
参照設定、CreateObject、オブジェクト式の一覧
VBAでエクセル外のオブジェクトを使うときには、事前バインディングと遅延バインディング(実行時バインディング)の2通りがあります、この時それぞれ何を指定したらよいのか、指定する文字列が長いので結構探してしまうことが度々あります。そこで、自身の覚え書きとしての意味も含めて、参照設定、CreateObjectのclas…
VBAのスクレイピングを簡単楽にしてくれるSelenium
・SeleniumBasicのインストール ・VBEでの参照設定 ・WEBサイトを表示してみましょう ・Seleniumの基本的な使い方(株価情報を取得してみる) ・色々なパターンでのseleniumの使い方 ・色々組み合わせて目的の画面にたどり着きます ・elementをコレクションで取得する ・新規ページが開かれる場合 ・上手くいかない特殊な場合の対処方法 ・Seleniumの実践例例 ・最後に
VBA+SeleniumBasicで検索順位チェッカー作成
VBA+SeleniumBasicで検索順位チェッカー(改)
・シート構成 ・検索順位チェッカーのVBA全コード ・最後に
.Net FrameworkのSystem.Collectionsを利用
・ArrayList ・SortedList ・Hashtable


新着記事NEW ・・・新着記事一覧を見る

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ