看了很多的文章, 感觉写的都有点扯淡 ,误人子弟 。
源码中 : 默认是注释掉的,但是上面的备注写的是开启状态(没关系, 不管)。
所以这个 就有了三个状态:
1. 第一个 源码的 注释状态:
# Disable cookies (enabled by default)
# COOKIES_ENABLED = False
这个状态下, 其实可以理解成 cookie 是开启的状态, 但是他的获取值 是通过源码的方法,scrapy直接获取网页的上层的cookie ,然后带到下一层去的。
2. 第二种解开注释的情况下 :
# Disable cookies (enabled by default)
COOKIES_ENABLED = False
这个状态下的 cookie 是通过 headers 添加上去的,这个就是中间件里面的 包裹在头部里面
就是 setting源码中的
# Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# 'Accept-Language': 'en',
#}
要是只是个别需要增加头部的,可以直接传参进去。 setting 写入时传全局的;
从这个里面去添加 cookie, token 等 一系列东西 。 或者 在请求的时候自己带上 ,源码里面 ,有 可以带的参数。headers 这个参数, 只是当前项目需要,可以在这里传
class Request(object_ref):
def __init__(self, url, callback=None, method='GET', headers=None, body=None,
cookies=None, meta=None, encoding='utf-8', priority=0,
dont_filter=False, errback=None, flags=None, cb_kwargs=None):
3. 第三种状态 就是 设置为 true:
# Disable cookies (enabled by default)
COOKIES_ENABLED = True
这种的, 就是覆盖源码中的方法, 后面使用的是自己的cookie ,
需要在请求的时候 带上 cookies= cookie,
cookie 自己设置到 setting 或者 spider 里面都可以。
这个设置是 全局设置的 。 以后的请求都是这个cookie 。
需要先声明他: cookie = '.......'
然后在请求的里面写上,
yield scrapy.Request(
href,
callback=self.get_parse,
cookies=cookie,
meta={
'name': name
}
)
;
def start_requests(self):
cookie = {}
str_cookie = '你的cookie信息'
str_cookie_items_list = str_cookie.split(';')
for str_cookie_items in str_cookie_items_list:
str_cookie_kw = str_cookie_items.split('=')
cookie[str_cookie_kw[0].strip()] = str_cookie_kw[1].strip()
yield scrapy.Request(
url=self.start_urls[0],
method='get',
callback=self.parse,
cookies=cookie
)
def parse(self, response, **kwargs):
print(response.text)
三种 状态 , 要是你想说 自己不想带 任何 cookie 怎么办?
第二种方法, 直接把注释解开就可了, 自己没设置cookie ,就不会带上去。
有的文章说的, 爬虫的爬取效率问题 就把注释打开了, 就是这个自己没有设置cookie 所以请求的时候不会去验证。
结合自己的 业务需求 来选取设置。
每个请求需要自己的 cookie、 token的 , 请使用 第二种。
直接全局可以使用一个cookie 的 、只需要这个字段的 , 用第三种方式。
headers、cookie单独设立 ,两者的cookie 相斥, 简单理解就是 有 headers (第二种), 单独设置的cookie(第三种 就会失效),反之亦然。
故此:三种状态 已讲清晰。 还有疑问的 可留言。