使用c# WebClient或HttpWebRequest将网站下载为字符串
本文关键字:网站 下载 字符串 HttpWebRequest WebClient 使用 | 更新日期: 2023-09-27 18:09:17
我正在下载一个网站的内容。但是,对于某个网页,返回的字符串包含混乱的数据,其中包含许多字符。
这是我最初使用的代码。
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.Method = "GET";
req.UserAgent = "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))";
string source;
using (StreamReader reader = new StreamReader(req.GetResponse().GetResponseStream()))
{
source = reader.ReadToEnd();
}
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(source);
我也尝试了WebClient的替代实现,但仍然是相同的结果:
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
using (WebClient client = new WebClient())
using (var read = client.OpenRead(url))
{
doc.Load(read, true);
}
从搜索我猜这可能是编码的问题,所以我尝试了下面发布的两个解决方案,但仍然不能让这个工作。
- http://blogs.msdn.com/b/feroze_daud/archive/2004/03/30/104440.aspx
- http://bytes.com/topic/c-sharp/answers/653250-webclient-encoding
我似乎无法下载的违规网站是维基百科英文版的United_States文章。维基百科。org/wiki/United_States)。虽然我尝试了很多其他的维基百科文章,但都没有看到这个问题。
使用htmllagilitypack中的内置加载器为我工作:
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("http://en.wikipedia.org/wiki/United_States");
string html = doc.DocumentNode.OuterHtml; // I don't see no jumbled data here
编辑:使用标准的WebClient
与您的用户代理将导致HTTP 403 -禁止-使用这个代替为我工作:
using (WebClient wc = new WebClient())
{
wc.Headers.Add("user-agent", "Mozilla/5.0 (Windows; Windows NT 5.1; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4");
string html = wc.DownloadString("http://en.wikipedia.org/wiki/United_States");
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
}
也看到这个线程:WebClient禁止打开维基百科页面?
响应是gzip编码。尝试以下操作来解码流:
根据BrokenGlass的评论设置以下属性应该可以解决你的问题(对我有效):
req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
req.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
老/手动解决方案:
string source;
var response = req.GetResponse();
var stream = response.GetResponseStream();
try
{
if (response.Headers.AllKeys.Contains("Content-Encoding")
&& response.Headers["Content-Encoding"].Contains("gzip"))
{
stream = new System.IO.Compression.GZipStream(stream, System.IO.Compression.CompressionMode.Decompress);
}
using (StreamReader reader = new StreamReader(stream))
{
source = reader.ReadToEnd();
}
}
finally
{
if (stream != null)
stream.Dispose();
}
我通常是这样将页面抓取为字符串的(这是VB,但应该很容易翻译):
req = Net.WebRequest.Create("http://www.cnn.com")
Dim resp As Net.HttpWebResponse = req.GetResponse()
sr = New IO.StreamReader(resp.GetResponseStream())
lcResults = sr.ReadToEnd.ToString