【エクセルVBAでIE操作】ページャーをめくって複数ページからデータを取得する

page

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでInterneteExplorer(IE)を操作する初心者向けのシリーズです。

前回はこちらの記事。

【エクセルVBAでIE操作】検索結果一覧ページから記事紹介文を取得する
初心者向けエクセルVBAでInternete Explorerを操作するシリーズです。今回は記事タイトル、URLに加えて、公開日とカテゴリも取得することで、別のスクレイピングのパターンを練習します。

Yahoo!で任意のキーワードを検索してその検索結果からタイトル、URL、ディスクリプションを取得しました。

ですが実際は、検索した結果はたくさんの記事があり、ページャーによって複数のページにわたって掲載されています。

次のページも自動でクロールしたいですよね…

そんな悩みを解決すべく、今回はページャーを自動でめくっていくプログラムをご紹介します。

では、行ってみましょう!

スポンサーリンク

前回のおさらい

では、前回のおさらいからです。

以下、Yahoo!のトップページから任意のキーワードで検索するマクロをつくりました。

Yahoo! JAPAN
日本最大級のポータルサイト。検索、オークション、ニュース、天気、スポーツ、メール、ショッピングなど多数のサービスを展開。あなたの生活をより豊かにする「課題解決エンジン」を目指していきます。

コードはこちらです。

Sub MySub()
    
    Dim keyword As String
    keyword = InputBox("キーワードを入力してください")
    
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
    
    objIE.Visible = True
    objIE.Navigate "https://www.yahoo.co.jp/"
        
    Wait objIE
    
    Dim htmlDoc As HTMLDocument
    Set htmlDoc = objIE.Document
    
    With htmlDoc
        .getElementById("srchtxt").Value = keyword
        .getElementById("srchbtn").Click
    End With
    
    Wait objIE
    Set htmlDoc = objIE.Document
    
    Dim div As HTMLDivElement
    For Each div In htmlDoc.getElementsByClassName("w")
    
        Dim anchor As HTMLAnchorElement
        Set anchor = div.getElementsByTagName("a")(0)
        
        Dim p As HTMLParaElement
        Set p = div.getElementsByTagName("p")(0)
        
        Debug.Print anchor.innerText, anchor.href, p.innerText
    Next div
        
End Sub

InputBoxで入力したキーワードについてYahoo!で検索して、その検索結果ページから、記事タイトル・URL・ディスクリプションを、デバッグ出力します。

ページャーがどのように構成されているか検証をする

Yahoo!検索結果について複数ページからデータを取得できるようにしていきます。

まずは、Google Chromeのデベロッパーツールで調べていきましょう。

Ctrl + Shift + I でしたね。

Yahoo!検索結果ページのページャー

ページャーの「次へ>」のところを解析してみると、以下で示す要素が担当していることがわかりました。

次へ

getElementsClassByNameメソッドを使ってclass属性「underLline」で唯一の要素を取得できればいいのですが、2ページ目以降を見ると、「<前へ」のリンクにも同じclass属性が使われていました。

なので、span要素に用いられている「次へ」という文字列を判定材料として使わないといけないっぽいですね。

任意のテキストを含む要素を取得する

まず、getElementsClassByNameメソッドで「underLline」をclass属性として持つ要素のコレクションを取得します。

コレクションになりますので、その要素ひとつひとつについてFor Each文でループをして、「次へ」という文字列を含むかどうかを判定していきます。

文字列が含むかどうかを判定するには、条件文にLike演算子を使う方法もありますが、InStr関数を使う方法もありますね。

Instr(文字列1, 文字列2)

InStr関数は文字列1の中に、文字列2を探して、存在すればその存在する文字数を整数で返します。

存在しなければ、0を返します。

なので、0より大きいかどうかで、文字列1の中に文字列2が存在しているかどうかを判定できます。

Yahoo!検索結果を複数ページから取得する

では、それをふまえてコードを作ってみましょう。

こちらです。

