適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

VBAでウェブスクレイピング_IE操作編_その1

Internet Explorereはサポートが終了します!

マイクロソフトからIEのサポート終了が発表されています。

サポートが終了すると、脆弱性が見つかったときなど適切なアップデートが行われず、危険に晒される可能性があります。

またウェブページによっては正しく表示されなくなる可能性があります。

この記事は残しておきますが、非推奨になる可能性があります。

Internet Explorerを使ってウェブスクレイピング

ウェブスクレイピングとは、ウェブサイトの情報を自動で抽出する技術のことです。

最近はRPAでウェブページの情報をげっとだぜ~という流れもあり、興味がある人もいるのでは?

このページを見られている皆さんは、何かしらのウェブページの情報を取得して、何かをしたいはずです。

皆さんはどんな目的でしょうか。例えば、ECサイトの検索結果を一覧でエクセルに書き込みたい!!とか、お気に入りサイトの画像を保存したい・・・とか。

本質的にはアプリケーション層のhttpプロトコルでターゲットのウェブサーバーと通信するだけなので、アプローチの仕方はいっぱいあります。

その中でもVBAを使ったウェブスクレイピングの手法のひとつに、WindowsのウェブブラウザであるInternet Exploreを操作する方法があります。

「httpとか細かいことはわからないけど、とにかくスクレイピングしたいんだ!!」

という人にはおすすめです。

この記事では、このIEを使ったウェブスクレイピングについてハンズオン形式で、4回に渡って紹介したいと思います。

お題をどうするか

これから紹介するにあたり「どんな例がいいだろう」と考えたんですが、ウェブサイトの作りってどんどん変わっていってしまうんですよね。

「変わらないサイトはないだろうか」

って考えたら、

ないんですよ。

そもそも変わらないサイトって、

ちょっとやばいですよね。

それでも変わらないサイトってないか、やばいサイトはないかと考えたんですけど、

ありました。

このブログです。

お題はこのブログの記事タイトル一覧を取得する

なんとも 非実用的なお題に落ち着いてしまいました。

まぁ、スクレイピングの勉強だと思ってやってみましょう。

IEを操作するためには、「InternetExplorer」オブジェクトを使う

InternetExplorerオブイジェクトというもの通して、IEを操作することができます。

じゃあオブジェクト作るか・・・

Sub sample()
   Dim ie as 
End Sub

って、やってもインテリセンスの候補の中には「InternetExplorer」はありません。

あった方が絶対便利だよね!!ということで、参照設定してみます。

「Microsoft Internet Controls」というものを探し出してチェックしてください。

するとインテリセンスが働いて、ちゃんと出てきました。

Sub sample()
   Dim ie as InternetExplorer
   Set ie = New InternetExplorer
End Sub

ついでにNewしてオブジェクトを生成します。

これでほぼ、IEを操作する準備が整いました。

次に、ieを見えるようにします。

Sub sample()
    Dim ie As InternetExplorer
    Set ie = New InternetExplorer
    
    ie.Visible = True
    
    Set ie = Nothing
End Sub

これでieが見えるようになりました。

でも何のページも表示されません。

後は、このieというオブジェクトに対して様々な操作して、ページの情報をゲットしていく流れになります。

ウェブページにアクセスする

実際にアクセスするには、どうすればいいでしょうか。

こうします。

Sub sample()
    Dim ie As InternetExplorer
    
    Set ie = New InternetExplorer
    
    ie.Visible = True
    
    ie.Navigate "https://www.tekizai.net/"
    
    Set ie = Nothing
End Sub

InternetExplorerオブジェクトのNavigateメソッドを呼び出します。引数はアクセスしたいウェブページURLです。

よし、これで大体できただろう。

Microsoft HTML Object Library

大切なことを忘れていました。

上記のコードではただ、ウェブにアクセスするだけです。

まだまだ道のりは長いです。

今回の目的はウェブページの情報を取得することです。

そのために必要になるのが、「Microsoft HTML Object Library」なるものです。

まずは参照設定してください。

f:id:shinmai_papa:20190725102031p:plain

そして、コードを追加します。

Sub sample()
    Dim ie As InternetExplorer
    
    Set ie = New InternetExplorer
    
    ie.Visible = True
    
    ie.Navigate "https://www.tekizai.net/"
    
   Do While (ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE)
        DoEvents
    Loop

    Dim htmlDoc As HTMLDocument
    
    Set htmlDoc = ie.Document
    
    Set ie = Nothing
End Sub

新たに ①

   Do While (ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE)
        DoEvents
   Loop

と ②

   Dim htmlDoc As HTMLDocument
   
   Set htmlDoc = ie.Document

が加わりました。

①は読み込み完了まで待つ命令です。

ieがBusyの間、もしくは、ieのReadyState というプロパティがREADYSTATE_COMPLETE(完了)になるまで、処理をOSに返します。

ie.BusyはBoolean型で、真か偽を返します。

READYSTATE_COMPLETEは、ReadyState の状態を表す定数です。

定数はこうなっています

Enum READYSTATE
    READYSTATE_UNINITIALIZED = 0
    READYSTATE_LOADING = 1
    READYSTATE_LOADED = 2
    READYSTATE_INTERACTIVE = 3
    READYSTATE_COMPLETE = 4
End Enum
READYSTATE_UNINITIALIZEDDefault:デフォルトの初期化状態
READYSTATE_LOADING:ロード中  
READYSTATE_LOADED:初期化終了  
READYSTATE_INTERACTIVE:ブラウザは操作できるが、すべてのデータはロードしきっていない  
READYSTATE_COMPLETE:準備完了  

そのため、ブラウザの状態がREADYSTATE_COMPLETEになるまで待ちます。

②は、「ウェブページのHtmlを表すオブジェクト」を取得しています。

出ましたね・・・HTML。これを語らずして、スクレイピングは語れません。

HTMLとはなんだ

HTMLとはHyperText Markup Languageの略です。

解説になってませんね。

簡単に説明します。

HTMLは、ウェブページの骨格みたいなものです。

ウェブページは、文、リンク、画像、デザイン、スクリプトなど・・・様々な要素から成り立っています。

HTMLはそのウェブページの設計図です。

ここはどんな文で、リンクを貼って、画像はこれを使って、デザインはこうして・・・

IEをはじめとするウェブブラウザは、ページを表示するために、まずこのHTMLを解読します。

そして、そこに書いてある情報を基に、様々なデータを集めて一つのページに仕上げて表示しています。

我々がすいすいネットサーフィンをしている影で、ウェブブラウザさんはせっせと涙ぐましい努力を重ねてくれております。

ありがとう、ウェブブラウザさん・・・

次回は

なんだか話がブラウザすげーになってきてしまいました。

今回は一旦ここまでにして、次回に続きたいと思います。

次回は、HTMLを操作してみたいと思います。

お読みいただき、ありがとうございました。

↓こちらもご参照頂ければ幸いです。

www.tekizai.net