今天把一個網站登錄配置到以前寫的蜘蛛程序中,發現不能成功登錄。檢查后才發現,那個網站在登錄成功后,輸出了一個特殊路徑的 Cookie,由於是使用 HttpWebRequest.Cookies 來獲取的 Cookie,默認是獲得當前路徑相關的 Cookie,里面少了那個特殊的 Cookie,查了半天資料,也沒有一個好的解決辦法。最后采用 HttpWebResponse.Headers["Set-Cookie"] 來獲得所有的 Cookie 字符串,然后寫一段代碼把這些 Cookie 字符串轉換到 CookieCollection 中,解決了問題,以下是部分代碼:
#region 讀取 Cookie
string strCookie=myWebResponse.Headers["Set-Cookie"];
AddCookieWithCookieHead(CookieCol,strCookie,uri.Host);
#endregion
#region 從包含多個 Cookie 的字符串讀取到 CookieCollection 集合中
private static void AddCookieWithCookieHead(CookieCollection cookieCol,string cookieHead,string defaultDomain)
{
if(cookieHead==null)return;
string[] ary=cookieHead.Split(';');
for(int i=0;i for(int i=0;i {
Cookie ck=GetCookieFromString(ary[i].Trim(),defaultDomain);
if(ck!=null)
{
cookieCol.Add(ck);
}
}
}
#endregion
#region 讀取某一個 Cookie 字符串到 Cookie 變量中
private static Cookie GetCookieFromString(string cookieString,string defaultDomain)
{
string[] ary=cookieString.Split(',');
Hashtable hs=new Hashtable();
for(int i=0;i {
string s=ary[i].Trim();
int index=s.IndexOf("=");
if(index>0 && index {
hs.Add(s.Substring(0,index),s.Substring(index+1));
}
}
Cookie ck=new Cookie();
foreach(object Key in hs.Keys)
{
if(Key.ToString()=="path")ck.Path=hs[Key].ToString();
else if(Key.ToString()=="expires")
{
//ck.Expires=DateTime.Parse(hs[Key].ToString();
}
else if(Key.ToString()=="domain")ck.Domain=hs[Key].ToString();
else
{
ck.Name=Key.ToString();
ck.Value=hs[Key].ToString();
}
}
if(ck.Name=="")return null;
if(ck.Domain=="")ck.Domain=defaultDomain;
return ck;
}
#endregion
