我正在做一个涉及一些基本网络爬取的项目。我一直在非常成功地使用 HttpWebRequest 和 HttpWebResponse。对于 cookie 处理,我每次只有一个 CookieContainer 分配给 HttpWebRequest.CookieContainer 。我每次都会自动填充新的 cookie,不需要我进行额外的处理。这一切都运行良好,直到不久前曾经工作的网站之一突然停止工作。我有理由确定这是 cookie 的问题,但我没有记录 cookie 从它过去工作时起的记录,所以我不能 100% 确定。
我已经设法用以下代码模拟了这个问题:
CookieContainer cookieJar = new CookieContainer();
Uri uri1 = new Uri("http://www.somedomain.com/some/path/page1.html");
CookieCollection cookies1 = new CookieCollection();
cookies1.Add(new Cookie("NoPathCookie", "Page1Value"));
cookies1.Add(new Cookie("CookieWithPath", "Page1Value", "/some/path/"));
Uri uri2 = new Uri("http://www.somedomain.com/some/path/page2.html");
CookieCollection cookies2 = new CookieCollection();
cookies2.Add(new Cookie("NoPathCookie", "Page2Value"));
cookies2.Add(new Cookie("CookieWithPath", "Page2Value", "/some/path/"));
Uri uri3 = new Uri("http://www.somedomain.com/some/path/page3.html");
// Add the cookies from page1.html
cookieJar.Add(uri1, cookies1);
// Add the cookies from page2.html
cookieJar.Add(uri2, cookies2);
// We should now have 3 cookies
Console.WriteLine(string.Format("CookieJar contains {0} cookies", cookieJar.Count));
Console.WriteLine(string.Format("Cookies to send to page1.html: {0}", cookieJar.GetCookieHeader(uri1)));
Console.WriteLine(string.Format("Cookies to send to page2.html: {0}", cookieJar.GetCookieHeader(uri2)));
Console.WriteLine(string.Format("Cookies to send to page3.html: {0}", cookieJar.GetCookieHeader(uri3)));
这模拟了访问两个页面,这两个页面都设置了两个 cookie。然后,它会检查哪些 cookie 将被设置到三个页面中的每一个。
在这两个cookie中,一个没有指定路径,另一个指定了路径。当未指定路径时,我假设 cookie 将被发送回该域中的任何页面,但它似乎只会被发送回该特定页面。我现在假设这是正确的,因为它是一致的。
对我来说主要问题是处理带有指定路径的 cookie。当然,如果指定了路径,那么 cookie 应该被发送到该路径中包含的任何页面。因此,在上面的代码中,'CookieWithPath' 应该对 /some/path/ 中的任何页面都有效,包括 page1.html、page2.html 和 page3.html。当然,如果您注释掉两个 'NoPathCookie' 实例,那么 'CookieWithPath' 会按照我的预期发送到所有三个页面。但是,如上所述包含“NoPathCookie”后,“CookieWithPath”只会发送到 page2.html 和 page3.html,而不是 page1.html。
为什么会这样,它是否正确?
搜索此问题时,我遇到了有关 CookieContainer 中域处理问题的讨论,但找不到有关路径处理的任何讨论。
我正在使用 Visual Studio 2005 / .NET 2.0