- PR -

mshtmlを使用してサイトの自動遷移について

1
投稿者投稿内容
キキーヌ
常連さん
会議室デビュー日: 2005/11/25
投稿数: 22
投稿日時: 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/14
投稿数: 2
投稿日時: 2008-03-21 13:12
mshtmlの使用は必須でしょうか?

HTMLが必要なだけでしたら、WebClientを使用されてはいかがでしょうか?
mshtmlを使用するよりすっきりしたコードになると思います。

コード:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 検索キーワード
            string queryParameter = "2ch";

            string queryUrl =
                "http://search.yahoo.co.jp/search?p=" + Uri.EscapeDataString(queryParameter);

            string queryResult;
            WebClient webClient = new WebClient();
            using (StreamReader reader = new StreamReader(webClient.OpenRead(queryUrl), Encoding.GetEncoding("EUC-JP")))
            {
                queryResult = reader.ReadToEnd();
            }
            // 結果をデバッグ出力
            System.Diagnostics.Debug.WriteLine(queryResult);
        }
    }
}



検索結果のリンク先のファイルが必要であれば、正規表現等を使用して検索結果からURLを抽出し、再度WebClientでダウンロードされると良いと思います。

unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-03-21 14:04
引用:

キキーヌさんの書き込み (2008-03-19 21:35) より:
mshtmlを使用してヤフーから検索して、自動遷移させようとしています
自動遷移と言っても画面は必要ではなくダウンロードしたhtml文書が欲しいのです。


画面は使わないだけで、あっても良いのでしょうか?

画面があってよいのならば、IE を制御するのが簡単であり、WebBrowser コントロールの DocumentCompleted イベントで「html文書」を取得するようにすれば、ボタンを submit してもそのイベントがやってきて捕まえることができるはずです。

私も良くは知らないのですが、掲示板などで見聞きすると、こうするやりかたには mshtml を使う方法と使わない方法があるのだと思います。主観もありますが、後者のほうが、今風で、楽なように思います。ちなみに、後者は System.Windows.Forms.WebBrowser と System.Windows.Forms.HtmlElement 等、あたりを使って制御します。
ただ、寸分たがわぬ HTML が得られるのかがちょっと良く知りません。OuterHtml などのプロパティーを見ると、ほぼ大丈夫だとは思うのですが。
キキーヌ
常連さん
会議室デビュー日: 2005/11/25
投稿数: 22
投稿日時: 2008-03-21 14:20
みずなすさん、回答ありがとうございます。

WebClientは初めて知りました。
一度これで期待通りの動作ができるか確認したいと思います。
確認が取れたら連絡します

unibonさん回答ありがとうございます。
画面は表示したくありません。コンソールアプリで動作させたいからです。

なので、WebBrowserコントロールは使用しません。
キキーヌ
常連さん
会議室デビュー日: 2005/11/25
投稿数: 22
投稿日時: 2008-03-22 21:44
WebClientを見てみましたが
DOM、Javascriptを使用したいので無理でした。

もうちょっと調べてみます

ありがとうございました
1

スキルアップ/キャリアアップ(JOB@IT)