c#抓取页面乱码解决办法

最近在做一个页面采集的过程中发现,页面抓取后乱码,而且时好时不好。然后发现编码也没有问题,原来是GZIP压缩导致的。

在朋友们的热心帮助下终于解决了。下面就贴代码吧,抓取gzip及其它页面防止乱码。

c#net如何抓取gzip及其它页面防止乱码

核心代码如下:

C#代码 
  1. using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())  
  2.         {  
  3.             if (response.ContentEncoding.ToLower().Contains("gzip"))  
  4.             {  
  5.                 using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))  
  6.                 {  
  7.                     using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))  
  8.                     {  
  9.                         sHTML = reader.ReadToEnd();  
  10.                     }  
  11.                 }  
  12.             }  
  13.             else if (response.ContentEncoding.ToLower().Contains("deflate"))  
  14.             {  
  15.                 using (DeflateStream stream = new DeflateStream(response.GetResponseStream(), CompressionMode.Decompress))  
  16.                 {  
  17.                     using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))  
  18.                     {  
  19.                         sHTML = reader.ReadToEnd();  
  20.                     }  
  21.                 }  
  22.             }  
  23.             else  
  24.             {  
  25.                 using (Stream stream = response.GetResponseStream())  
  26.                 {  
  27.                     using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))  
  28.                     {  
  29.                         sHTML = reader.ReadToEnd();  
  30.                     }  
  31.                 }  
  32.             }  
  33.         }  

完整前台代码gethtml.aspx

C#代码 
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="gethtml.aspx.cs" Inherits="gethtml" ValidateRequest="false" %>  
  2. <!DOCTYPE html>  
  3. <html xmlns="http://www.w3.org/1999/xhtml">  
  4. <head runat="server">  
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  
  6.     <title>抓取页面</title>  
  7. </head>  
  8. <body>  
  9.     <form id="form1" runat="server">  
  10.     <div>  
  11.         url地址:<asp:TextBox ID="url" runat="server" Text="http://www.baidu.com" style="width:400px;"></asp:TextBox><asp:Button ID="Button1" runat="server" Text="抓取" OnClick="Button1_Click" /><br />  
  12.         <textarea name="code" id="code" runat="server" style="width:530px;height:300px;"></textarea>  
  13.     </div>  
  14.     </form>  
  15. </body>  
  16. </html>  

完整后台代码gethtml.aspx.cs

C#代码 
  1. using System;  
  2. using System.Net;  
  3. using System.IO;  
  4. using System.Text;  
  5. using System.IO.Compression;  
  6.   
  7. public partial class gethtml : System.Web.UI.Page  
  8. {  
  9.     protected void Page_Load(object sender, EventArgs e)  
  10.     {          
  11.   
  12.     }  
  13.     public static string GetHtmlWithUtf(string url)  
  14.     {  
  15.         if (!(url.Contains("http://") || url.Contains("https://")))  
  16.         {  
  17.             url = "http://" + url;  
  18.         }  
  19.         HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);  
  20.         req.UserAgent = "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";  
  21.         req.Accept = "*/*";  
  22.         req.Headers.Add("Accept-Language""zh-cn,en-us;q=0.5");  
  23.         req.ContentType = "text/xml";  
  24.   
  25.         string sHTML = string.Empty;  
  26.         using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())  
  27.         {  
  28.             if (response.ContentEncoding.ToLower().Contains("gzip"))  
  29.             {  
  30.                 using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))  
  31.                 {  
  32.                     using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))  
  33.                     {  
  34.                         sHTML = reader.ReadToEnd();  
  35.                     }  
  36.                 }  
  37.             }  
  38.             else if (response.ContentEncoding.ToLower().Contains("deflate"))  
  39.             {  
  40.                 using (DeflateStream stream = new DeflateStream(response.GetResponseStream(), CompressionMode.Decompress))  
  41.                 {  
  42.                     using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))  
  43.                     {  
  44.                         sHTML = reader.ReadToEnd();  
  45.                     }  
  46.                 }  
  47.             }  
  48.             else  
  49.             {  
  50.                 using (Stream stream = response.GetResponseStream())  
  51.                 {  
  52.                     using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))  
  53.                     {  
  54.                         sHTML = reader.ReadToEnd();  
  55.                     }  
  56.                 }  
  57.             }  
  58.         }  
  59.         return sHTML;  
  60.     }  
  61.     protected void Button1_Click(object sender, EventArgs e)  
  62.     {  
  63.         string urlstr = url.Text;  
  64.         code.InnerHtml = GetHtmlWithUtf(urlstr);  
  65.     }  
  66. }  

(完)

如需转载请注明出处: http://www.86y.org/art_detail.aspx?id=722 【c#net如何抓取gzip及其它页面防止乱码】幸凡学习网
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值