web-dev-qa-db-ja.com

C#を使用してWebサイトからデータを読み取る

いくつかの文字列を除いて何もないウェブページがあります。画像も背景色も何もありません。長さがそれほど長くないプレーンテキストだけです。

文字列をウェブページに渡して、他の何かに使用できるようにするための最良の方法(つまり、最も高速で効率的な方法)(テキストボックスに表示するなど)を教えてください。私はWebClientを知っていますが、それが私がやりたいことをするかどうかわかりません、そしてそれがうまくいったとしてもそれを試してさえしたくないので、最後にそれが約30秒かかったので簡単な操作。

任意のアイデアをいただければ幸いです。

25
Iceyoshi

WebClientクラスは、説明する機能を処理する能力を超えている必要があります。次に例を示します。

System.Net.WebClient wc = new System.Net.WebClient();
byte[] raw = wc.DownloadData("http://www.yoursite.com/resource/file.htm");

string webData = System.Text.Encoding.UTF8.GetString(raw);

または(コメントでのフレドリックの提案にさらに)

System.Net.WebClient wc = new System.Net.WebClient();
string webData = wc.DownloadString("http://www.yoursite.com/resource/file.htm");

30秒かかったと言うと、もう少し拡張できますか?なぜそれが起こったのかについて、多くの理由があります。遅いサーバー、インターネット接続、危険な実装など。

レベルを下げて、次のようなものを実装できます。

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://www.yoursite.com/resource/file.htm");

using (StreamWriter streamWriter = new StreamWriter(webRequest.GetRequestStream(), Encoding.UTF8))
{
    streamWriter.Write(requestData);
}

string responseData = string.Empty;
HttpWebResponse httpResponse = (HttpWebResponse)webRequest.GetResponse();
using (StreamReader responseReader = new StreamReader(httpResponse.GetResponseStream()))
{
    responseData = responseReader.ReadToEnd();
}

ただし、1日の終わりには、WebClientクラスがこの機能をまとめてくれます。したがって、WebClientを使用して、30秒の遅延の原因を調査することをお勧めします。

30
MrEyes

テキストをダウンロードする場合は、WebClientを使用してテキストのストリームリーダーを取得することをお勧めします。

        WebClient web = new WebClient();
        System.IO.Stream stream = web.OpenRead("http://www.yoursite.com/resource.txt");
        using (System.IO.StreamReader reader = new System.IO.StreamReader(stream))
        {
            String text = reader.ReadToEnd();
        }

これに時間がかかる場合は、おそらくネットワークの問題またはWebサーバーの問題です。ブラウザでリソースを開いて、どれくらい時間がかかるかを確認してください。 Webページが非常に大きい場合は、その例のように最後まで読むのではなく、チャンクでストリーミングすることを検討してください。 http://msdn.Microsoft.com/en-us/library/system.io.stream.read.aspx を見て、ストリームから読み取る方法を確認してください。

5
Phill

提案についてしたがって、WebClientを使用して、30秒の遅延の原因を調査することをお勧めします。

質問の答えから System.Net.WebClientが不当に遅い

Proxy = nullを設定してみてください。

WebClient wc = new WebClient(); wc.Proxy = null;

Alex Burtsevの功績

1
Tester
 WebClient client = new WebClient();
            using (Stream data = client.OpenRead(Text))
            {
                using (StreamReader reader = new StreamReader(data))
                {
                    string content = reader.ReadToEnd();
                    string pattern = @"((https?|ftp|Gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)";
                    MatchCollection matches = Regex.Matches(content,pattern);
                    List<string> urls = new List<string>();
                    foreach (Match match in matches)
                    {
                            urls.Add(match.Value);
                    }

              }