当COOKIES_ENABLED是注释的时候scrapy默认没有开启cookie
当COOKIES_ENABLED没有注释,设置为False的时候scrapy默认使用了settings里面的cookie
当COOKIES_ENABLED设置为True的时候scrapy就会把settings的cookie关掉,使用自定义cookie
也就是
如果使用自定义cookie就把COOKIES_ENABLED设置为True
如果使用settings的cookie就把COOKIES_ENABLED设置为False
这里先给出我经过抓包测试,阅读源码等最终结论
0. scrapy 中 Requests 类,可以使用 cookies 和 headers 两种方法添加 cookie ,
1. COOKIES_ENABLED 默认为 True,注释掉 COOKIES_ENABLED 即使用默认值
2. COOKIES_ENABLED = True 时:
1. scrapy 启动 CookiesMiddleware 中间件,为请求自动添加服务器响应的 cookie,
2. 如果我们在 Request 中,使用 cookies 参数添加 cookie 时, 我们添加的 cookie 会额外加入到请求头中,如果响应有重名设置,则覆盖。(即,cookies 参数的cookie优先,但是 response 里的 cookie 也一个不少)
3. 如果我们使用 headers 参数添加 cookie,headers添加的 cookie 会失效,被响应 cookie 完全覆盖。(即,headers里设置的 cookie 无效)
3. COOKIES_ENABLED = False 时:
1. scrapy 关闭 CookiesMiddleware 中间件,response 设置的 cookie 失效
2. 使用 cookies 设置的 cookie 失效。
3. 使用 headers 设置的 cookie 保留。
如果不太明白,那么从使用情景解释:
1. 如果不想要任何 cookie,COOKIES_ENABLED = False, headers 里不要添加 cookie
2. 想要自动设置全部的 cookie,或者在全部的cookie基础上进行部分更改, COOKIES_ENABLED = True,用cookies参数调整 cookie 设置
3. 想要只用自己定义的 cookie,COOKIES_ENABLED=False,使用 headers 设置 cookie
以下是我的测试过程
scrapy中,自动配置了 CookiesMiddleware , 当我们设置 COOKIES_ENABLED = True 时, 它会在我们获得服务器响应后,自动的将 response 设置的 cookie 添加到下一个request 中去,例如:
当我们设置 COOKIES_ENABLED 为 True 的时候,我们两次访问百度,
第一次访问没有携带cookie,请求头中没有设置cookie,百度的响应中有了setcookie,
随后第二次访问,scrrapy就自动携带了上次响应所设置的cookie
当我们设置 COOKIES_ENABLED 为 False 的时候, 同样的代码两次访问百度,第二次不再携带cookie信息
那么 当我们设置自己的cookie时,会怎么样?
COOKIES_ENABLED = True 时,第二次请求头如下:
显然scrapy框架加入了我们自定义cookie,同时也把 response 设置的 cookie 自动加入了
同时如果我们自己设置的 cookie 的键值和response所设置的重名,则会覆盖原来 response 设置的 cookie,
COOKIES_ENABLED = False 时,第二次请求头如下:
即使我们手动设置了cookie,仍然不起作用了。
至此,总结一下:
COOKIES_ENABLED = True,自动在后续的请求中添加响应的cookie,我们自己通过cookies设置的cookie会加入并覆盖到响应设置的cookie中
COOKIES_ENABLED = False,通过cookies设置的,以及响应设置的cookie,全部无效。
等等,问题来了,我想要设置自己的cookie,而不想添加任何 response 设置的多余的cookie,怎么办,,,
经过测试,使用 headers 参数可以添加,我们把 COOKIES_ENABLED 设置为 False,测试代码如下:
发出的请求头如下:
这样就只含有我们所设置的cookie了。