方法一是將cookie以ref方式的參數(shù)傳遞進登錄的方法中,在以后抓其它頁面時也帶著這個cookie。 下面的方法中后面部分,如果只是將request中的cookie保留,即req.CookieContainer.GetCookieHeader(new Uri(url)),則對有些網(wǎng)站可行,而對一些網(wǎng)站,比如水木社區(qū)就不行。 加上后面的部分:cookie += “; ” + res.Headers.Get(”Set-Cookie”);則可以了。 而實際response中的cookie實際上只是比request中的多了個path=/。 也正是這種重復(fù),讓我想肯定是別的辦法。
public static string PostUrl(String method, String url, String paramList, String referer, ref String cookie)
//設(shè)置cookie. CookieContainer cookieCon = new CookieContainer(); req.CookieContainer = cookieCon; req.CookieContainer.SetCookies(new Uri(url), cookie);
res = (HttpWebResponse)req.GetResponse(); //將cookie給回傳參數(shù)。 cookie = req.CookieContainer.GetCookieHeader(new Uri(url)); Console.WriteLine("before:" + cookie); //下面這句話是要刪掉就不行了。其實下面這句response中的cookie包含了前面request中的部分。 cookie += "; " + res.Headers.Get("Set-Cookie"); Console.WriteLine("after:" + cookie);
方法二: 此方法的類中有一個成員變量,為了方便設(shè)置成potected類型,這樣在post數(shù)據(jù)登錄,還是get其它頁面時都將req.CookieContainer 設(shè)置成該公用的cookies. 該方法使用時少傳遞了個參數(shù),調(diào)用方便點,另外設(shè)置cookie的位置也簡單了。 在水木社區(qū)上也測試通過了。
PostUrl(String url, String paramList, String referer)
protected CookieContainer cookies = new CookieContainer(); //設(shè)置cookie. req.CookieContainer = cookies;
|