VBAでIE操作、webデータスクレイピングツール作ってみました

エクセルVBA
この記事は約11分で読めます。

VBAスクレイパーVer1(スクレイピングツール)

ヤフオクサイトのにアクセスしてご希望のワードで検索後、商品リストを一覧にしてエクセルのワークシートに張り付けするVBAツールです。(10日間のお試し版です)

 

VBAにて商品情報を収集しますが、ヤフオクサイト様のサイトデザインの変更や様々な仕様変更などで、ツールがうまく動作しなくなることが予想されます。その場合はご相談いただければ対処いたします。(2020年8月現在動作確認済み)

ベクター(フトウェア流通サイト)さんにて販売予定ですが、ベクターさんの事情で(コロナ禍で業務縮小中とのこと)登録に時間がかかっていて未だに登録できずにいますが、こちらからダウンロードできるようにしておきました。

ダウンロードファイルは圧縮しています。解凍してお使いください。(このファイルはエクセル2013で作成しています。お使いのPCにエクセルが必要です

ファイルには10日間の試用期間が設定され無料でお試しいただけます。

その後も使いたい場合はベクター様から購入できます。

作者: AYUTOKUNN

現在登録申請中ですが、作者ページで本ツールがまだ表示されていない場合は、登録完了までしばらくお待ちください。

主要コード解説

 IE(インターネットエクスプローラー)を起動

1~3行目 objecIEを宣言して、”InternetExplorer.Application”を登録する。

6~11行目 ブラウザの大きさと開く位置を調整。

14行目   ブラウザを表示。

17~20行目 ブラウザにヤフオクのurlを渡してサイトを開く。

 

ヤフオクサイトを開く

上図の20行目のサブプロシージャ内容でヤフオクサイトにアクセスする。

 

 

出品データを収集する

 

データをシートに転記する

15、16行目がブラウザから必要なデータを取り出すための重要なコードになります。

ブラウザを表示している状態で、「F12キー」を押すと、表示しているサイトの内容を構成している開発者用のツールが表示されます。

こんな感じで、上半分はサイトの情報で、下半分がその情報を構成しているHTMLファイルを含んだ開発者ツールです。

使い方はやや難解ですが、しばらくの間色々いじくって見てやっとその動作がわかったようです。欲しい情報の部分のHTMLタグとやらを自動的に表示してくれるようです。そのタグを手掛かりに取り出す情報の部分を切り取る作業を下のコードでしています。

下図の例ではエクスプローラでヤフオクサイトを開いて、検索窓に「エクセル」と書き込んで検索したとき最初に表示された画面の状態です。この状態で「F12キー」を押すと下半分に開発者用のツールが表示された状態です。

上半分の出品情報で「すべて」のタブを見ると8980件となっています。これは文字通りエクセル関連の出品情報が8980件あるという意味です。この状況で出品タイトル価格情報などを一覧表で見たいというシチュエーションがあるとします。この様なネット情報からデータを一覧に取り出すにはデータスクレイピングという技術を利用します。エクセルのVBAにはこの様なネット情報を取り出すためのツールが組み込まれていますから、これを利用します。

上半分のこの様なウェブ情報はHTMLという言語でできているのだそうです。HTMLにはタグと呼ばれる目次みたいなものがついていてそのタグを目的にしてデータを取り出すことができるんです。

そのタグ情報を見つけるために利用するのが、F12キーで表示される開発者ツールなのです。

開発者ツールの使い方

出品タイトルを取り出すには、①に赤丸で囲った部分のアイコンを一回クリックします。

そして青矢印で示したようにマウスカーソルをタイトル部分に移動させクリックするとさらに矢印で示すように、②の様な薄い青色で反転表示した部分が表示され注意してみると、タイトル情報が書かれているHTMLが現れます。この中から具体的にタイトルを取り出すには

データスクレイピングの肝 objecIE.Document.getElementsByTagName

 

objecIE.Document.getElementsByTagName(“h3”) を使います。

一番最後のh3とは ②のところにあるタグの名前です。このh3タグはその上のliというタグの中に含まれていることがわかります。(ですから、liタグやその下のdivタグ使っても、OKなんです。更にclassの部分を使ってもできるんです)ここではh3に絞って解説します。

どうやらこのh3タグにタイトルやその他の情報が書き込まれていることがわかります。そして、更にaタグがあってこの中に赤文字でtitle=”即決 Microsoft office2019最新版アプリ……”という部分を見つけることが出ます。

これでh3タグのtitle=をコードで見つければタイトルを取り出すことができるんです。

このh3タグは各出品データごとに存在しますから、For Eachを使ってこのh3タグ情報を順番に取り出してやるんです。

For Each objectag In objecIE.Document.getElementsByTagName(“h3”)

 

そしてこのh3タグの中から更に、title=を見つけるのが次のコードになります。

If InStr(objectag.outerHTML, “title=”””) > 0 Then

objectag.outerHTMLこの部分がaタグの内容すべてを表していますから、この中にtitle=が含まれている場合は0以上が帰ってくるのでタイトルが存在することがわかりますね。(ここでは存在することがわかればいいからその位置を知る必要がないので、>0とします


InStr は第一引数の中に、第二引数が含まれていればその位置を返します

index = InStr(”あいうえおかきくけこ”,”おかき”)の場合
indexになります

そして、具体的にタイトルを取りだすには

str = objectag.innerTextとするとタイトルだけを取り出すことができます。

そして、シートのどの位置にstrを書き込むか調べて(新規入力可能なセルの行位置)書き込みます。

 

 

objectag.innerTextでデータ取得

 

上図でのタイトルを取り出すときの要領で今度は価格情報を取り出してみます。

obIE.Document.getElementsByClassName(“Product__priceInfo”)

上図の例ではgetElementsByTagNameでしたが、今度はgetElementsByClassNameを使います。

前回同様 For Each を使って

For Each objprice In obIE.Document.getElementsByClassName(“Product__priceInfo”)とします。

開発ツールを使ってdiv、spanのタグのところの▼印をクリックして開けて中を見てみると価格情報が書かれているのが確認できます。つまり、このクラスネームを指定して探せば価格情報を取り出すことができるんです。具体的な取り出し方はobjectag.outerHTML と objectag.innerTextを使いますがouterHTML、innerTextをウェブで調べてみましょう。そして取り出し方を自分なりに工夫することが必要です、サイトの情報は常に変化します。そのHTMLコードの書き方も変化するので一つの取り出し方を書いてもすぐに無意味になってしまいます。どうやったらほしい情報を取り出せるか研究しないといけません。

‘確認の方法—-
’変数の確認は、Debug.Print を使ってやるのが普通なんですが筆者の場合はMsgBox
’を使っています。次のようにして内容を確認し必要なくなったらコメント化します。Dim x As String
Dim x2 As String
x = objprice.outerText
MsgBox x
x = objprice.outerHTML
MsgBox xx2 = objprice.innerText
MsgBox x2
x2 = objprice.innerHTML
MsgBox x2
‘—

 

innerHTML ではタグのコードを含んだ要素全体が取得でき
innerText では要素のText部分だけを取得できるようです。
outerとinnerの違いについてはよく理解していません。

エクセルVBAのIE(InternetExplorer)制御サイトさんの解説を参考にさせていただいています。

実際、innerText で動かしてみると、”現在500円”とか”即決500円”なっています。文字列と数値が入り交ざっているのでこのままでいいならあまり複雑にならないのですが、数値だけほしい場合はこの中から取り出す工夫をしなければならないのでコードが複雑になってしまいました。もっといい方法があるような気がしますが、いまのところこれが限界でした。

以下が取得したデータから数値だけ取り出してシートに書き込むプロシージャになります。

 

このように obIE.Document.getElementsByClassName

objecIE.Document.getElementsByTagNameなどを使てデータを取得してそのデータを様々に加工し利用することができるのです。

データ転記の肝、ワークシートの新規入力行を知る

取得したデータをワークシートに書き込むために、シートのどの位置に書き込むか指定することが必要です

row_Max = ActiveSheet.Cells(Rows.Count, siteiRetu).End(xlUp).Row + 1この一文が新規入力行の行位置を示します。

Cells(Rows.Count, siteiRetu)…第一引数はワークシートの行数、第二引数は列位置を指定します。

第二引数については、ワークシートに存在するデータベースの内データのある最終行をどの列に見るかを指定します。

あるデータベースでA列とB列にA1~A10までデータがあり、B1~B8までデータがあるとしたとき
ActiveSheet.Cells(Rows.Count, siteiRetu).End(xlUp).Row + 1 に於いて)
x = Cells(Rows.Count, ) と、A列を見るとするとxには 11 が入り、
x = Cells(Rows.Count, 2) と、B列を見るとするとxには 9 が取得されるということです。どの列を見るかによってデータを入れる行位置が変わってきますから注意が必要です。

最後に、リンクをあてる

元々、どのサイトのデータを見てもたいていはリンクが貼ってあるところが多くあります。ここで扱っているヤフオクでも出品データのタイトルをクリックすると、そのタイトルの専用のリンク先へジャンプするようになっています。
しかし、前項目までで解説したデータを取りだしてワークシートに書き出す処理ではタイトル名は書き出しできましたが、そこにリンクは設定されていません。(ワークシートに書き出されたタイトルをクリックしても何も起こらないということです。)
そこで、この書き出されたタイトルにリンクを張り付ける作業をします。
objecIE.Document.getElementsByTagName(“h3”) で得られるHTMLデータにはそのリンクデータが含まれています。
下図の青矢印のところがそれです。
赤色アンダーラインの部分でhref=”https://・・・・・~・・・”ここがリンク先情報になっています。
aタグ(アンカー)のエイチレフ属性というらしいです。これを書き出したタイトル名に当て込みます。
下図がそのプロシージャです。
このプロシージャの第一引数はHTMLオブジェクトです。第二引数はタイトル名です。第三引数はタイトルが書き出されている行位置です。
For Each anchor In objIE.Document.Links
繰り返し処理でanchorにはオブジェクトのリンク部分だけが取り出されます。
このオブジェクトのouterHTMLに引数のタイトル名が含まれていればそのhrefを取りだします。
最後に、ActiveSheet.Hyperlinks.Add anchor := ActiveSheet.Cells(gyou, 2), Address:=ur
ワークシートのハイパーリンクプロパティーに、書き出された行位置にあるタイトル名の列にhrefが示すアドレスを当て込んでいます。
これでワークシートのタイトル名が青くなってアンダーラインが敷かれます。(クリックするとリンク先にジャンプします)
ここまででこのプログラムのポイントは解説できたと思います。

最後に、以下に全部をコントロールするプロシージャを載せておきます。お役に立てるかわかりませんが、一生懸命頑張ってみました。どうぞよろしくお願いします!!!意味不明???

 

その他のVBAツールのご紹介

詳細はこちらからどうぞ。

エクセルVBAを始めてみましょう。第5回プログラミングの手法応用編、テキストボックスを利用した電光掲示板を作ってみます。
今回は電光掲示板もどきを作ってみます。 今回は、電光掲示板風に見えるプログラムを開設します。 約12年前に筆者がまだVBAを覚えたてのころ作ったものですから、あまりうまくできていませんが、素人の初心者でもこの程度の物は作れるようになると...

コメント

  1. お世話になります。
    WEBデータのスクレイピング記事ありがとうございました。

    これは、「食べログ」でも実施すること可能でしょうか?

    ご教授頂ければありがたいです。

    どうぞ宜しくお願いします。

    • ブログを見ていただきありがとうございます。

      このスクレイパーはヤフオク専用に作られています。

      各種の検索サイトはそれぞれ独自のHTML構造を持っているので、そのサイトのHTMLファイルを調べた上で、どんな情報が欲しいのかに合わせてプログラムを変更する必要があります。

      食べログのアドレスに変えてやってみると、サイトは表示されますが、検索結果は0でした。

      食べログページでF12キーを押すとHTMLソースツールが表示するので、のぞいてみて下さい。

      せっかく読んでいただいて質問してくださったのに、すっかり遅くなってごめんなさい。

      今後とも鮎斗君をよろしくお願いします。

タイトルとURLをコピーしました