本文已参与「新人创作礼」活动,一起开启掘金创作之路。
之前看到很多文章是这么说的,感觉不是那么准确。
当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 时:
-
scrapy 启动 CookiesMiddleware 中间件,为请求自动添加服务器响应的 cookie,
-
如果我们在 Request 中,使用 cookies 参数添加 cookie 时, 我们添加的 cookie 会额外加入到请求头中,如果响应有重名设置,则覆盖。(即,cookies 参数的cookie优先,但是 response 里的 cookie 也一个不少)
-
如果我们使用 headers 参数添加 cookie,headers添加的 cookie 会失效,被响应 cookie 完全覆盖。(即,headers里设置的 cookie 无效)
3. COOKIES_ENABLED = False 时:
-
scrapy 关闭 CookiesMiddleware 中间件,response 设置的 cookie 失效
-
使用 cookies 设置的 cookie 失效。
-
使用 headers 设置的 cookie 保留。
如果不太明白,那么从使用情景解释:
-
如果不想要任何 cookie,COOKIES_ENABLED = False, headers 里不要添加 cookie
-
想要自动设置全部的 cookie,或者在全部的cookie基础上进行部分更改, COOKIES_ENABLED = True,用cookies参数调整 cookie 设置
-
想要只用自己定义的 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了。