- Internet Explorereはサポートが終了します!
- この記事では
- インプットタグへの書き込みをやってみる
- お題はyahoo(2019年8月16日現在のhtml)
- 検索窓への入力方法
- 検索ボタンをクリックする
- 終わりに
Internet Explorereはサポートが終了します!
マイクロソフトからIEのサポート終了が発表されています。
サポートが終了すると、脆弱性が見つかったときなど適切なアップデートが行われず、危険に晒される可能性があります。
またウェブページによっては正しく表示されなくなる可能性があります。
この記事は残しておきますが、非推奨になる可能性があります。
この記事では
- VBAによるIE(Internet Explorere)を使ったスクレイピングについて解説しています。
- インプットタグの書き込み方法を解説しています。
- 検索ボタンのクリックの方法を解説しています。
- IEによるスクレイピングの脆弱性について述べています。
インプットタグへの書き込みをやってみる
↓の記事ではaタグをクリックしてリンクをたどってみました。
この記事では、インプットタグへの入力、そしてフォームの送信を行ってみます。
動作のイメージはこんな感じ。
Yahooの検索窓に検索したいことばを入れて
検索します。
お題はyahoo(2019年8月16日現在のhtml)
yahooの検索結果を取得することをお題にします。
検索窓に「テスト」と入力し、検索ボタンをクリックする、という流れです。
2019年8月16日現在のhtmlを対象としますので、この先yahooのトップページの構造が変わると動かなくなります。
ウェブスクレイピングは脆いものです。
検索窓への入力方法
値が一行で入力できる窓は、「インプットボックス」と呼ばれています。
yahooではどのように定義されているのでしょうか。確認してみます。
<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
検索ボタンをクリックする
なにはなくとも、要素を取得するのが先です。
検索ボタンはどのようなタグになっているか見てみます。
<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のスクレイピングによる違いについて書いていますので、ぜひご参照頂ければ幸いです。
↓の記事ではWinHTTPとVBAを使ったスクレイピングについて書いていますので、ぜひご参照頂ければ幸いです。
というわけで、ここまでお読みいただき、ありがとうございました。