当前位置:编程学习 > C#/ASP.NET >>

Post网址后,想要提取网页源码。但中间有页面跳转,请问如何提取跳转后的、最终页面源码的问题。困扰多日。求解!

Post网址后,想要提取网页源码。但中间有页面跳转,请问如何提取跳转后的、最终页面源码的问题。困扰多日。求解!

******************************************************************

【我的问题】
我想提取校园网的网页源代码。使用如下方式:
private  string PostData(string purl, string str)
        {
            try
            {
                byte[] data = Encoding.GetEncoding("UTF-8").GetBytes(str);
                HttpWebRequest req = (HttpWebRequest) WebRequest.Create(purl);
                req.Timeout = 30000;
                req.Method = "Post";
                req.ContentType = "application/x-www-form-urlencoded";
                req.ContentLength = data.Length;
                Stream stream = req.GetRequestStream();
                stream.Write(data, 0, data.Length);
                stream.Close();
                HttpWebResponse rep = (HttpWebResponse) req.GetResponse();
                Stream receiveStream = rep.GetResponseStream();
                Encoding encode = Encoding.GetEncoding("UTF-8");                
                StreamReader readStream = new StreamReader(receiveStream, encode);
                Char[] read = new Char[256];
                int count = readStream.Read(read, 0, 256);
                StringBuilder sb = new StringBuilder("");
                while (count > 0)
                {
                    String readstr = new String(read, 0, count);
                    sb.Append(readstr);
                    count = readStream.Read(read, 0, 256);
                }
                rep.Close();
                readStream.Close();
                tx1.Text = t.ToString();
                return sb.ToString();
            }
            catch (Exception ex)
            {
                return "";
                // ForumExceptions.Log(ex);
            }
        }
可以正常返回源码信息。但问题是,这个返回的是第一次post数据后的信息,而实际上,我想要得到的结果是跳转N次之后的网页源码。
******************************************************************

【我的实例】
由于校园网的那个中间跳转太多了。这里我们使用Post 163网易来做个实验,效果也是比较相像的,但中间页只跳转了2次,比较好分析。我先提供一个已申请的163测试ID,用户名:csdn2013。密码:csdn2013abc。
你可以先在http://reg.163.com/UserLogin.shtml入口处登陆一下,点击登陆按钮后,仔细的观察一下IE地址栏,隐约可以看到快速跳转的一个http://youdao.xxx.xxx.com/xxx/xxx的网址,然后会跳转到“网页通行证”页面去了。

一、我运行:
string data = PostData("https://reg.163.com/logins.jsp","username=csdn2013&password=csdn2013abc");
这样将返回 中间的跳转页 的网页源码信息:<title>跳转提示</title>xxxxxx正在登录,请稍等...</p>

二、而我最终想要得到的是跳转到登陆成功后的“网页通行证”上的页面信息。从初始post用户名密码,到最终的“网页通行证”页面,这中间我使用winsock抓包得到的数据是跳转了2次,第一次是跳转到youdao.xxx,第二次才是跳转到正常的“网页通行证”上去。

【我的寻找】
查看了一些资料,也有网友提出这个问题。说是重新定向一下就可以了。好像是使用cookies模拟一下什么的。他写的是delphi的代码,我没有看太懂。如下:
----------------------------------------第一部分可能有用的Delphi代码
if URL='' then exit;
    FIdSSLIOHandlerSocket:=TIdSSLIOHandlerSocket.Create(nil);
    FIdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv3;
    FIdHTTP:=TIdHTTP.Create (nil);
    FIdHTTP.IOHandler := FIdSSLIOHandlerSocket;
    FIdHttp.HTTPOptions :=[];
    FIdHttp.ReadTimeout := 10000;
    FIdHttp.HandleRedirects := true;//自动跳转
    FIdHttp.Request.SetHeaders;
    FIdHttp.Request.UserAgent :='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)';
    FIdHttp.Request.Connection :='Close';
    FIdHttp.Request.CustomHeaders.Clear ;
    FIdHttp.Request.CustomHeaders.Add('Cookie: '+ACookie);
    try
        result:=FIdHttp.Post (URL,APostData);
    except
       on E: Exception do
          AError:=E.Message; //Moved Temporarily
    end;
    ACookie :=GetCookie(ACookie,FIdHttp.Response.RawHeaders.Text)+ACookie;
    URL:=FIdHttp.Response.Location;
    FIdHTTP.Free ;
    FIdSSLIOHandlerSocket.Free ;
    if (AError='HTTP/1.1 302 Moved Temporarily')or(AError='HTTP/1.1 302 Found') then
    begin
       Result:=PostHttp(URL,ACookie,APostData);
    end;
