zoukankan      html  css  js  c++  java
  • C#读取网络流,读取网络上的js文件

    写博客的目的就是让其他人少走弯路。

    C#读取网络上的流和js文件出现的问题

    一开始看了今天博客园上的推荐文章,用C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),然后想自己也来采集一下天气,采集目标是腾讯天气。

    腾讯天气的数据是用的js提供的(这里就不多做分析了下次有机会再写文章分析),然而用上文中的GetWebClient方法,传递一个js文件的地址,读取到的是一堆乱码。

    分析问题产生的原因

    问题出现了,自然要分析原因,为什么抓包工具能看到字符串的内容,浏览器也能展示字符串的内容,偏偏用程序不可以呢?

    尝试了很多方法,换了很多字符编码依然不行。直到我看到了抓包工具中的这么一段内容,原来传递过来的流是一个bytes。

    解决问题

    看来原因已经找到了,不是编码的问题,而是流本身的内容是二进制内容,直接转string肯定是乱码不对了,所以我们要把stream转成bytes才行。

    然后就开始网上搜索对应的内容,然后再踩一个坑。

    在使用 int l = stream.Length; 的时候碰到了“此流不支持查找操作”的错误。

    这个错误的产生原因本质是网络流没法提前获取到长度,所以这个类不支持查找操作通常是网络流导致的。

    然后再继续搜索这个错误的解决方法,然后找到了同样碰到这个问题的前辈,详见:http://bbs.csdn.net/topics/340175313

    这里就感谢这位前辈了,很多人在网上提问,没人回答,后来自己解决了问题就算了,没想到回到自己的帖子里去自问自答一下,其实这样自问自答一下可以帮助更多的后面的人!!!

    最后我用了如下的方法解决了这个问题

     public static byte[] ReturnStrem(string url)
        {
            string Url = url;
            byte[] data1 = null;
            MSXML2.XMLHTTP _xmlhttp = new MSXML2.XMLHTTPClass();
            _xmlhttp.open("GET", Url, false, null, null);
            _xmlhttp.send(null);
            if (_xmlhttp.readyState == 4)
            {
                data1 = (byte[])_xmlhttp.responseBody;
            }
            _xmlhttp.abort();
            return data1;
    

      对于新手来说,这里复制了代码又出现了新的问题,我这里一并解释清楚吧。

    首先MSXML2是要引用什么?

    答:项目右键--引用--COM--Microsoft XML 3.0

    引用后直接执行报错“无法嵌入互操作类型”,怎么办?

    答:项目--引用--找到MSXML2右键属性,嵌入互操作类型设置为false

    最后问题圆满解决,解决这个问题花了一下午时间,希望我踩的坑能给其他人节省更多的时间。

  • 相关阅读:
    string subscript out of range
    基数树(radix tree)
    改进版的快速排序
    快速排序算法-C语言实现
    归并排序
    用数组名做函数参数(转)
    堆和栈的区别
    给指针malloc分配空间后就等于数组吗?
    codeblocks中添加-std=c99
    堆排序-C语言实现
  • 原文地址:https://www.cnblogs.com/JangoJing/p/4773712.html
Copyright © 2011-2022 走看看