- - PR -
mshtmlを使用してサイトの自動遷移について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-03-19 21:35
mshtmlを使用してヤフーから検索して、自動遷移させようとしています
自動遷移と言っても画面は必要ではなくダウンロードしたhtml文書が欲しいのです。 いろいろと調査したのですが、私が欲しい情報がなかったのでここに投稿させてもらいました IHTMLFormElementのsubmitメソッドを使用すればヤフーから検索したのと同じ 結果が返ってくると期待した書いたソースが以下になります using System; using System.Collections.Generic; using System.Linq; using System.Text; using mshtml; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; using System.Diagnostics; namespace test { #region "COM使用設定" /// <summary> /// /// </summary> [ComImport(), Guid("0000010c-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown) ] interface IPersist { void GetClassID(Guid pClassId); } /// <summary> /// /// </summary> [ComImport(), Guid("7FD52380-4E07-101B-AE2D-08002B2EC713"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown) ] interface IPersistStreamInit : IPersist { void GetClassID([In, Out] ref Guid pClassId); [return: MarshalAs(UnmanagedType.I4)] [PreserveSig()] int IsDirty(); [return: MarshalAs(UnmanagedType.I4)] [PreserveSig()] void Load(IStream pStm); [return: MarshalAs(UnmanagedType.I4)] [PreserveSig()] void Save(IStream pStm, [In, MarshalAs(UnmanagedType.Bool)] bool fClearDirty); void GetMaxSize([Out]long pCbSize); [return: MarshalAs(UnmanagedType.I4)] [PreserveSig()] void InitNew(); } #endregion // "COM使用設定" class Program { static void Main(string[] args) { var _hd = new HTMLDocument(); ((IPersistStreamInit)_hd).InitNew(); var _hd4 = (IHTMLDocument4)_hd; var _hd2 = _hd4.createDocumentFromUrl(@"http://www.yahoo.co.jp", null); while (!"complete".Equals(_hd2.readyState)) { Application.DoEvents(); } var hd3 = (IHTMLDocument3)_hd2; Debug.WriteLine(hd3.documentElement.outerHTML); var element = hd3.getElementById("srchtxt"); ((IHTMLInputElement)element).value = "2ch"; Debug.WriteLine(hd3.documentElement.outerHTML); var element2 = hd3.getElementsByName("sf1"); var form = (IHTMLFormElement)element2.item(null, 0); form.submit(); } } } form.submit() = 検索ボタンを押した と思っております。 submitのイベント設定しないといけないと思うのですがイベント設定 の仕方がわかりません。 後、正しくWebサーバーに送信されているか怪しいのです。 パケットキャプチャでみてもsubmitを実行した後何もキャプチャしていなからです どなたか知っていれば教えていただけませんか? | ||||
|
投稿日時: 2008-03-21 13:12
mshtmlの使用は必須でしょうか?
HTMLが必要なだけでしたら、WebClientを使用されてはいかがでしょうか? mshtmlを使用するよりすっきりしたコードになると思います。
検索結果のリンク先のファイルが必要であれば、正規表現等を使用して検索結果からURLを抽出し、再度WebClientでダウンロードされると良いと思います。 | ||||
|
投稿日時: 2008-03-21 14:04
画面は使わないだけで、あっても良いのでしょうか? 画面があってよいのならば、IE を制御するのが簡単であり、WebBrowser コントロールの DocumentCompleted イベントで「html文書」を取得するようにすれば、ボタンを submit してもそのイベントがやってきて捕まえることができるはずです。 私も良くは知らないのですが、掲示板などで見聞きすると、こうするやりかたには mshtml を使う方法と使わない方法があるのだと思います。主観もありますが、後者のほうが、今風で、楽なように思います。ちなみに、後者は System.Windows.Forms.WebBrowser と System.Windows.Forms.HtmlElement 等、あたりを使って制御します。 ただ、寸分たがわぬ HTML が得られるのかがちょっと良く知りません。OuterHtml などのプロパティーを見ると、ほぼ大丈夫だとは思うのですが。 | ||||
|
投稿日時: 2008-03-21 14:20
みずなすさん、回答ありがとうございます。
WebClientは初めて知りました。 一度これで期待通りの動作ができるか確認したいと思います。 確認が取れたら連絡します unibonさん回答ありがとうございます。 画面は表示したくありません。コンソールアプリで動作させたいからです。 なので、WebBrowserコントロールは使用しません。 | ||||
|
投稿日時: 2008-03-22 21:44
WebClientを見てみましたが
DOM、Javascriptを使用したいので無理でした。 もうちょっと調べてみます ありがとうございました |
1