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#