みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者向けエクセルVBAでInterneteExplorer(IE)を操作するシリーズです。
前回はこちらの記事です。
Yahoo!検索結果一覧から記事タイトルを取得する方法をお伝えしました。
今回は記事タイトル、URLに加えて、紹介文、つまりディスクリプションも取得してみたいと思います。
ということで、エクセルVBAでIEを操作して検索結果一覧ページから記事紹介文を取得する方法です。
では、行ってみましょう!
前回のおさらい
前回作成したプログラムをおさらいしたいと思います。
以下の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
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 ですね。
調べてみると…
目的のディスクリプションはclass属性が「cut3」というpタグに記述されているようです。
p要素は段落を表す要素ですね。
ただ、このHTMLドキュメントにはpタグは他の部分にもたくさん使われているので、もう少し条件を絞り込まないといけません。
また、対応する記事タイトルとURLリンクもセットで取得したいですよね…
そこで、注目するのが以下のclass属性「w」の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!検索結果ページから、以下のようなデータを抽出できます。
まとめ
以上、エクセルVBAでIEを操作してYahoo!検索結果ページからタイトル・URL・ディスクリプションを取得することができました。
次回はページャーを自動で移動しながら、2ページ目以降の記事一覧も取得する方法についてお伝えします。
どうぞお楽しみに!
連載目次:エクセルVBAでIEを操作してWEBスクレイピング
IEを操作してWEBページのデータを取得して、エクセルのデータとして取り込む、つまりWEBスクレイピングをエクセルVBAで実現します。各種WEBページを課題として様々なデータの取得の仕方を解説していきたいと思います。
- 【エクセルVBAでIE操作】10分で終わるセッティングとWEBページの閲覧確認
- 【エクセルVBAでIE操作】HTMLタグと要素そしてドキュメントの取得
- 【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのです
- 【エクセルVBAでIE操作】ページ内のリンク先URLを全部取得する
- 【エクセルVBAでIE操作】ディスクリプションなどの要素をname属性でGetする
- 【エクセルVBAでIE操作】hタグなどの要素をタグ名でGetする
- 【エクセルVBAでIE操作】WEBページのテーブル要素を自動で取得する方法
- 【エクセルVBAでIE操作】WEBページのテーブル要素からセルのデータを取り出す方法
- 【エクセルVBAでIE操作】IEで検索窓にキーワードを入力して送信する方法
- 【エクセルVBAでIE操作】検索結果一覧から記事タイトルを取得する方法
- 【エクセルVBAでIE操作】ブログの記事一覧ページから公開日とカテゴリを取得する
- 【エクセルVBAでIE操作】ページャーをめくって複数ページからデータを取得する
- 【エクセルVBAでIE操作】ユーザー名とパスワードを入力してログインをする
- 【エクセルVBAでIE操作】name属性を利用して画像ボタンをクリックする
- 【エクセルVBAでIE操作】alt属性・src属性を利用して画像ボタンをクリックする