2

WebClient を使用して Web サイトをダウンロードしています

public void download()
{
client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
client.Encoding = Encoding.UTF8;
client.DownloadStringAsync(new Uri(eUrl.Text));
}
void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    SaveFileDialog sd = new SaveFileDialog();
    if (sd.ShowDialog() == DialogResult.OK)
    {
        StreamWriter writer = new StreamWriter(sd.FileName,false,Encoding.Unicode);
        writer.Write(e.Result);
        writer.Close();                
    }
}

これはうまくいきます。しかし、ajax を使用して読み込まれたコンテンツを読み取ることができません。このような:

<div class="center-box-body" id="boxnews" style="width:768px;height:1167px; ">
    loading ....    </div>

<script language="javascript">
    ajax_function('boxnews',"ajax/category/personal_notes/",'');
    </script>

この「ajax_function」は、クライアント側でサーバーからデータをダウンロードします。

完全な Web html データをダウンロードするにはどうすればよいですか?

4

3 に答える 3

1

そのためには、本格的な Web ブラウザー内で Javascript ランタイムをホストする必要があります。残念ながら、WebClient はこれを行うことができません。

唯一のオプションは、WebBrowser コントロールの自動化です。それを URL に送信し、メイン ページとAJAX コンテンツの両方が読み込まれるまで待ってから (ユーザー アクションが必要な場合はその読み込みのトリガーを含む)、DOM 全体をスクレイピングする必要があります。

特定のサイトのみをスクレイピングする場合は、AJAX URL を呼び出す Web ページをプルするよりも、(必要なすべてのパラメーターをシミュレートして) 自分で AJAX URL をプルする方がよいでしょう。

于 2009-09-02T15:36:58.037 に答える
0

ページの読み込みを完了するには、実際にページ上のjavascriptを実行する必要があるため、これを行うにはWebBrowserコントロールを使用する必要があると思います。アプリケーションによっては、これが可能な場合とできない場合があります。これはWindows.Formsコントロールであることに注意してください。

于 2009-09-02T15:36:01.813 に答える
0

ブラウザでページにアクセスすると、

1.要求された URL からドキュメントをダウンロードします

2. img、link、script などのタグで参照されるもの (外部ファイルを参照するもの) をすべてダウンロードします。

3. 該当する場合は JavaScript を実行します。

WebClient クラスはステップ 1 のみを実行します。単一の http 要求と応答をカプセル化します。スクリプト エンジンは含まれておら、私の知る限り、他のファイルを参照し、それらのファイルを取得するためのさらなる要求を開始するイメージ タグなどは見つかりません。

AJAX 呼び出しとハンドラーによって変更されたページを取得したい場合は、Web ブラウザーのすべての機能を備えたクラスを使用する必要があります。これは、何らかの方法でサーバーを自動化できる Web ブラウザーを使用することを意味します。 -側。WebBrowser コントロールがこれを行いますが、これは WinForms 専用だと思います。ここでのセキュリティの問題、または複数のユーザーがこの機能を同時に利用している場合にサーバーに課せられる要求を考えるとぞっとします。

自問するのに適した質問は、「なぜこれを行うのか?」ということです。本当に関心のあるデータが AJAX 経由で (おそらく Web サービス経由で) 取得されている場合は、webClient の手順をスキップして、ソースに直接アクセスしてみませんか?

于 2009-09-02T15:51:44.387 に答える