適材適所

パソコン作業の自動化・効率化のための情報を発信するブログ(VBA,PowerShellなど)

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

この記事では

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

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

前回はaタグをクリックしてリンクをたどってみました。

今回は、インプットタグへの入力、そしてフォームの送信を行ってみましょう。

動作のイメージはこんな感じ。 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を操作するより実用的で、簡単なものもたくさんあります。

次は、そういったものを紹介していきたいと思います。

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

www.tekizai.net