当前位置: 代码迷 >> C# >> 网站爬虫有关问题
  详细解决方案

网站爬虫有关问题

热度:32   发布时间:2016-05-05 04:04:32.0
网站爬虫问题
http://www.pbc.gov.cn/publish/zhengcehuobisi/637/index.html
想从此网站中选取当日连接,然后获取汇率数据,结果最近不知道发什么神经,给搞了js加密,用webclient跟webrequest均失败,js加密破解一层后也还是不会获取真实地址,没办法,技术不到家,求各种高人帮忙啊~
------解决思路----------------------
你有两种办法解决,一个是用fiddlercore,直接拦截http数据。

另一个是分析一下抓包的过程,你会发现浏览器请求了三次http://www.pbc.gov.cn/publish/zhengcehuobisi/637/index.html
第一次获取cookie,第二次302跳转,第三次带着前两次的cookie访问网站,就给出来数据了

Cookie: wzwsconfirm=e8c83b5c7829fad0c6e16c1de47eb246; wzwstemplate=Ng==; wzwschallenge=-1; ccpassport=c14b5f460dcd23a4fddff3881ab60e29
------解决思路----------------------
根据大神的指示,发现只要带着正确的“wzwsconfirm”,“wzwstemplate”,“wzwschallenge”三个cookie,访问网站,网站会302跳转并反馈“ccpassport”的cookie,有了这个就能正常取数据了。具体的可以用httpwebrequest来做,加上cookiecontainer就行了,这里不多罗嗦了。
关键是如何算出那三个cookie,两个方法,一是取回js代码,设法让在C#中执行,这个你已经在做了;另一个就是把js的代码转成C#的,下面就是转好的代码,当然质数表将是我长期的痛。。。

        private string Doubi1(string wzwschallenge, string wzwschallengex, int prefixlabel)
        {
            char[] tmp = (wzwschallenge + wzwschallengex).ToCharArray ();
            int[] zhishu={2,3,5,7,11,13,17,19,23,29,31};
            int hash = 0;
            int i = 0;
            for (i = 0; i < tmp.Length; i++)
            {
                hash += (int)tmp[i];
            }
            hash *= zhishu[prefixlabel];// 3;
            hash += 111111;
            return "WZWS_CONFIRM_PREFIX_LABEL" + prefixlabel + hash;
        }
        private string Doubi2(string str)
        {
            string outstr;
            int i, len,c1, c2, c3;
            char[] encoderchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".ToCharArray ();
            char[] strchar = str.ToCharArray();
            len = str.Length;
            i = 0;
            outstr= "";

            while (i < len)
            {
                c1 = (int)strchar[i++] & 0xff;
                if (i == len) 
                {
                    outstr += encoderchars[c1 >>2];
                    outstr += encoderchars[(c1 & 0x3) << 4];
                    outstr += "==";
                    break;
                }

                c2 = (int)strchar[i++];
            if (i == len)
            {
                outstr += encoderchars[c1 >> 2];
                outstr += encoderchars[((c1 & 0x3) << 4) 
------解决思路----------------------
 ((c2 & 0xf0) >> 4)];
                outstr += encoderchars[(c2 & 0xf) << 2];
                outstr += "=";
                break;
            }
            c3 = (int)strchar[i++];
            outstr += encoderchars[c1 >> 2];
            outstr += encoderchars[((c1 & 0x3) << 4) 
------解决思路----------------------
 ((c2 & 0xf0) >> 4)];
            outstr += encoderchars[((c2 & 0xf) << 2) 
------解决思路----------------------
 ((c3 & 0xc0) >> 6)];
            outstr += encoderchars[c3 & 0x3f];

            } 
            return outstr;
        }
  相关解决方案