!!!!抢分了。菜手求救,关于模拟Cookie,抓取页面。

jokulyang 2006-08-29 10:47:17
我想实现的是:

通过登录页面
http://china.alibaba.com/member/signin.htm
登录后抓取下面这个页面
http://china.alibaba.com/member/myalibaba.htm?ca=true

可是不行啊。。。。但是我同样的程序抓其他站点的页面是可以的。
为什么这个不行啊。。。。

我的代码如下:
string url = "http://china.alibaba.com/member/signin.htm";
System.Net.HttpWebRequest req=(System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);
req.CookieContainer =new CookieContainer ();

req.Method="POST";//POST方式请求
req.ContentType= "application/x-www-form-urlencoded";//内容类型
req.Headers["charset"] = "GBK";
req.Headers["TransferEncoding"] = "chunked";



//参数经过URL编码
string paraUrlCoded;
paraUrlCoded=System.Web.HttpUtility.UrlEncode("LoginId") +"="+System.Web.HttpUtility.UrlEncode("guanggao250");
paraUrlCoded=paraUrlCoded+"&";
paraUrlCoded=paraUrlCoded+System.Web.HttpUtility.UrlEncode("Password")+"="+System.Web.HttpUtility.UrlEncode("a123456");
paraUrlCoded=paraUrlCoded+"&";
paraUrlCoded=paraUrlCoded+System.Web.HttpUtility.UrlEncode("action")+"="+System.Web.HttpUtility.UrlEncode("Signin");
paraUrlCoded=paraUrlCoded+"&";
paraUrlCoded=paraUrlCoded+System.Web.HttpUtility.UrlEncode("eventSubmit_doPost")+"="+System.Web.HttpUtility.UrlEncode("anywhere");
paraUrlCoded=paraUrlCoded+"&";
paraUrlCoded=paraUrlCoded+System.Web.HttpUtility.UrlEncode("Done")+"="+System.Web.HttpUtility.UrlEncode("");



//将URL编码后的字符串转化为字节
byte[] payload;
//payload=System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
payload=System.Text.Encoding.Default.GetBytes(paraUrlCoded);
req.ContentLength=payload.Length; //设置请求的ContentLength
System.IO.Stream writer=req.GetRequestStream();//获得请求流
writer.Write(payload,0,payload.Length);//将请求参数写入流
writer.Close();//关闭请求流

//获得响应流
System.Net.HttpWebResponse response=(System.Net .HttpWebResponse)req.GetResponse();
System.Net.CookieCollection retCookie = response.Cookies ;

System.IO.Stream ss=response.GetResponseStream();
StreamReader firstreader = new StreamReader(ss,System.Text .Encoding.Default);
String firstrespHTML = firstreader.ReadToEnd();

Response.Write("<br>---------------------------------1-------------------------------<br>");

string temp = response.Headers["Set-Cookie"].ToString();//GetHeader("Set-Cookie")
Response.Write(temp);

Response.Write("<br>---------------------------------2-------------------------------<br>");
foreach (Cookie cook in retCookie)
{
Console.WriteLine("Cookie:");
Response.Write( cook.Name + " = " + cook.Value);
}

//retCookie = temp
Response.Write("<br>---------------------------------3-------------------------------<br>");

///////////////////////////////////////////////////////////////
string urlagain= "http://china.alibaba.com/member/myalibaba.htm?ca=true";
//生成请求
System.Net.HttpWebRequest reqagain=(HttpWebRequest)WebRequest.Create (urlagain);
CookieContainer againCookie =new CookieContainer ();

foreach(System.Net.Cookie c in retCookie)
{
c.Domain= ".alibaba.com";
}
System.Uri uri = new System.Uri("http://www.alibaba.com");
Response.Write( uri.ToString() +"*********************************<br>");
againCookie.SetCookies(uri,temp.Replace("Domain=china.alibaba.com;",""));//Add(retCookie);
reqagain.CookieContainer = againCookie;

response=(System.Net .HttpWebResponse)reqagain.GetResponse();
System.IO.Stream s=response.GetResponseStream();
StreamReader reader = new StreamReader(s,System.Text .Encoding.UTF8);
String respHTML = reader.ReadToEnd();
//显示提示内容

System.Net.CookieCollection sCookie = response.Cookies ;

foreach (Cookie cook in sCookie)
{
Response.Write( cook.Name + " = " + cook.Value);
}

// string temp1 = response.Headers["Set-Cookie"].ToString();//GetHeader("Set-Cookie")
// Response.Write(temp1);

Response.Write("<br>----------------------------------4------------------------------<br>");
Response.Write(respHTML);//如不成功,会显示登录失败

