【Excel VBA】Webスクレイピングで取得,書込み,クリック②

投稿者: | 2020年10月8日
excelアイコン

エクセルバージョン

マイクロソフト365

 

エクセルでwebスクレイピングする場合は、前回のサイトをを表示する①で解説した2通りのどちらかの方法ではInternet Explorerオブジェクトを作成します。

前回少しご紹介した下記の参照設定を必ず設定してください。
Microsoft HTML Object Library

 

Httpリクエストで高速スクレイピングをしたい場合はこちら

 

繰り返し処理(ForEach)

webスクレイピングでHTMLの目的の場所を探しだすには、エクセルの繰り返し処理で検索して取得やクリックをしていきます。

そしてスクレイピングに必要な繰り返し処理がForEachになります。

【使用例】

Debug.Print

目的の場所を探す

下記4つのメソッドで引数を指定してHTMLの目的の要素や属性を絞り込みます。

ちなみにこちらはジャバスクリプトで、DOMツリー操作をするためのDocumentオブジェクトのメソッドなります。

参照設定をすることによりエクセルVBAでも使用できるのでこれらを使用して取得が可能になるという仕組みになっております。

メソッド

 

①getElementsByTagName(”タグ名(要素名)“)

その名のとおりタグ名(要素名)を指定して目的のタグ名(要素名)を探します。

要素とは

【例】<a href=”https://dailyrecords.blog/”>デイレコ</a>

HTMLのaの部分です。通常はaタグと呼ばれます。

【使用例1】

デイレコ   (←左のようなaタグを検索してリンク文字(innerText)にデイレコが含まれていたらリンクをクリックする例)instr関数を上手く利用します。

【使用例2】

Like演算子でワイルドカードを使用したパターン検索でも簡単にクリックできます。

 

②getElementsByName(“name属性値”)

HTMLのname属性値を指定して目的のname属性値を探します。

name属性とは

【例】<input type=”text” name=”Email” > 

HTMLのnameの部分です。nameが属性、Emailが属性値です。

【使用例】(name属性値がEmailだったらsample@google.comと入力する例)

【結果】←みたいな感じで書き込めます。

 

③getElementsByClassName(”class属性値”)

HTMLのclass属性値を指定して目的のclass属性値を探します。

class属性とは

【例】<li class=”price”>¥100</li>

HTMLのclassの部分です。この場合はclassが属性、priceが属性値です。

【使用例】(classの属性値がpriceの文字をセルA1に書き込む例)

【結果】セルA1に¥100が書き込まれます。

 

④getElementById(”id属性値”)

HTMLのid属性値を指定して目的のid属性値を探します。

探し方は②や③と一緒でgetElementByIdに変更するだけです。

取得

・innerText(要素(タグ)を含まない文字のみを取得)

・outerText(要素(タグ)を含まない文字のみを取得)

・innerHtml(要素内のHTMLと文字を取得)

・outerHtml(要素と要素内のHTMLと文字を取得)

※こちらはjavascriptのプロパティになります。

取得サンプル

全pタグの文字のみを取得してA列に1行ずつ書き出します(innerText

全pタグのタグも含めた文字を取得してA列に1行ずつ書き出します(outerHTML

全aタグのリンクを取得しながら動的配列(ReDim Preserve)に格納してB列に1行ずつ書き出します(outerText

UBoundで配列の最大個数(インデックスの最大値)を取得

 

書込み(valueメソッド)

テキストボックスに書き込む

<input type=”text” class=”testBox”>

【結果】←みたいな感じで書き込めます。

 

パスワードに書き込む

【結果】←みたいな感じで書き込めます。

※実際の場面では●●●●●になります。

 

クリック(clickメソッド)

送信ボタン

 

ラジオボタン

男<input type=”radio” name=”gender” value=”male”>
女<input type=”radio” name=”gender” value=”female”>

【結果】 女←みたいな感じで選択します。

 

【結果】 女←みたいな感じで選択します。

 

【結果】 女←みたいな感じで選択します。

 

【結果】 女←みたいな感じで選択します。

 

チェックボックス

【結果】 りんご バナナ みかん ←みたいな感じで選択します。

 

【結果】 りんご バナナ みかん ←みたいな感じで選択します。

 

【結果】 りんご バナナ みかん ←みたいな感じで選択します。

 

今回ご紹介した取得、書込み、クリック方法は一例で、まだまだ沢山やり方が存在します。ですので実際の場面ではHTMLの中身によって柔軟に対応すればいいかと思います。

どのサンプルコードがよいのかというのは特別ないので、ご自身の得意となる方法を発見していろいろ試してみてくださいねヾ ^_^♪

 

サイトが表示されるまで待つ

サイトの読み込みが完了しないときちんとした情報が取得できないので、下記の二つのプロパティのうちどちらかで読込待ちをします。

InternetExplorerオブジェクト

・busyプロパティ

・readyStateプロパティ

 

busyプロパティ

true : 読込中

false : 読込完了

【使用例】(trueの間は読込待ちをする例)

【Excel VBA】繰り返しループ処理

 

readyStateプロパティ

状態詳細
READYSTATE_COMPLETE4読込完了
READYSTATE_INTERACTIVE3インタラクティブ
READYSTATE_LOADED2初期化
READYSTATE_LOADING1読込中
READYSTATE_UNINITIALIZED0デフォルトの初期化状態

【使用例】(読込中は読込待ちをする例)

 

時間指定で待機する

時間指定で読み込み待ちしたい場合は、下記のメソッドで待機できます。

Application.Wait

 

その他の取得プロパティ

【使用例】(リンクを全取得とjavascriptを全取得する例)

Debug.Print

 

サーバーにhttpリクエストでスクレイピング

下記のようにIEオブジェクトを使用せずにもスクレイピングが可能です。

MSXML2ライブラリーのXMLHTTP60オブジェクトを使用して、サーバーに直接httpリクエスト(要求)を送信することで、IEを開かなくてもHTMLテキストを読み込むことができます。

サーバーからのresponseTextはHTMLテキストのままなので、HTMLDocumentオブジェクトを作成してDOMツリー操作をできるようにします。

実行する場合は下記2つを参照設定します。

ツール → 参照設定

参照設定httpリクエスト2

参照設定が終わったら下記をコピペして早速試してみましょう(^^♪

IEオブジェクトを作成するよりはるかにスピードが速いのが特徴です!

Debug.Print

まとめ

スクレイピングはHTMLも若干理解が必要ですが、慣れればそんなに難しくないので、挫折しないように少しずつ覚えていきましょう!

以上です。