问题描述
Post网址后,想要提取网页源码。但中间有页面跳转,请问如何提取跳转后的、最终页面源码的问题。困扰多日。求解!******************************************************************【我的问题】我想提取校园网的网页源代码。使用如下方式:privatestringPostData(stringpurl,stringstr){try{byte[]data=Encoding.GetEncoding("UTF-8").GetBytes(str);HttpWebRequestreq=(HttpWebRequest)WebRequest.Create(purl);req.Timeout=30000;req.Method="Post";req.ContentType="application/x-www-form-urlencoded";req.ContentLength=data.Length;Streamstream=req.GetRequestStream();stream.Write(data,0,data.Length);stream.Close();HttpWebResponserep=(HttpWebResponse)req.GetResponse();StreamreceiveStream=rep.GetResponseStream();Encodingencode=Encoding.GetEncoding("UTF-8");StreamReaderreadStream=newStreamReader(receiveStream,encode);Char[]read=newChar[256];intcount=readStream.Read(read,0,256);StringBuildersb=newStringBuilder("");while(count>0){Stringreadstr=newString(read,0,count);sb.Append(readstr);count=readStream.Read(read,0,256);}rep.Close();readStream.Close();tx1.Text=t.ToString();returnsb.ToString();}catch(Exceptionex){return"";//ForumExceptions.Log(ex);}}可以正常返回源码信息。但问题是,这个返回的是第一次post数据后的信息,而实际上,我想要得到的结果是跳转N次之后的网页源码。******************************************************************【我的实例】由于校园网的那个中间跳转太多了。这里我们使用Post163网易来做个实验,效果也是比较相像的,但中间页只跳转了2次,比较好分析。我先提供一个已申请的163测试ID,用户名:csdn2013。密码:csdn2013abc。你可以先在http://reg.163.com/UserLogin.shtml入口处登陆一下,点击登陆按钮后,仔细的观察一下IE地址栏,隐约可以看到快速跳转的一个http://youdao.xxx.xxx.com/xxx/xxx的网址,然后会跳转到“网页通行证”页面去了。一、我运行:stringdata=PostData("https://reg.163.com/logins.jsp","username=csdn2013&password=csdn2013abc");这样将返回中间的跳转页的网页源码信息:<title>跳转提示</title>xxxxxx正在登录,请稍等...</p>二、而我最终想要得到的是跳转到登陆成功后的“网页通行证”上的页面信息。从初始post用户名密码,到最终的“网页通行证”页面,这中间我使用winsock抓包得到的数据是跳转了2次,第一次是跳转到youdao.xxx,第二次才是跳转到正常的“网页通行证”上去。【我的寻找】查看了一些资料,也有网友提出这个问题。说是重新定向一下就可以了。好像是使用cookies模拟一下什么的。他写的是delphi的代码,我没有看太懂。如下:----------------------------------------第一部分可能有用的Delphi代码ifURL=''thenexit;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;MSIE6.0;WindowsNT5.1;SV1)';FIdHttp.Request.Connection:='Close';FIdHttp.Request.CustomHeaders.Clear;FIdHttp.Request.CustomHeaders.Add('Cookie:'+ACookie);tryresult:=FIdHttp.Post(URL,APostData);exceptonE:ExceptiondoAError:=E.Message;//MovedTemporarilyend;ACookie:=GetCookie(ACookie,FIdHttp.Response.RawHeaders.Text)+ACookie;URL:=FIdHttp.Response.Location;FIdHTTP.Free;FIdSSLIOHandlerSocket.Free;if(AError='HTTP/1.1302MovedTemporarily')or(AError='HTTP/1.1302Found')thenbeginResult:=PostHttp(URL,ACookie,APostData);end;--------------------------------------------------------------------------------第二部分可能有用的Delphi代码beginAPostData.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);ifpos('跳转提示',AResult)>0thenbeginAUrl:=GetReplaceUrl(AResult);//跳转提示ifAUrl<>''thenbeginAResult:=GetHttp(AUrl,ACookie);AUrl:=GetReplaceUrl(AResult);//登录成功,正在跳转ifAUrl<>''thenbeginAResult:=GetHttp(AUrl,ACookie);FCookie:=ACookie;HTMLSource;//这里就得到了跳转后的最终的网页通行证代码end;end;end;----------------------------------------我看他delphi大概的意思,是说先正常post,然后又再次提交了cookies中的内容去重定向了一次,这一句:PostHttp(AUrl,ACookie,APostData);。再然后就得到了最终页面的返回结果。******************************************************************【郁闷】不知道我上面的描述大侠们是不是能理解。。。呵呵。对于没有接触过的朋友可能有点不明白。但对于大侠来说应该是很容易的事情。散分300,赠予热心侠客。求助大侠解决问题。非常感谢!!
解决方案
解决方案二:
江湖救急啊......霍霍....
解决方案三:
你贴的delphi代码,重点都不在这里。应该是返回的httpresponse里面的header里面有一个redirecturl,然后根据那个再获取一次。
解决方案四:
好不容易看完,发现属于没有接触过的朋友
解决方案五:
caozhy朋友,请问能不能指点一下redirecturl这个应该如何获取?
解决方案六:
不是,是我已经获取了,是这个地址: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");//remainforpopo,don'tdel跳转后的,请问我获取了以后,如何redirect?代码里应该如何写呢?
解决方案七:
顶我一下。。。。
解决方案八:
关注中.......
解决方案九:
学习中。。。没有接触过。
解决方案十:
关注一下!
解决方案十一:
期待高手中啊...
解决方案十二:
唉。。。。。。。无解啊。。
解决方案十三:
goodgoodstudy,daydayup
解决方案十四:
高手出现啦!哇哈哈
解决方案十五:
daydayup......
解决方案:
帮顶一下
解决方案:
LZ,给你发到邮箱了。
解决方案:
对于页面跳转的问题,HttpWebRequest可以自己处理,有一个参数设置为True时自己会跳转,名称忘记了,可以去查查MSDN,当然这只是一种情况,就是HTTP中的301或是302跳转。第二种情况是HTML或是Javascript的跳转,这时就需要自己获取源代码中的链接了,然后带上上次访问的COOKIES去访问那个跳转的链接,像是一些登陆的跳转操作,一般都需要COOKIES,不然没有权限。
解决方案:
直接用登陆的cookie去访问要取源码的网址不知道可否
解决方案:
该回复于2011-03-30 16:58:34被版主删除
解决方案:
写得太长了,说明用什么语言得到跳转后的网址就行了。
解决方案:
不知楼主解决了折个问题没?我也遇到了相同的情况,希望可以指点一下。邮箱zhaochaoqun33@163.com,谢谢!