Tom20081 2018-02-22 13:17 采纳率: 100%
浏览 1953
已采纳

采集网页返回无数据,求解决方案

使用C#采集网页:http://search.10jqka.com.cn/stockpick/search?typed=1&preParams=&ts=1&f=1&qs=result_rewrite&selfsectsn=&querytype=stock&searchfilter=&tid=stockpick&w=%E7%AE%80%E7%A7%B0%E5%8F%98%E5%8A%A8%E6%97%A5%E6%98%AF2010%E5%B9%B4%E4%BB%A5%E6%9D%A5&queryarea=
原来可以返回带数据的html,可从html中采集token值
但现在只能返回:


“<html><body>
        <script src="//s.thsi.cn/js/chameleon/chameleon.min.1519305.js" type="text/javascript"></script>
        <script language="javascript" type="text/javascript">       window.location.href="http://search.10jqka.com.cn/stockpick/search?typed=1&preParams=&ts=1&f=1&qs=result_rewrite&selfsectsn=&querytype=stock&searchfilter=&tid=stockpick&w=%E7%AE%80%E7%A7%B0%E5%8F%98%E5%8A%A8%E6%97%A5%E6%98%AF2010%E5%B9%B4%E4%BB%A5%E6%9D%A5&queryarea=";
        </script>
        </body></html>”
   请问该问题怎么解决?

   以下是我使用的方法,另外使用System.Net.WebClient方法返回为空。
public string GetMoths(string url, string WebCodeStr){       
            Encoding WebCode = Encoding.GetEncoding(WebCodeStr);
            System.GC.Collect(); // 避免操作超时
            HttpWebRequest wReq = (HttpWebRequest)WebRequest.Create(@url);
            System.Net.ServicePointManager.DefaultConnectionLimit = 200;
            wReq.KeepAlive = false;          
            wReq.UserAgent = @"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50215;)";       
            wReq.Method = "GET"; // HttpWebRequest.Method 属性 获取或设置请求的方法。         
            wReq.Timeout = 30000; //设置页面超时时间为30秒
            HttpWebResponse wResp = null;
            try { wResp = (HttpWebResponse)wReq.GetResponse(); }
            catch (WebException ex) { var e1=ex; return null; } //        
            Stream respStream = wResp.GetResponseStream();
            //判断网页编码,如果判断编码和读取流不放在一个方法,使用StreamReader会出现无法读取流的错误
            StreamReader reader = new StreamReader(respStream, WebCode);
            string strWebHtml = reader.ReadToEnd();  // 从流的当前位置到末尾读取流。
            respStream.Close();reader.Close();reader.Dispose();            
            if (wReq != null) { wReq.Abort(); wReq = null; } 
            if (wResp != null) { wResp.Close(); wResp.Dispose(); wResp = null;} 
            return strWebHtml;
        }
  • 写回答

3条回答 默认 最新

  • Go 旅城通票 2018-02-23 01:33
    关注

    看了下,主要是有个cookie v,这个是判断是否要输出跳转的html代码用的,由
    s.thsi.cn/js/chameleon/chameleon.min.1519305.js
    这个js文件按生成,这个文件压缩过,看起来费力,是通过TOKEN_SERVER_TIME计算出来的,不想看代码了,这个cookie有效期有30年左右,所以你只需要通过浏览器开发工具获取一次v这个cookie附带上就可以,下面的代码的v值是昨天晚上获取的,今天早上来还能用、

         public string GetMoths(string url, string WebCodeStr)
        {
            Encoding WebCode = Encoding.GetEncoding(WebCodeStr);
            System.GC.Collect(); // 避免操作超时
            HttpWebRequest wReq = (HttpWebRequest)WebRequest.Create(url);
            System.Net.ServicePointManager.DefaultConnectionLimit = 200;
            ///////////////////////
            CookieContainer cc = new CookieContainer();
            cc.Add(new Cookie("v", "AhSuO1TEMkngSaaFhPUUQ_Iq5VOgbThXepHMm671oB8imb5B1n0I58qhnCr8", "/", "search.10jqka.com.cn"));
            wReq.CookieContainer = cc;
            ///////////////////////
            wReq.KeepAlive = false;
            wReq.UserAgent = @"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50215;)";
            wReq.Method = "GET"; // HttpWebRequest.Method 属性 获取或设置请求的方法。         
            wReq.Timeout = 30000; //设置页面超时时间为30秒
            HttpWebResponse wResp = null;
            try { wResp = (HttpWebResponse)wReq.GetResponse(); }
            catch (WebException ex) {  return ex.Message; } //        
            Stream respStream = wResp.GetResponseStream();
            //判断网页编码,如果判断编码和读取流不放在一个方法,使用StreamReader会出现无法读取流的错误
            StreamReader reader = new StreamReader(respStream, WebCode);
            string strWebHtml = reader.ReadToEnd();  // 从流的当前位置到末尾读取流。
            respStream.Close(); reader.Close(); reader.Dispose();
            if (wReq != null) { wReq.Abort(); wReq = null; }
            if (wResp != null) { wResp.Close(); wResp = null; }
            return strWebHtml;
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?