C#通过httpwebrequest保持会话ID

在使用C#.Net(如爬虫)浏览网站页面时,我需要保留相同的会话ID。 我发现了几个方法,一个HTTP嗅探器非常方便,比较我的IE浏览器正在发送(HTTP请求)和从Web服务器(HTTP响应)接收,因为重要的信息是在标题(不显示由浏览器)。 请不要混淆从服务器到浏览器公开的会话ID和服务器代码私有的服务器会话variables(如php)。

WebHeaderCollection headerCollection = new WebHeaderCollection(); using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { /* save headers */ for (int i = 0; i < response.Headers.Count; i++) { headerCollection.Add(response.Headers.AllKeys[i], response.Headers.Get(i)); } /* save cookies */ cookieContainer = new CookieContainer(); foreach (Cookie cookie in response.Cookies) { cookieContainer.Add(cookie); } } 

使其他GET或POST请求:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); ... /* restore PHPSESSID */ for (int i = 0; i < headerCollection.Count; i++) { string key = headerCollection.GetKey(i); if (key == "Set-Cookie") { key = "Cookie"; } else { continue; } string value = headerCollection.Get(i); request.Headers.Add(key, value); } /* restore cookies */ request.CookieContainer = cookieContainer; /* complete request */ Stream writeStream = request.GetRequestStream() 

我的要求是提供更好的代码或更多的想法来保持更好的爬虫会话。

如果您创build一个cookie容器并将其分配给第一个和第二个请求,则不需要执行所有关于从响应中复制cookie的操作。

当cookie被响应设置时,附加请求的cookie容器将接收并存储这些cookie。 因此,在一系列请求之间维护相同的会话上下文只需维护一个cookie容器实例,并将其用于所有请求。

你的代码变成:

 cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { // Do stuff with response } 

然后:-

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); ... request.CookieContainer = cookieContainer; Stream writeStream = request.GetRequestStream()