日期:2014-05-17  浏览次数:20444 次

webclient下载部分网站页面的问题
请问如何抓取想本帖页面这样的页面啊?我用如下代码,可以读取很多网站的页面,不管是动态页面还是伪静态页面。但是也有些网站就读取不成功。
代码如下:
C# code
WebClient client = new WebClient();
  client.Headers.Add("Accept: */*");
  client.Headers.Add("User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET4.0E; .NET4.0C; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; SE 2.X MetaSr 1.0)");
  client.Headers.Add("Accept-Language: zh-cn");
  client.Headers.Add("Content-Type: multipart/form-data");
  client.Headers.Add("Accept-Encoding: gzip, deflate");
  client.Headers.Add("Cache-Control: no-cache");
  byte[] page = client.DownloadData("http://topic.csdn.net/u/20120327/10/e4e31e95-1665-4395-a1df-d8a3b09e4f9e.html");
  string content = System.Text.Encoding.UTF8.GetString(page);

其中client.Headers里面添加的属性也许有些冗余,我只是尽量确保不是它们的问题。
当执行的时候,byte[] page里面是有值的,但是Encoding.UTF8无法转换成正常的string。这是为什么呢?
如果是搜索引擎要抓取这个页面,显然它是可以抓到的吧?
曾有人提到“模拟提交”,如同这样的网页,它们是不需要登录信息,照样可以浏览的啊。应该不是“模拟提交”的问题吧
谢谢

另外说一下,我几个月前发过一个这个问题的帖子
http://topic.csdn.net/u/20120327/10/e4e31e95-1665-4395-a1df-d8a3b09e4f9e.html
没有可用的答案,要是现在这个帖子中有了答案,又没人谁去跟一下那个帖子,我好把那里的40分也给你啊

------解决方案--------------------
你得把
client.Headers.Add("Content-Type: multipart/form-data");
client.Headers.Add("Accept-Encoding: gzip, deflate");

这2行去掉,对于gzip返回的,你需要先解压
------解决方案--------------------
你需要这样分别对待

WebClient client = new WebClient();
client.Headers.Add("Accept: */*");
client.Headers.Add("User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET4.0E; .NET4.0C; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; SE 2.X MetaSr 1.0)");
client.Headers.Add("Accept-Language: zh-cn");
client.Headers.Add("Accept-Encoding: gzip, deflate");
client.Headers.Add("Cache-Control: no-cache");
byte[] page = client.DownloadData("http://topic.csdn.net/u/20120327/10/e4e31e95-1665-4395-a1df-d8a3b09e4f9e.html");
string content = "";
string sContentEncoding = client.ResponseHeaders["Content-Encoding"];
if (sContentEncoding == "gzip")
{
MemoryStream ms = new MemoryStream(page);
MemoryStream msTemp = new MemoryStream();
int count = 0;
byte[] byteArray = null;
GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress);
byte[] buf = new byte[1000];
while ((count = gzip.Read(buf, 0, buf.Length)) > 0)
{
msTemp.Write(buf, 0, count);
}

byteArray = msTemp.ToArray();
content = System.Text.Encoding.UTF8.GetString(byteArray);
}
else
content = System.Text.Encoding.UTF8.GetString(page);
------解决方案--------------------
页面是经过压缩的,客户端需要支持压缩才能得到内容,需要进行gzip解压。