----------------------------------------

----------------------------------------第二部分可能有用的Delphi代码
begin
        APostData.Add('product=163');
        APostData.Add('type=1');
        APostData.Add('username='+FUserName);
        APostData.Add('password='+FPassword);
        AUrl:='http://reg.163.com/logins.jsp';
        AResult:=PostHttp(AUrl,ACookie,APostData);

        if pos('跳转提示',AResult)>0 then
        begin
            AUrl:=GetReplaceUrl(AResult);   //跳转提示
            if AUrl<>'' then
            begin
                AResult:=GetHttp(AUrl,ACookie);
                AUrl:=GetReplaceUrl(AResult);   //登录成功,正在跳转
                if AUrl<>'' then
                begin
                    AResult:=GetHttp(AUrl,ACookie);
                    FCookie:=ACookie;
                    HTMLSource;  //这里就得到了跳转后的最终的网页通行证代码
                end;
            end;

         end ;
----------------------------------------
我看他delphi大概的意思,是说先正常post,然后又再次提交了cookies中的内容去重定向了一次,这一句:PostHttp(AUrl,ACookie,APostData);。再然后就得到了最终页面的返回结果。

******************************************************************

【郁闷】
不知道我上面的描述大侠们是不是能理解。。。呵呵。对于没有接触过的朋友可能有点不明白。但对于大侠来说应该是很容易的事情。散分300,赠予热心侠客。
求助大侠解决问题。非常感谢!!
--------------------编程问答--------------------  江湖救急啊......霍霍.... --------------------编程问答-------------------- 你贴的delphi代码,重点都不在这里。

应该是返回的 httpresponse里面的header里面有一个redirect url,然后根据那个再获取一次。 --------------------编程问答-------------------- 好不容易看完,发现属于没有接触过的朋友 --------------------编程问答-------------------- caozhy朋友,请问能不能指点一下redirect url这个应该如何获取? --------------------编程问答-------------------- 不是,是我已经获取了,是这个地址:
window.location.replace("http://reg.youdao.com/crossdomain.jsp?username=csdn2013&loginCookie=H6p7RH7C51BGlO96ff7I3vAlFL6ZKSFQGFbBGDnl7dxTB2k6ZBVkwemIqYSI78OFgeofsc6OAEvsrETDgVKNYOe127rEwLvOOZdRkhUVXOju6&sInfoCookie=1270274787%7C0%7C3%2640%23%23&pInfoCookie=csdn2013%40163.com%7C1270274787%7C0%7Cother%7C11%266%7Clin%261270269512%26other%23lin%26210200%2310%7C%260&url=http%3A%2F%2Freg.163.com%2FMain.jsp%3Fusername%3Dcsdn2013");//remain for popo ,don't del

跳转后的,请问我获取了以后,如何redirect ?代码里应该如何写呢? --------------------编程问答-------------------- 顶我一下。。。。 --------------------编程问答-------------------- 关注中....... --------------------编程问答-------------------- 学习中。。。没有接触过。 --------------------编程问答-------------------- 关注一下! --------------------编程问答-------------------- 期待高手中啊... --------------------编程问答-------------------- 唉。。。。。。。无解啊。。 --------------------编程问答-------------------- good good study,day day up --------------------编程问答-------------------- 高手出现啦!哇哈哈 --------------------编程问答-------------------- day day up...... --------------------编程问答-------------------- 帮顶一下 --------------------编程问答-------------------- LZ,给你发到邮箱了。 --------------------编程问答-------------------- 对于页面跳转的问题,HttpWebRequest可以自己处理,有一个参数设置为True时自己会跳转,名称忘记了,可以去查查MSDN,当然这只是一种情况,就是HTTP中的301或是302跳转。第二种情况是HTML或是Javascript的跳转,这时就需要自己获取源代码中的链接了,然后带上上次访问的COOKIES去访问那个跳转的链接,像是一些登陆的跳转操作,一般都需要COOKIES,不然没有权限。 --------------------编程问答-------------------- 直接 用登陆的cookie 去访问 要取源码 的 网址不知道 可否 --------------------编程问答-------------------- --------------------编程问答-------------------- 写得太长了,说明用什么语言得到跳转后的网址就行了。 --------------------编程问答-------------------- 不知楼主解决了折个问题没?我也遇到了相同的情况,希望可以指点一下。邮箱zhaochaoqun33@163.com,谢谢!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,