方法一是将cookie以ref方式的参数传递进登录的方法中,在以后抓其它页面时也带着这个cookie。 下面的方法中后面部分,如果只是将request中的cookie保留,即req.CookieContainer.GetCookieHeader(new Uri(url)),则对有些网站可行,而对一些网站,比如水木社区就不行。 加上后面的部分:cookie += “; ” + res.Headers.Get(”Set-Cookie”);则可以了。 而实际response中的cookie实际上只是比request中的多了个path=/。 也正是这种重复,让我想肯定是别的办法。
public static string PostUrl(String method, String url, String paramList, String referer, ref String cookie)
//设置cookie. CookieContainer cookieCon = new CookieContainer(); req.CookieContainer = cookieCon; req.CookieContainer.SetCookies(new Uri(url), cookie);
res = (HttpWebResponse)req.GetResponse(); //将cookie给回传参数。 cookie = req.CookieContainer.GetCookieHeader(new Uri(url)); Console.WriteLine("before:" + cookie); //下面这句话是要删掉就不行了。其实下面这句response中的cookie包含了前面request中的部分。 cookie += "; " + res.Headers.Get("Set-Cookie"); Console.WriteLine("after:" + cookie);
方法二: 此方法的类中有一个成员变量,为了方便设置成potected类型,这样在post数据登录,还是get其它页面时都将req.CookieContainer 设置成该公用的cookies. 该方法使用时少传递了个参数,调用方便点,另外设置cookie的位置也简单了。 在水木社区上也测试通过了。
PostUrl(String url, String paramList, String referer)
protected CookieContainer cookies = new CookieContainer(); //设置cookie. req.CookieContainer = cookies;
|