みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでInterneteExplorer(IE)を操作する初心者向けのシリーズです。
前回はこちらの記事。
Yahoo!で任意のキーワードを検索してその検索結果からタイトル、URL、ディスクリプションを取得しました。
ですが実際は、検索した結果はたくさんの記事があり、ページャーによって複数のページにわたって掲載されています。
次のページも自動でクロールしたいですよね…
そんな悩みを解決すべく、今回はページャーを自動でめくっていくプログラムをご紹介します。
では、行ってみましょう!
前回のおさらい
では、前回のおさらいからです。
以下、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 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 でしたね。
ページャーの「次へ>」のところを解析してみると、以下で示す要素が担当していることがわかりました。
次へ
getElementsClassByNameメソッドを使ってclass属性「underLline」で唯一の要素を取得できればいいのですが、2ページ目以降を見ると、「<前へ」のリンクにも同じclass属性が使われていました。
なので、span要素に用いられている「次へ」という文字列を判定材料として使わないといけないっぽいですね。
任意のテキストを含む要素を取得する
まず、getElementsClassByNameメソッドで「underLline」をclass属性として持つ要素のコレクションを取得します。
コレクションになりますので、その要素ひとつひとつについてFor Each文でループをして、「次へ」という文字列を含むかどうかを判定していきます。
文字列が含むかどうかを判定するには、条件文にLike演算子を使う方法もありますが、InStr関数を使う方法もありますね。
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ページまで調べるようにしました。
実行すると、以下のように複数ページの結果を取得できます。
まとめ
以上、エクセルVBAでIEを操作してページャーをめくりながらクロールする方法についてお伝えしました。
ページャーの作りは各サイトで異なると思いますので、それぞれの構成を検証する必要がありますが、ページャーでのクロールが実現できるとスクレイピングの効率が爆発的に上がります。
ぜひ色々なパターンについて検証と実践を繰り返して、実力を上げていって頂ければと思います。
次回は、フォームにユーザー名、パスワードを入力してログインをする方法をお伝えできればと思います。
どうぞお楽しみに!
連載目次:エクセル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属性を利用して画像ボタンをクリックする
コメント
「エクセルVBAでInterneteExplorer(IE)を操作する初心者向けのシリーズ」
を拝見し、VBAの勉強をさせていただいております。
気が付いたのですが、
http://tonari-it.com/vba-ie-pagenation/
の例題が壊れているようです。
以前に拝見した時は壊れていませんでした。
とりあえずお知らせしておきます。
以上です。
ご指摘ありがとうございました!
助かりました…。
修正を致しました。
今後ともどうぞよろしくお願いいたします!
どうやら現在のHPでは上記のソースは使用できなくなっています。
通りすがりのWEB学習者さん
コメントありがとうございます。
おっしゃる通り、本サイトのテーマを変更したことに伴って、構造が変わってしまい、今のままでは動作しないという状況です。
ご面倒をおかけしまして、申し訳ありません。
シリーズ全体で修正を進めていく予定でおります。