【VBA】Amazon商品情報を取得するWebスクレイピングツールの作り方

  • このエントリーをはてなブックマークに追加

最近クラウドソーシングなどで「Webスクレイピング」案件なるものがあり、興味が沸いたのでツールの作り方をまとめました。

言語はなんでもいいのですが、環境構築不要でとっつきやすいExcel VBAを使って今回は解説していきます。

Webスクレイピングとは?

Webスクレイピングは、あるWebページから特定の情報を取得してデータとしてまとめる事を言います。

通販サイトやオークションサイトの商品情報、ニュースサイトやSNSの情報などが対象サイトとしてよくあげられているようです。

 

VBAでAmazonの商品情報をスクレイピングするツールを作成してみよう

試しにAmazonの売れ筋ランキング(ゲーム部門)の商品情報を取得するツールを作ってみます。

作りたいツールがある場合は、適宜ソースを置換してください。

【参考記事】

[VBA]30分あればできるVBAスクレイピング

VBAのInternetExplorerオブジェクトのVisibleプロパティ

 

手順1. VBAでInternetExplorerとHTMLを操作する準備

VBAでは通常だとWebサイトの操作を行う事が出来ません

ですが、操作を可能にするライブラリーが用意されているので、そのライブラリーを読み込む準備をします。

Excel→VBEを開き、エディタ上ツールバーの「ツール」の中にある「参照設定」をクリック。

「Microsoft Internet Controls」「Microsoft HTML Object Library」を探してチェックを入れます。

 

これで、Webページのデータを取得するためのライブラリーを使う準備が整いました!

 

手順2.IEで特定のURLのページを起動しHTML操作を行う準備関数を作る

これらは上記「[VBA]30分あればできるVBAスクレイピング」のソースコードを参考にして作ります。

標準モジュールを新規作成し、以下のコードを記述します。

 

main関数が実行されると「getpage」「WaitResponse」という2つの共通関数を呼ぶようにしています。

2つの関数についてそれぞれ説明します。

 

・getpage関数

IEオブジェクトを作成して、設定されたURLのページをIEで表示させる処理です。

引数に「IEオブジェクトを保持する変数」と「URL文字列」を指定します。

引数のIEオブジェクトはByRef(参照渡し)でmain関数の「objIE」とgetpage関数「objIE」の値ははリンクしていますので、作成されたIEオブジェクトはそのままmain関数に引き継がれます。

 

・WaitRespons関数

IEが立ち上がり、指定したURLのページが表示されるまで待機する関数です。

表示まで出来たら、処理を解放し次の処理を行います。

 

ここまで来出来たら、main関数を実行してみましょう。

実行するとこんな感じにIEが立ち上がります。

 

手順3.ページのHTMLソースから特定の情報を取得する

ページの情報を取得するにはあらかじめページのHTMLソースを確認する必要があります。

(ここからはHTMLを扱う知識がある程度必要になります。)

 

まず、情報を取得するページをブラウザで開きます。ブラウザはIE、chrome、FireFoxなどなんでもOKですが、今回はchromeを使います。

ページを開いて「F12」キーを押すと下の画像のようにページのHTMLソースが表示されます。

ここから取得したい要素の「class名」「id名」を特定してVBAで操作します。

 

ちなみに、カーソルをコードやページの要素に近づけるとどこの部分なのか簡単にわかって便利です。

 

要素の「class名」「id名」を取得出来たら、VBAでテキストを取得する処理を組み込んでいきます。

取得するには「main関数」で作成した「htmlDoc」変数を使います。

 

・id名でテキスト情報を取得したい場合

 

・class名でテキスト情報を取得したい場合

classは同名で複数使われることがあるため、何個目の物を取るか指定する必要があります。

 

class名全てのデータを取得する場合はFor Eachを使って繰り返し処理で取得します。

 

試しにランキング1ページ目のゲーム名の一覧を取得してみます。

main関数を以下のように修正します。

 

実行すると、イミディエイトウィンドウ(下の白い枠)にゲームのタイトルがズラリと表示されました。

 

ここまでがWebスクレイピングツールを作るために基礎知識でした。

あとは、実際に要件に合わせて情報を取得していきます。

 

手順4.要件にあった情報を取得する

今回は簡単に、ランキングページに記載されている「順位」「ゲームタイトル」「価格」を3列に表示させる処理を作っていきたいと思います。

 

「main関数」の中身を下のように修正します。

 

単純にWebページから取得した順位、タイトル、価格をそれぞれの列に1つずつ出力させています。

実行すると、トップ50位までの情報を取得することが出来ました!

 

リンクをクリックしてページ移動をする方法

別ページにボタンやリンクをクリックして移動することも可能です。

クリックしたい要素を取得後、「.Click」で移動することができます。JavaScriptのDOM操作と似てますね…

 

リンク移動を駆使して売れ筋ランキングデータ全取得する

Amazonの売れ筋ランキングは1ページ50位までで区切られているようで、その先は別ページに移動する必要があります。

このクリック移動をうまく使って全てのデータを取得できるようにツールを改造してみます。

 

実行してみると、全ページ分(全2ページ)データを取得できました!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*