適材適所

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

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

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

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

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

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

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

この記事では

  • VBAによるIE(Internet Explorere)を使ったスクレイピングについて解説しています。
  • インプットタグの書き込み方法を解説しています。
  • 検索ボタンのクリックの方法を解説しています。
  • IEによるスクレイピングの脆弱性について述べています。

インプットタグへの書き込みをやってみる

↓の記事ではaタグをクリックしてリンクをたどってみました。

www.tekizai.net

この記事では、インプットタグへの入力、そしてフォームの送信を行ってみます。

動作のイメージはこんな感じ。

f:id:shinmai_papa:20190816081149p:plain

Yahooの検索窓に検索したいことばを入れて

f:id:shinmai_papa:20190816081155p:plain

検索します。

お題はyahoo(2019年8月16日現在のhtml)

yahooの検索結果を取得することをお題にします。

検索窓に「テスト」と入力し、検索ボタンをクリックする、という流れです。

2019年8月16日現在のhtmlを対象としますので、この先yahooのトップページの構造が変わると動かなくなります。

ウェブスクレイピングは脆いものです。

検索窓への入力方法

値が一行で入力できる窓は、「インプットボックス」と呼ばれています。

yahooではどのように定義されているのでしょうか。確認してみます。

f:id:shinmai_papa:20190816081200p:plain

<input name="p" id="srchtxt" type="text" value="" autocomplete="off">

と定義されていました。

検索窓にカーソルを合わせて、右クリックで「要素の検索」を実行すると出てきます。

inputタグで、属性として、name=p、id=srchbtn、(省略)、value=""があります。

インプットボックスに値を入れるのにまずは、インプットボックスの要素を取得できなければいけません。

「id」があるではありませんか!!

「getElementById」で一発ですね。

これで要素は取得できそうです。

次に値をどのように入力するかです。

属性のなかに怪しいやつがひとりいます。

value=""

これなんです。valueが空白といっているやつ。

valueこそが、値なのです。

このvalueに「テスト」といれてやります。

これでインプットボックスに入力ができます。

以外と簡単です。

vbaのコードでは、inputタグは、「HTMLInputElement」という型で表すことができます。

実際のコードに落としてみます。

Sub sample()
   Dim ie As InternetExplorer: Set ie = New InternetExplorer
   ie.Visible = True
   ie.navigate "https://www.yahoo.co.jp/"
   waite ie
   Dim htmlDoc As HTMLDocument: Set htmlDoc = ie.document
   Dim htmlInput As HTMLInputElement: Set htmlInput = htmlDoc.getElementById("srchtxt")
   htmlInput.Value = "テスト"
End Sub

Function waite(ie As InternetExplorer) As Boolean
   Do While (ie.Busy Or ie.readyState <> READYSTATE_COMPLETE)
      DoEvents
   Loop
   waite = True
End Function

検索ボタンをクリックする

なにはなくとも、要素を取得するのが先です。

検索ボタンはどのようなタグになっているか見てみます。

f:id:shinmai_papa:20190816081206p:plain

<input class="srchbtn" id="srchbtn" type="submit" value="検索">

いました、インプットボックスの下にいましたね。

こいつもinputタグですね。

検索窓との違いは、type属性がsubmitとなっています。

submitを指定すると、送信ボタンになります。

ここではhtmlを書くことが目的ではないので、解説は省きます。

ieを使ってスクレイピングするだけなら、「そんなもんか」程度で大丈夫です。

話を戻します。

またid属性がいますね。

これなら「getElementById」で要素を取得できます。

取得した要素に対して「Click」。これで行けるはず。

先ほどのsampleプロシージャのお尻に次のコードを追加します。

   Dim srchInput As HTMLInputElement: Set srchInput = htmlDoc.getElementById("srchbtn")
   srchInput.Click

これでyahooの検索ができました。

終わりに

インプットタグの書き込み方法についてでした。

この記事でもって、IEを使ったウェブスクレイピングについての解説は終わりです。

その1から今回までのテクニックを使えば、おおよそのページ遷移はできるのではないでしょうか。

ieを使ってスクレイピングする上で大事なのはhtmlの細かい仕様にとらわれすぎないことです。

もちろん仕様を知ることは大事ですが、先ほどの例でも書いたとおり、「そんなもんか」という寛容さが必要です。

IEを使ったスクレイピングで覚えておいてほしいことは、「IEを使ったスクレイピングはかなり脆い」

ここまで紹介してきてなんだよ、いまさら!!って感じですが・・・。

例えばIEの処理待ち時間。

IEの処理待ちは通信環境によって変わってくるのでたまにIEの画面が遅れる場合があります。

対策としては、実際に使う環境で、IEの処理待ちの時間などを根気よく調整するしかありません。

これまで紹介してきた単発の動作だけなら話は単純なのですが、実際に使えるものはもっと複雑なことをやろうとするはずです。

そうすると、IEが遅れて処理が止まったり、うまく動いても処理時間がかかったりということがよくあります。

IEを使ったスクレイピングは脆いです。それを理解した上で使っていただきたいと思います。

スクレイピングは様々なやり方があります。IEを操作するのはほんの一例です。

実はIEを操作するより実用的で、簡単なものもたくさんあります。

↓の記事ではIE操作とWinHTTPのスクレイピングによる違いについて書いていますので、ぜひご参照頂ければ幸いです。

www.tekizai.net

↓の記事ではWinHTTPとVBAを使ったスクレイピングについて書いていますので、ぜひご参照頂ければ幸いです。

www.tekizai.net

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