エクセルからインターネットは開けたよ。
この次は何をするのかな?って人に説明を続けていきます。
[st-card id=115 readmore=”on”]
Webページの「タイトル」を取得するプログラムを見ながら、
「HTMLのこれだけは知っておきたい最低限の知識」も学んでおきましょう。
サンプルのダウンロード
実際の動きを見るのが一番です。
ダウンロードをして、ボタンをクリックするだけの簡単サンプルを用意しています。
※②はちゃんと動きます。
スクレイピングするときに必要な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を使って情報をセルに抜き取ります。
エラー発生、その対処法
を実行すると以下のエラーが出ます。
原因は読み込み待ちの時間がないことです。
プログラムは問答無用で次の処理を進めていきます。
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していけばいいです。
取得方法は他にもあります。
次はそれを見て行きましょう!