谢谢,各位了。。。。。。。。。。。。。。。。
...全文
920 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
jokulyang 2006-08-30
  • 打赏
  • 举报
回复

问题没有解决。。。。。。。。。

关于这类问题,大家还有资料网站可以提供吗?
zpengenpz 2006-08-30
  • 打赏
  • 举报
回复
up
sunyanqing 2006-08-30
  • 打赏
  • 举报
回复
楼主可以找火车头的作者探讨下
haidazi 2006-08-30
  • 打赏
  • 举报
回复
还没解决问题啊?
haidazi 2006-08-29
  • 打赏
  • 举报
回复
你要获取的页面的CookieContainer要与登录时用的CookieContainer一致才可以成功
这方面我已经试过n次都成功了,就算那网站有验证码也没有问题。呵呵。
fengfangfang 2006-08-29
  • 打赏
  • 举报
回复
可能与WEB服务器的类型有关
fengfangfang 2006-08-29
  • 打赏
  • 举报
回复
ali_apache_sid 不一样了
fds2003 2006-08-29
  • 打赏
  • 举报
回复
一大段代码,看得头都晕了!
jokulyang 2006-08-29
  • 打赏
  • 举报
回复
string temp = response.Headers["Set-Cookie"].ToString
。。。。
againCookie.SetCookies(uri,temp.Replace("Domain=china.alibaba.com;",""));

这样给cookie赋值对吗??????
郁闷了。同样的程序访问其他的网站就可以。
myminimouse 2006-08-29
  • 打赏
  • 举报
回复
up
fengfangfang 2006-08-29
  • 打赏
  • 举报
回复
楼上说的有理,LZ不妨试试
jokulyang 2006-08-29
  • 打赏
  • 举报
回复
to: haidazi()

我的程序登录后就访问要获取的页面,CookieContainer是刚得到的阿,又不是重复了n次。。。
haidazi 2006-08-29
  • 打赏
  • 举报
回复
使用同一个CookieContainer的HttpWebRequest就是一个session,这是关键
haidazi 2006-08-29
  • 打赏
  • 举报
回复
关键是你的CookieContainer问题
你新建一个CookieContainer后,应该用session把它装起来,以后都用同一个CookieContainer
下面给个例子你看看
使用HttpWebRequest + CookieContainer就可以让多个web请求只有一个session
为HttpWebRequest 指定一个CookieContainer,使用同一个CookieContainer的Request就是一个session

代码如下:

CookieContainer cc = new CookieContainer();
for(int i=0;i<100;i++)
{
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://localhost/AspxApp/MainForm.aspx");
myReq.CookieContainer = cc;
HttpWebResponse resp = myReq.GetResponse() as HttpWebResponse;
Stream s = resp.GetResponseStream();
StreamReader sr = new StreamReader(s); String text = sr.ReadToEnd();
sr.Close();
s.Close();
}

AspxApp这个程序返回的内容就是SessionId,这100个请求SessionId是相同的
jokulyang 2006-08-29
  • 打赏
  • 举报
回复
to:fengfangfang()

没有什么细节,我只是想获取"http://china.alibaba.com/member/myalibaba.htm?ca=true"这个页面。程序里的Response.Write,除了最后一个有用外,其他的都是测试时用的。
还有你说得“参数\cookie\编码方式”,我怎么确定?
我是怀疑我的代码哪里有错误。
fengfangfang 2006-08-29
  • 打赏
  • 举报
回复
System.Uri uri = new System.Uri("http://www.alibaba.com");
Response.Write( uri.ToString() );
这里没有写具体页面,只写了网站是否正常?
fengfangfang 2006-08-29
  • 打赏
  • 举报
回复
既然是已经成功过,说明代码没什么大问题,只是参数\cookie\编码方式是否与网站完全一致,当然大家都不知道你所抓取网站的实现细节,也很难找出问题所在.
smalladam 2006-08-29
  • 打赏
  • 举报
回复
汗......头晕晕得~~~
Avoid 2006-08-29
  • 打赏
  • 举报
回复
string postData = "uUsername=avoid&uPassword=123456";
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(postData);

request = (HttpWebRequest)WebRequest.Create(sUrl);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
Stream newStream = request.GetRequestStream();
newStream.Write(data, 0, data.Length);

newStream.Close();

request.CookieContainer = cc;

response = (HttpWebResponse)request.GetResponse();
cc.Add(response.Cookies);
stream = response.GetResponseStream();
sHtml = new StreamReader(stream, System.Text.Encoding.Default).ReadToEnd();
private CookieContainer cc = new CookieContainer();

这个是以前帮人解决的。。。自己看看吧
csover8 2006-08-29
  • 打赏
  • 举报
回复
mark
加载更多回复(16)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