みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者向けエクセルVBAでInterneteExplorer(IE)を操作するシリーズです。
前回はこちらの記事でIEを操作して、Yahoo!JAPANの検索窓でキーワード検索をする方法についてお伝えしました。
今回は、その結果表示された検索結果ページから記事タイトルを抽出してみたいと思います。
ということで、エクセルVBAでIEを操作してYahoo検索結果一覧から記事タイトルを取得する方法です。
では、行ってみましょう!
前回のおさらい
前回は以下の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/"
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
Dim htmlDoc As HTMLDocument
Set htmlDoc = objIE.Document
With htmlDoc
.getElementById("srchtxt").Value = keyword
.getElementById("srchbtn").Click
End With
End Sub
実行すると、InputBox関数による入力ダイアログが表示され、そこに入力したキーワードでYahooの検索をしてくれます。
今回は、その検索結果ページから記事一覧を取得していきますよ。
デベロッパーツールで作戦を練る
Yahooの検索結果ページについて、デベロッパツールで確認して、どのように記事タイトルを取得するか作戦を練りましょう。
Google ChromeでYahooを開いて、適当なワードで検索した結果ページで、デベロッパーツールを開きます。
ショートカットキーは Ctrl + Shift + I ですね。
どうやら、検索結果ページの記事タイトルはh3要素のようです。
その配下にa要素があり、該当のページにリンクすることができます。
さらに、 Ctrl + F で「<h3」と入力してみると、ソース内のh3タグの件数を確認できます。
件数をみると10件、実際の検索結果ページに掲載されている記事タイトルの件数と一致していますので、h3要素を全部取得すれば、目的の記事タイトルをすべて取得できるのでは?ということになります。
検索結果ページから記事タイトルを取得する
HTMLドキュメントからh3要素を取得する
まず、検索結果ページのHTMLドキュメントからh3要素を取得します。
これは、HTMLDocumentオブジェクトのgetElementsByTagNameメソッドで実現できますね。
以下記事でお伝えしたとおりです。
HTML要素の直下の子要素をコレクションで取得する
今回の場合は、そのh3要素についてinnerTextを取得すれば記事タイトル自体は取得できるのですが、せっかくなので記事タイトルだけでなく、リンクURLも取得しましょうか。
となると、h3要素の配下のa要素を取得する必要があります。
h3要素はHTMLHeadElementオブジェクトですので、それに対して、さらにgetElementsByTagNameでa要素を取得しても良いのですが、h3要素の配下の要素、すなわち子要素はa要素ひとつなので、この状況を利用しましょう。
特定のHTML要素について、Childrenプロパティを使うことで、その直下の要素をコレクションとして取得できます。
今回の場合は、HTMLHeadElementオブジェクトになりますから、書式は以下の通りです。
これで取得できるのはコレクションになりますが、子要素はひとつなので丸かっこでインデックス0を指定すれば、a要素を単体オブジェクトとして取得できますね。
Yahooの検索結果ページの記事を取得するプロシージャ
ということで、冒頭のプロシージャに加えて、検索結果ページの記事タイトルとそのURLリンクを取得する処理を追加しました。
こちらです。
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
25~30行目が今回解説した内容をもとに作った処理ですね。
h3要素を取得して、それについてFor Each文でループを回し、Childrenプロパティでa要素を取得しています。
なお、読み込み待ちの処理は複数回必要になりましたので、WaitというSubプロシージャに分離しました。
実行すると、以下のように記事一覧とリンクURLがイミディエイトウィンドウに出力されます。
まとめ
以上、エクセルVBAでIEを操作してYahoo検索結果ページから記事タイトルとURLを取得する方法をお伝えしました。
もうなんとなくおわかりだと思いますが、デベロッパーツールで目的のモノを取得できることが見いだせたのであれば、もうプログラムの大方は出来上がったと言っても良いですね。
次回は続きになりますが、せっかくなので記事詳細も取得してみたいと思います。
どうぞお楽しみに!
連載目次:エクセル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属性を利用して画像ボタンをクリックする