使用Webclient的DownloadString时如何防止大文件

时间:2017-01-06 01:41:56

标签: c# webclient

我正在使用WebclientDownloadString来抓取大量的网址。 目的是获取每个URL的页面源。

但是,某些网址被重定向以下载大文件并Webclient抛出错误:

  

内存不足

所以,我不想下载大文件。如何设置Webclient的最大下载大小?

1 个答案:

答案 0 :(得分:0)

您可以使用WebClient进行此操作,但它会抽象出如此多的细节,因此使用WebRequest类直接控制可能更方便,也可由WebClient本身使用。

而是使用底层HttpWebRequestHttpWebResponse,然后在达到字符限制后停止阅读ResponseStream。

你的方法是这样的:

public static string DownloadAsString(string url)
{
    string pageSource = String.Empty;
    var req = (HttpWebRequest)WebRequest.Create(url);
    req.Method = "GET";
    req.UserAgent = "MyCrawler/1.0";
    req.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
    var resp = (HttpWebResponse)req.GetResponse();

    // is this even html and not an image, or video       
    if (resp.ContentType.Contains("text/html"))
    {
        var sb = new StringBuilder();
        var buffer = new char[8192];
        // get the stream
        using (var stream = resp.GetResponseStream())
        using (var sr = new StreamReader(stream, Encoding.UTF8))
        {
            // start copying in blocks of 8K
            var read = sr.ReadBlock(buffer, 0, buffer.Length);
            while (read > 0)
            {
                sb.Append(buffer);
                // max allowed chars per source
                if (sb.Length > 50000)
                {
                    sb.Append(" ... source truncated due to size");
                    // stop early 
                    break;
                }
                read = sr.ReadBlock(buffer, 0, buffer.Length);
            }
            pageSource = sb.ToString();
        }
    }
    return pageSource;
}

你使用这种方法:

var src = DownloadAsString("http://stackoverflow.com");
Console.WriteLine(src);

这将输出构成Stack Overflow首页的html。请注意,此输出的上限为50.000个字符,因此它会在src字符串末尾显示 ... source truncated in size