ExcelからIE

正月からヤフオクの検索データ取得マクロを作っているが、だいたいうまくいっていたのだが何かが足りない気がしていた。
よく調べてみると、アダルトカテゴリの出品がないように見えた。


ちょっとググって見たら、ヤフオクの通常の検索だとアダルトカテゴリは検索されないらしい。知らんかった!
一度アダルトカテゴリのページを手動で開いてcookieを覚えさせないと検索できないらしい。


ここで問題になってくるのが、xmlhttpでcookieを扱えるか?扱えるとしたらどうやって扱うのか?という点。
自動で処理してくれそうな気はしないのでsetRequestHeader, getAllResponseHeaders を駆使して自力で解決しなければならないのか?


それ以前に、Yahooの自動ログインを行おうとしてPOSTを出してみたのだが、そもそもこれがうまくいかない。最初にGETでログインページを取得して、フォーム内容を抽出して send でログインフォームデータを送ってみるが、ログインエラーになってしまう模様。何が間違ってるのか分からない・・・


仕方が無いのでxmlhttpでの実装は一旦あきらめてIEそのもので勝負することにした。
Set objIE = CreateObject("InternetExplorer.Application") でIEインスタンスそのものを起動して(Visible=Falseに設定するのでウィンドウは表示されない)、これを Navigate で制御する。objIE.busy, objIE.readystate をチェックしつつ、objIE.Document.getElementsByTagName("HTML").item(0).innerHtml で最終的にHTMLを得る。これでxmlhttpとほぼ同等の結果を得ることができるが、大きな違いが2点あるようだ。


(1)自動的にUnicodeに変換されるので、文字コードを意識することなくそのまま使える。これはxmlhttpと比べてアドバンテージ。
xmlhttpの場合、取得できるのは生データなので、Excelで使うにはEUCUnicodeなどのコード変換が必要になる。


(2)innerHtml を通じて取得したHTMLは、サーバから送られてきたそのままのHTMLではない。微妙にIE化されたローカルHTMLに変換されてしまう。

例)元HTML<td ALIGN="center" nowrap>
innerHtml <TD noWrap align=middle>
属性の順序や、属性値そのものがIE方言に置き換えられてしまう。あと基本的にタグは大文字、属性は小文字に自動変換されるようだ。


その他、xmlhttpに比べて性能は悪い印象を受ける。これはIEでダウンロードさせているため、画像の読み込みが行われるし、スクリプトなども動作してしまうためだろう。ExcelからIEを制御する場合はDISPID_AMBIENT_DLCONTROLでの制御ができないため、画像やスクリプトを禁止するにはInternetSetOptionでシステムグローバルな設定を変更するしか方法が無いのかもしれない。


ちなみにログインの時だけはobjIE.visible=TrueにしてIEウィンドウを表示させ、ログイン名とパスワードは手動で入力させるようにした。こうすることでパスワードをハードコードする危険を冒す必要が無くなる。ログイン成功後は再びobjIE.visible=FalseとしてIEウィンドウは隠す。
これでログインしてcookieを生かしつつアダルトカテゴリも検索することが可能になった。


やってみてわかったことだが、一般カテゴリとアダルトカテゴリは割合的に半々くらいのようだ(検索語:"(コミケ71 C71)")。実際には一般カテゴリに紛れ込んだ隠れアダルト出品を考慮すると若干アダルトカテの方が多目ということか。