我正在使用Webclient
和DownloadString
来抓取大量的网址。
目的是获取每个URL的页面源。
但是,某些网址被重定向以下载大文件并Webclient
抛出错误:
内存不足
所以,我不想下载大文件。如何设置Webclient
的最大下载大小?
答案 0 :(得分:0)
您可以使用WebClient进行此操作,但它会抽象出如此多的细节,因此使用WebRequest类直接控制可能更方便,也可由WebClient本身使用。
而是使用底层HttpWebRequest和HttpWebResponse,然后在达到字符限制后停止阅读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 。