摘要:记录以下关于scrapy中的cookie管理,以前学的差不多了,但是没留下笔记啥的,所以这次记录以下。

scrapy中的cookie管理

在setting.py文件中有个选项叫做COOKIES_ENABLED
默认情况下为下面这样:

# COOKIES_ENABLED = False
  • 当处于注释情况下,应该是COOKIES_ENABLED = True。scrapy会自动管理cookie。
  • COOKIES_ENABLED = False 时,应该是禁止浏览器返回的response使用set-cookie设置cookie,这个时候scrapy不会接受网站站设置的cookie。同时当COOKIES_ENABLED的值为False时使用

    # 在spider目录下爬虫文件的start_requests方法下设置
    cookies ={
    'authCode':'3a15f9d88833c3',
    'uid':'1',
    'PHPSESSID':'0tgqsqlrt',
    }
    return [scrapy.Request(url=self.url,callback=self.parse,cookies=cookies,dont_filter=True)]

    以及在middlewares.py中设置cookie如下:

    # 首先在settings.py给 DOWNLOADER_MIDDLEWARES 解注释。然后在middlewares中的DownloaderMiddleware的process_request方法中添加
    request.cookies ={
    'authCode':'3a15f9d88833c3',
    'uid':'1',
    'PHPSESSID':'0tgqsqlrt',
    }

    都会失效。这个时候只能通过在settings.py中的EFAULT_REQUEST_HEADERS设置cookie才会生效。

  • COOKIES_ENABLED = True 时,应该scrapy默认 COOKIES_ENABLED 的值就是True,这个时候无论是在 settings.py 中的 EFAULT_REQUEST_HEADERS设置cookie如下:

    DEFAULT_REQUEST_HEADERS = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like  Gecko) Chrome/75.0.3770.100 Safari/537.36',
    'cookie':'authCode=3a15f9d88833c3;uid=1;PHPSESSID=0tgqsqlrt'
    }

    还是在middlewares.py或者start_requests设置cookie都可以生效。

总结一下:

方法COOKIES_ENABLED = FalseCOOKIES_ENABLED = True注释状态
DEFAULT_REQUEST_HEADERSyesyesyes
DOWNLOADER_MIDDLEWARESnoyesyes
start_requestsnoyesyes

关于scrapy设置cookie优先级问题

当在middlewares.py中的DOWNLOADER_MIDDLEWARES里面的和cookies=cookies同时设置cookies时最后按照middlewares中的。
当在DEFAULT_REQUEST_HEADERS里面的和start_requests中的cookies=cookies同时设置cookies时最后按照cookies=cookies的。

获取scrapy中的cookie

  • 获取request头的cookie

    Cookie3 = response.request.headers.getlist('Cookie')
    print(Cookie3)
  • 获取response中的cookie

    Cookie = response.headers.getlist('Set-Cookie')
    print(Cookie)
  • 保存response中的cookie
    方法一:

    from scrapy.http.cookies import CookieJar 
    cookie_jar = CookieJar()
    cookie_jar.extract_cookies(response, response.request)
    for cookie in cookie_jar:
        print(str(cookie))
        with open('cookies.txt', 'w') as f:
            for cookie in cookie_jar:
                f.write(str(cookie) + '\n')

    这个方法有缺陷。当使用scrapy.FormRequest或者scrapy.Response.FormRequest进行登陆时,scrapy发出第一次请求,网站返回第一次response。然后如果网站返回的第一次response包含重定向302,scrapy自动处理header中的302重定向,自动发出第二次请求。网站返回第二次response。这个时候获取的response是第二次response。用上面的方法获取不到第一次response中的cookie,并且第二次response中没有Set-Cookie字段,所以会失败。

    方法二:同时对response和request获取cookie然后保存

    Cookie = response.headers.getlist('Set-Cookie')
    print(Cookie.decode(encoding='utf-8'))
    Cookie3 = response.request.headers.getlist('Cookie')
    print(Cookie3.decode(encoding='utf-8'))

获取response和request的body

print(response.body.decode(encoding='utf-8'))
print(response.request.body.decode(encoding='utf-8'))

获取request的ua

ua = response.request.headers.getlist('user-agent')
print(ua)

获取response和request的headers

print(response.headers)
print(response.request.headers)

关于scrapy设置header以及优先级

  • 在spider目录下爬虫文件的start_requests方法下设置header

    # 在spider目录下爬虫文件的start_requests方法下设置
    headers={
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like  Gecko) Chrome/75.0.3770.100 Safari/537.36',
    'Origin': 'https://www.keepnight.com',
    }
    return [scrapy.Request(url=self.url,callback=self.parse,headers=headers,cookies=cookies,dont_filter=True)]
  • 在settings.py中的DEFAULT_REQUEST_HEADERS设置header

    DEFAULT_REQUEST_HEADERS = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like  Gecko) Chrome/75.0.3770.100 Safari/537.36',
    'Origin': 'https://www.keepnight.com',
    'Content-Type': 'application/x-www-form-urlencoded',
      }
  • 在settings.py中的USER_AGENT设置header

    scrapy中的cookie与header管理1.jpg

    start_requests中设置headers=headers会优先于EFAULT_REQUEST_HEADERS,EFAULT_REQUEST_HEADERS优先于USER_AGENT, 当三个中的值冲突时时以headers=headers为准。