Sub MySub()
    
    Dim keyword As String
    keyword = InputBox("キーワードを入力してください")
    
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
    
    objIE.Visible = True
    objIE.Navigate "https://www.yahoo.co.jp/"
        
    Wait objIE
    
    Dim htmlDoc As HTMLDocument
    Set htmlDoc = objIE.Document
    
    With htmlDoc
        .getElementById("srchtxt").Value = keyword
        .getElementById("srchbtn").Click
    End With
    
    Dim page As Long
    For page = 1 To 5
        Wait objIE
        Set htmlDoc = objIE.Document
        
        Dim div As HTMLDivElement
        For Each div In htmlDoc.getElementsByClassName("w")
        
            Dim anchor As HTMLAnchorElement
            Set anchor = div.getElementsByTagName("a")(0)
            
            Dim p As HTMLParaElement
            Set p = div.getElementsByTagName("p")(0)
            
            Debug.Print anchor.innerText, anchor.href, p.innerText
        Next div
            
        Dim span As HTMLSpanElement
        For Each span In htmlDoc.getElementsByClassName("underLline")
            If InStr(span.innerText, "次へ") > 0 Then
                span.Click
            End If
            
        Next span
    Next page
        
End Sub

今回は、For文でカウント変数をpageとして、5ページまで調べるようにしました。

実行すると、以下のように複数ページの結果を取得できます。

Yahoo!検索結果を複数ページ取得した

まとめ

以上、エクセルVBAでIEを操作してページャーをめくりながらクロールする方法についてお伝えしました。

ページャーの作りは各サイトで異なると思いますので、それぞれの構成を検証する必要がありますが、ページャーでのクロールが実現できるとスクレイピングの効率が爆発的に上がります。

ぜひ色々なパターンについて検証と実践を繰り返して、実力を上げていって頂ければと思います。

次回は、フォームにユーザー名、パスワードを入力してログインをする方法をお伝えできればと思います。

429 Too Many Requests

どうぞお楽しみに!

連載目次:エクセルVBAでIEを操作してWEBスクレイピング

IEを操作してWEBページのデータを取得して、エクセルのデータとして取り込む、つまりWEBスクレイピングをエクセルVBAで実現します。各種WEBページを課題として様々なデータの取得の仕方を解説していきたいと思います。

  1. 【エクセルVBAでIE操作】10分で終わるセッティングとWEBページの閲覧確認
  2. 【エクセルVBAでIE操作】HTMLタグと要素そしてドキュメントの取得
  3. 【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのです
  4. 【エクセルVBAでIE操作】ページ内のリンク先URLを全部取得する
  5. 【エクセルVBAでIE操作】ディスクリプションなどの要素をname属性でGetする
  6. 【エクセルVBAでIE操作】hタグなどの要素をタグ名でGetする
  7. 【エクセルVBAでIE操作】WEBページのテーブル要素を自動で取得する方法
  8. 【エクセルVBAでIE操作】WEBページのテーブル要素からセルのデータを取り出す方法
  9. 【エクセルVBAでIE操作】IEで検索窓にキーワードを入力して送信する方法
  10. 【エクセルVBAでIE操作】検索結果一覧から記事タイトルを取得する方法
  11. 【エクセルVBAでIE操作】ブログの記事一覧ページから公開日とカテゴリを取得する
  12. 【エクセルVBAでIE操作】ページャーをめくって複数ページからデータを取得する
  13. 【エクセルVBAでIE操作】ユーザー名とパスワードを入力してログインをする
  14. 【エクセルVBAでIE操作】name属性を利用して画像ボタンをクリックする
  15. 【エクセルVBAでIE操作】alt属性・src属性を利用して画像ボタンをクリックする

コメント

  1. 山田 より:

    「エクセルVBAでInterneteExplorer(IE)を操作する初心者向けのシリーズ」
    を拝見し、VBAの勉強をさせていただいております。
    気が付いたのですが、
    http://tonari-it.com/vba-ie-pagenation/
    の例題が壊れているようです。
    以前に拝見した時は壊れていませんでした。
    とりあえずお知らせしておきます。
    以上です。

  2. 通りすがりのWEB学習者 より:

    どうやら現在のHPでは上記のソースは使用できなくなっています。

    • 通りすがりのWEB学習者さん

      コメントありがとうございます。

      おっしゃる通り、本サイトのテーマを変更したことに伴って、構造が変わってしまい、今のままでは動作しないという状況です。
      ご面倒をおかけしまして、申し訳ありません。

      シリーズ全体で修正を進めていく予定でおります。

タイトルとURLをコピーしました