使用 C# 从网站读取数据

Posted

技术标签:

【中文标题】使用 C# 从网站读取数据【英文标题】:Reading data from a website using C# 【发布时间】:2011-06-13 02:20:51 【问题描述】:

我有一个网页,上面除了一些字符串之外什么都没有。没有图像,没有背景颜色或任何东西,只有一些长度不那么长的纯文本。

我只是想知道,在网页中传递字符串以便我可以将其用于其他用途(例如在文本框中显示)的最佳(我的意思是最快和最有效)方法是什么?我知道 WebClient,但我不确定它是否会做我想做的事,而且我什至不想尝试它,即使它确实有效,因为我上次这样做花了大约 30 秒一个简单的操作。

任何想法都将不胜感激。

【问题讨论】:

WebClient 类是这里的自然选择。网络客户端运行时间不应超过 30 秒(假设没有其他网络问题)。 您的选择仅限于 WebClient 或 WebRequest/WebResponse(这是 WebClient 在场景下使用的,所以只使用 WebClient)。至于为什么它很慢,这与 .NET HTTP 堆栈的实现无关。可能是网络问题,您尝试获取的网站的实施不善导致返回响应缓慢,...例如,在正确编写的网站上运行 Web 客户端,例如 google.com,这需要一些时间获取响应的毫秒数远远少于您在网站上观察到的 30 秒。 绕过你的意思是解析吗?如果是这样,你用什么技术解析它?即什么样的文本框win-forms,另一个网站? 【参考方案1】:
 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);
                    

              

【讨论】:

【参考方案2】:

关于建议 所以我建议你使用 WebClient 并调查 30 秒延迟的原因。

来自问题的答案 System.Net.WebClient unreasonably slow

尝试设置 Proxy = null;

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

感谢 Alex Burtsev

【讨论】:

【参考方案3】:

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);

或(进一步来自 Fredrick 在 cmets 的建议)

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();

但是,WebClient 类最终会为您封装此功能。所以我建议你使用 WebClient 并调查 30 秒延迟的原因。

【讨论】:

或者,使用DownloadString 方法并摆脱字节数组处理:string result = wc.DownloadString(... 我编写了一个按钮,该按钮将使用 WebClient 类保存页面(尽管一个具有相当多流量的页面),然后将文件中的某些内容替换为页面的某些内容。我用秒表计时花了多长时间,时间从 10 秒到 40 秒不等。互联网连接可能很糟糕,但我怀疑这是主要原因。不幸的是,我不再拥有该按钮的代码,否则我会发布它。 :\ @Fredrik : +1 下载字符串建议 顺便说一句,在浏览器中查看时页面下载是否更快?此外,网页是否安全 - 在这种情况下,如果您的计算机无法联系根证书,验证证书可能需要大约 40 秒。根据我的经验,DNS 配置错误通常会导致网络响应缓慢。 @Iceyoshi:你下载了多少数据?几KB还是几MB?您还确定延迟是在 WebClient 调用上,而不是在随后的解析/替换上?【参考方案4】:

如果您正在下载文本,那么我建议您使用 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 服务器上的问题。尝试在浏览器中打开资源,看看需要多长时间。 如果网页非常大,您可能希望以块的形式查看流式传输,而不是像该示例中那样一直阅读到最后。 查看http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx 以了解如何从流中读取。

【讨论】:

以上是关于使用 C# 从网站读取数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sql Server 从 C# 中的读取器读取数据

使用 C# 从外部 api 读取 json 数据

C#:使用存储过程从数据库中读取图像

FCKeditor.Net_2.6.4在C#怎么使用啊?包括写入数据库和从数据库读取。谢谢啦!

FCKeditor.Net_2.6.4在C#怎么使用啊?包括写入数据库和从数据库读取。谢谢啦!

如何使用 C# 自动化从访问数据库(.accdb)中读取所有记录