今天把一个网站登录配置到以前写的蜘蛛程序中,发现不能成功登录。检查后才发现,那个网站在登录成功后,输出了一个特殊路径的 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