【Excel VBA】Seleniumでページネーションを順番にクリックして一覧データを取得する方法

Excel VBAとSeleniumを使ってWebスクレイピングをしていると、1ページ目のデータだけではなく、2ページ目以降のデータもまとめて取得したい場面があります。

たとえば、検索結果一覧や商品一覧、求人一覧などのWebサイトでは、画面下部に「次へ」やページ番号が表示されていることがあります。

このような複数ページに分かれている一覧画面を、ページネーションと呼ぶことがあります。

今回は、Excel VBAとSeleniumを使って、ページネーションを順番にクリックしながら一覧データを取得し、Excelへ出力する方法について紹介します。

ページネーションとは

ページネーションとは、一覧データを複数ページに分けて表示する仕組みのことです。

Webサイトで検索結果を表示したときに、画面下部に「1」「2」「3」や「次へ」といったボタンが表示されているものを見たことがあるかと思います。

ページネーション付きの商品一覧サンプル画面

Webスクレイピングで一覧データを取得する場合、1ページ目だけを取得して終わりではなく、必要に応じて2ページ目、3ページ目と順番に移動しながらデータを取得する必要があります。

この処理を手作業で行うと非常に手間がかかりますが、Seleniumを使えば、次のページへ移動しながら自動でデータを取得することができます。

今回作成する処理

今回作成する処理の流れは以下の通りです。

  1. Google Chromeを起動する
  2. 対象のWebページを開く
  3. 現在表示されている一覧データを取得する
  4. 取得したデータをExcelへ出力する
  5. 「次へ」ボタンを探す
  6. 「次へ」ボタンがあればクリックする
  7. ページの読み込みを待つ
  8. 次へボタンがなくなるまで処理を繰り返す

ポイントは、次へボタンがある間だけ処理を繰り返すという考え方です。

ページネーション処理では、最初から何ページあるかを決め打ちするよりも、「次へボタンが存在するか」を確認しながら処理した方が実務では扱いやすいです。

サンプルコード

以下は、ページネーションを順番にクリックしながら、一覧データをExcelに出力するサンプルコードです。

実際に使用する場合は、対象サイトのHTML構造に合わせて、XPathの指定部分を変更してください。

Option Explicit

Sub GetPaginationData()

    Dim driver As New Selenium.WebDriver
    Dim items As Selenium.WebElements
    Dim item As Selenium.WebElement
    Dim nextButton As Selenium.WebElement
    Dim ws As Worksheet
    Dim rowNum As Long
    Dim pageCount As Long

    Set ws = ThisWorkbook.Worksheets("Sheet1")

    rowNum = 2
    pageCount = 1

    ws.Range("A1").Value = "ページ"
    ws.Range("B1").Value = "取得データ"

    ' Chromeを起動
    driver.Start "chrome"

    ' 対象ページを開く
    driver.Get "https://example.com"

    Do While True

        ' ページの読み込み待ち
        driver.Wait 2000

        ' 一覧データを取得
        Set items = driver.FindElementsByXPath("//div[@class='item']")

        ' 取得したデータをExcelへ出力
        For Each item In items
            ws.Cells(rowNum, 1).Value = pageCount
            ws.Cells(rowNum, 2).Value = item.Text
            rowNum = rowNum + 1
        Next item

        ' 次へボタンを取得
        On Error Resume Next
        Set nextButton = driver.FindElementByXPath("//a[contains(text(),'次へ')]")
        On Error GoTo 0

        ' 次へボタンが存在しない場合は処理終了
        If nextButton Is Nothing Then
            Exit Do
        End If

        ' 次へボタンをクリック
        nextButton.Click

        ' 次のページ番号としてカウント
        pageCount = pageCount + 1

        ' 変数を初期化
        Set nextButton = Nothing

    Loop

    MsgBox "データ取得が完了しました。", vbInformation

    driver.Quit
    Set driver = Nothing

End Sub

コードの解説

ここからは、コードの内容を順番に解説していきます。

Chromeを起動して対象ページを開く

以下の部分では、Seleniumを使ってGoogle Chromeを起動し、対象のWebページを開いています。

driver.Start "chrome"
driver.Get "https://example.com"

https://example.com の部分は、実際にスクレイピングしたいWebサイトのURLに変更してください。

ページネーションのあるWebサイトの場合、最初のページを開いてから、次へボタンをクリックしながら処理を繰り返していきます。

一覧データを取得する

以下の部分では、現在表示されているページ内の一覧データを取得しています。

