エクセルからインターネットは開けたよ。

この次は何をするのかな?って人に説明を続けていきます。

[st-card id=115 readmore=”on”]

 

Webページの「タイトル」を取得するプログラムを見ながら、

「HTMLのこれだけは知っておきたい最低限の知識」も学んでおきましょう。

 

サンプルのダウンロード

実際の動きを見るのが一番です。

ダウンロードをして、ボタンをクリックするだけの簡単サンプルを用意しています。

202_IEでスクレイピング(NG)_

202_IEでスクレイピング(OK)_

※②はちゃんと動きます。

 

スクレイピングするときに必要なHTMLの最低限の知識

WebページはHTMLという言語で作られています。

——————Webページの中身はこうなっている——————

<html>

—-<head>

—-—-<title>Webページのタイトル</title>

—-</head>

—-<body>

—-—-<h2>見出し</h2>

—-—-<p>文章</p>

—-</body>

</html>

——————————————————————————

【解説】

オレンジ文字が人間が見ることができるWebページの情報になります。

コンピュータにはタグ<>を使って情報を伝えます。

開始位置<>と終了位置</>で情報を挟んでいると思えばOKです。終了位置のタグには/:スラッシュが入ります。

 

今回狙うのはタイトルなのでプログラムでは

<title>Webページのタイトル</title>

のオレンジ文字を取得するイメージです。

 

コード解説

※グレー色のところは前回の説明済み内容

——————プログラム構文——————

Dim ObjIe As InternetExplorer
Set ObjIe = CreateObject(“Internetexplorer.Application”) 

ObjIe.Visible = True 

ObjIe.navigate “https://www.yahoo.co.jp/” 

Dim htmlDoc As HTMLDocument   —①
Set htmlDoc = ObjIe.document  —②

Cells(1, 4) = htmlDoc.Title  —③

——————————————————

【解説】

専用オブジェクト(変数名:htmlDoc)を用意する

現状、エクセルはWebページを開いただけでhtmlの中身はさっぱり分かっていないです。 ←ココ大事です。

なので、エクセルへ認識させるためにHTML情報が保存できる専用のハコ(HTMLDocument)を用意します。

 

②Webページのhtml情報(ObjIe.document)を全てコピーする

専用オブジェクトにWebページを構成しているhtml情報を入れる。

 

③html情報にあるtitleを抜き取る

タイトルを抜き出す.titleを使って情報をセルに抜き取ります。

 

エラー発生、その対処法

202_IEでスクレイピング(NG)

を実行すると以下のエラーが出ます。

原因は読み込み待ちの時間がないことです。

 

プログラムは問答無用で次の処理を進めていきます。

Webページから情報を取得したいときに「まだWebページが表示されていない状態

なので、エラーが出たというわけです。

 

表示されるまでの待ち時間を作れば解決します。

——————プログラム構文——————

Do While ObjIe.Busy = True Or ObjIe.readyState < 4 —①

—-DoEvents —②

Loop

——————————————————

【解説】

①ObjIeの状態を判断しています。

.Busyは処理が忙しいかを確認しています。「True」は忙しいを表します。

.readyStateとはドキュメントの読み込み状態を確認できます。値は1~4まであり、「4」とはIEオブジェクトの全データ読み込み完了状態を示します。4未満はまだ完了していないことを意味します。

ですので、「忙しい」あるいは「未完了」ならばループを回して待ち時間を作っているわけです。

②DoEventsは他の処理待ちがないかを確認をしてくれます。

ObjIeの処理中に他の処理依頼が無いか確認し、あったら待っている処理を実行してまたループに戻ってきます。

 

まとめ

Web情報(HTML)をエクセルが認識できるところに保管する。

Webページは読み込み時間が必要なので、待つ。

 

この2つをすることでWebの情報を全て抜き取ることができた状態になります。

あとはタイトル取得するためのコマンド.titleのようなもので情報をGETしていけばいいです。

 

取得方法は他にもあります。

次はそれを見て行きましょう!