- この記事では
- インプットタグへの書き込みをやってみる
- お題はyahoo(2019年8月16日現在のhtml)
- 検索窓への入力方法
- 検索ボタンをクリックする
- これで終わり
- 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を操作するより実用的で、簡単なものもたくさんあります。
次は、そういったものを紹介していきたいと思います。
ここまでお読みいただき、ありがとうございました。