Set items = driver.FindElementsByXPath("//div[@class='item']")
Seleniumで取得する一覧データのHTML要素をデベロッパーツールで確認する画面

FindElementsByXPath を使用すると、条件に一致する複数の要素をまとめて取得できます。

今回の例では、class 属性が itemdiv 要素を取得する想定にしています。

実際のサイトでは、取得したい一覧部分のHTML構造を確認し、適切なXPathに変更する必要があります。

取得したデータをExcelへ出力する

取得した一覧データは、For Each文で1件ずつ取り出してExcelに出力しています。

For Each item In items
    ws.Cells(rowNum, 1).Value = pageCount
    ws.Cells(rowNum, 2).Value = item.Text
    rowNum = rowNum + 1
Next item

item.Text を使うことで、対象要素内に表示されている文字列を取得できます。

今回は、A列にページ番号、B列に取得した文字列を出力する形にしています。

Excel VBAでページネーションの一覧データを取得してExcelに出力した結果

次へボタンをクリックする

ページ内のデータ取得が終わったら、次へボタンを探します。

On Error Resume Next
Set nextButton = driver.FindElementByXPath("//a[contains(text(),'次へ')]")
On Error GoTo 0

次へボタンが存在しないページで FindElementByXPath を実行するとエラーになります。

そのため、ここでは On Error Resume Next を使って、次へボタンがない場合でも処理が止まらないようにしています。

次へボタンが取得できた場合は、以下のようにクリックして次のページへ移動します。

nextButton.Click

次へボタンがない場合は処理を終了する

最後のページまで到達すると、次へボタンが表示されなくなる場合があります。

その場合は、以下の条件でループ処理を終了します。

If nextButton Is Nothing Then
    Exit Do
End If

このようにしておくことで、ページ数を固定せずに、次へボタンがある間だけ処理を繰り返すことができます。

実務で使う場合のポイント

実務でページネーション処理を作成する場合は、対象サイトによって次へボタンの作りが異なります。

たとえば、ボタンの文字が「次へ」ではなく「Next」になっていたり、ページ番号をクリックする形式になっていたり、最後のページではボタンが非活性になるだけの場合もあります。

そのため、実際に処理を作成する場合は、デベロッパーツールでHTML構造を確認し、対象サイトに合わせてXPathを調整することが大切です。

また、次へボタンをクリックした直後は、ページの読み込みが完了していない場合があります。

読み込みが完了する前にデータ取得処理を実行すると、前のページのデータを取得してしまったり、要素が見つからずエラーになることがあります。

そのため、ページ移動後には、一定時間待機したり、対象要素が表示されるまで待つ処理を入れると安定しやすくなります。

注意点

Webスクレイピングを行う場合は、対象サイトの利用規約やrobots.txtなどを確認し、許可されている範囲で実行するようにしてください。

また、短時間に大量アクセスを行うと、対象サイトへ負荷をかけてしまう可能性があります。

ページネーションを自動で巡回する処理では、アクセス回数が多くなりやすいため、必要以上に高速で処理を実行しないように注意が必要です。

業務で使用する場合でも、対象サイトのルールを確認したうえで、適切な間隔を空けて処理することをおすすめします。

まとめ

今回は、Excel VBAとSeleniumを使って、ページネーションを順番にクリックしながら一覧データを取得する方法を紹介しました。

今回のポイントは以下の通りです。

  • ページネーションは複数ページに分かれた一覧画面の仕組み
  • 1ページごとに一覧データを取得してExcelへ出力する
  • 次へボタンがある場合はクリックして次ページへ移動する
  • 次へボタンがなくなったら処理を終了する
  • 実務では対象サイトに合わせてXPathを調整する

1ページ目だけのデータ取得であれば比較的簡単ですが、実務では複数ページを順番に巡回してデータを取得したい場面が多くあります。

ページネーション処理を使えるようになると、Webスクレイピングで取得できるデータの幅が大きく広がります。

最後に

いかがでしたでしょうか。

今回は、Seleniumを使ってページネーションを順番にクリックしながら、一覧データを取得する方法について紹介しました。

Webスクレイピングでは、1ページだけではなく、複数ページに分かれたデータを取得したい場面がよくあります。

そのような場合、次へボタンの有無を確認しながら処理を繰り返すことで、ページ数を固定せずにデータを取得できるようになります。

ただし、Webサイトによってページネーションの作りは異なるため、実際に使用する場合はHTML構造を確認しながら、XPathや待機処理を調整することが大切です。

今回の記事が、VBAを使ったWebスクレイピング開発の参考になれば幸いです。

開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございます。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA