微信小程序+.NET(十六) 网站压缩输出导致爬虫编码乱码问题

  最近被校招搞得成天刷题背题,每天和几百年没睡觉没吃饭一样,今天想缓一缓,继续搞之前的悦听小说小程序。

  问题描述

  1.老生常谈的,微信开发工具缓存丢失导致一些连带问题,重启工具,再不行?重启电脑
  2.检验功能,web-view一切正常,转码阅读失败,发现缓存正常,初步确认是后台问题,没取到文章
  3.进入.NET后台,确认是后台接口问题,检验后接口有时正常,有时出错。表现为切换网络后前几次正常,然后失败
  4.打断点检查是原始html转码gbk出错,转码的内容不是中文甚至英文都是乱码,用几种方式测试了转码function,甚至对文章章节的爬取都没有出现乱码问题
  5.查看小说网站源码,对比章节页面和阅读页,没发现明显的特殊声明,还学到了一些html的<meta>配置:
目录页面
文章页面
  参考:
  html meta标签使用总结
  国内环境下前端网页开发的几个“中国特色”代码
在这里插入图片描述
  6.最后几经波折,找到了页面压缩这个说法,好像是类似js等的压缩,也就是min.js,查看代码确实js压缩过,
在这里插入图片描述
  但是目录页其实也是压缩处理过js的,但是目录页并未出现过乱码,暂时没找到这个页面压缩输出是不是所谓的js压缩,但就算是js压缩,也不该影响到html的效果才对,没找到这个的解释。
C#使用webclient获取搜狐网页内容的乱码问题
在这里插入图片描述

  解决方案

  第一种解决方案就是上图说的,插入如下代码后使用新的XWebClient通过HttpWebClient扩展WebClient的自解压功能,我最后用的就是这种方案

        /// <summary>
        /// 利用HttpWebClient的自动解压缩
        /// </summary>
        public class XWebClient : WebClient
        {
            protected override WebRequest GetWebRequest(Uri address)
            {
                HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
                request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
                return request;
            }
        }

  我还找到了第二种方案,手动解压缩:

        /// <summary>
        /// 利用gzip手动解压
        /// </summary>
        /// <param name="cbytes"></param>
        /// <returns></returns>
        public static string gzFile(byte[] cbytes)
        {
            using (MemoryStream dms = new MemoryStream())
            {
                using (MemoryStream cms = new MemoryStream(cbytes))
                {
                    using (System.IO.Compression.GZipStream gzip = new System.IO.Compression.GZipStream(cms, System.IO.Compression.CompressionMode.Decompress))
                    {
                        byte[] bytes = new byte[1024];
                        int len = 0;
                        //读取压缩流,同时会被解压
                        while ((len = gzip.Read(bytes, 0, bytes.Length)) > 0)
                        {
                            dms.Write(bytes, 0, len);
                        }
                    }
                }
                return (Encoding.UTF8.GetString(dms.ToArray()));
            }
        }
  后记

  一上午就这么过去了,不过欣喜的是解决了问题并有很多收获,不过这里还有一个小问题,记在下一篇:
  微信小程序+.NET(十七) JSON序列化对象 Newtonsoft.Json.JsonWriter 类型初始值设定项引发异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值