【エクセルVBAでIE操作】検索結果一覧ページから記事紹介文を取得する

collection

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

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

前回はこちらの記事です。

【エクセルVBAでIE操作】検索結果一覧から記事タイトルを取得する方法
初心者向けエクセルVBAでInterneteExplorer(IE)を操作するシリーズです。今回から何回かにわたって、ブログサイトの記事一覧をWEBスクレイピングで取得する方法をお伝えします。

Yahoo!検索結果一覧から記事タイトルを取得する方法をお伝えしました。

今回は記事タイトル、URLに加えて、紹介文、つまりディスクリプションも取得してみたいと思います。

ということで、エクセルVBAでIEを操作して検索結果一覧ページから記事紹介文を取得する方法です。

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

スポンサーリンク

前回のおさらい

前回作成したプログラムをおさらいしたいと思います。

以下の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 h3 As HTMLHeadElement
    For Each h3 In htmlDoc.getElementsByTagName("h3")
        Dim anchor As HTMLAnchorElement
        Set anchor = h3.Children(0)
        Debug.Print anchor.innerText, anchor.href
    Next h3
    
End Sub

Sub Wait(ByVal objIE As InternetExplorer)

    Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop

End Sub

17~20行目までは、Yahoo!の検索窓にキーワードを入力してクリックする処理ですね。

そして25~30行目が、検索結果ページから記事タイトル(h3タグ)とそのリンクURLを取得してデバッグ出力する部分です。

IEの読み込み待ち処理は34~40行目のWaitというSubプロシージャに部品化しました。

Yahoo!検索結果ページから記事・URL・ディスクリプションを取得する

今回は、記事タイトルとURLに加えて、その紹介文つまりディスクリプションを取得していきます。

では、いつものようにGoogle Chromeのデベロッパーツールで、方針を考えてみましょう。 Ctrl + Shift + I ですね。

調べてみると…

Yahoo!検索結果ページのディスクリプション

目的のディスクリプションはclass属性が「cut3」というpタグに記述されているようです。

p要素は段落を表す要素ですね。

ただ、このHTMLドキュメントにはpタグは他の部分にもたくさん使われているので、もう少し条件を絞り込まないといけません。

また、対応する記事タイトルとURLリンクもセットで取得したいですよね…

そこで、注目するのが以下のclass属性「w」のdivタグです。

Yahoo!検索結果ページのdiv要素

div要素はブロックを作るための要素ですが、このclass属性wのdiv要素は、記事タイトル、リンクURL、ディスクリプションを含んでいます。

なので、まずはこの要素をコレクションとして取得することを考えます。

class属性でdiv要素のコレクションを取得しループする

class属性がwの要素を取得すればいいので、getElementsByClassNameメソッドですね。

記事数分のコレクションで取得できますので、For Each文でループをします。

Dim div As HTMLDivElement
For Each div In htmlDoc.getElementsByClassName("w")

    'a要素を取得する処理
    'p要素を取得する処理
    
    'a要素のテキストとhref属性、p要素のテキストをデバッグ出力する処理
Next div

div要素からタイトル・URL・ディスクリプションを取り出す

取得したdiv要素の中に、a要素とp要素は1つずつしかありませんので、それぞれgetElementsByTagNameでコレクションを取得しつつ、そのインデックス0の要素を取得してあげればOKです。

ですから、前述のコメント処理を実際の処理に書き換えると以下のようになります。

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

実行して動作確認をする

まとめのコードは以下のとおりです。

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!検索結果ページから、以下のようなデータを抽出できます。

Yahoo!検索結果ページから取得したデータ

まとめ

以上、エクセルVBAでIEを操作してYahoo!検索結果ページからタイトル・URL・ディスクリプションを取得することができました。

次回はページャーを自動で移動しながら、2ページ目以降の記事一覧も取得する方法についてお伝えします。

【エクセルVBAでIE操作】ページャーをめくって複数ページからデータを取得する
エクセルVBAでIEを操作する初心者向けのシリーズです。今回はページャーをめくって自動でクロールする方法とその見つけ方について解説をします。Webスクレイピングの効率が格段に上がりますよ!

どうぞお楽しみに!

連載目次:エクセル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属性を利用して画像ボタンをクリックする
タイトルとURLをコピーしました