笔记-scrapy-cookie

笔记-scrapy-cookie传递

1.      scrapy cookie传递

1.1.    开始

与cookie相关的设置参数有两个:

COOKIES_ENABLED 决定是否使用cookies middleware;

COOKIES_DEBUG              决定是否详细记录cookie设置情况。

2.      原理及实现

scrapy的cookie功能在downloadmiddlewares/cookies中实现

核心代码是

  def __init__(self, debug=False):

        self.jars = defaultdict(CookieJar)

        self.debug = debug

deafultdict是dict的变种,以给出的参数(类)初始化字典元素值;

通过下面两个方法设置cookie和更新;

    def process_request(self, request, spider):

        if request.meta.get('dont_merge_cookies', False):

            return

        cookiejarkey = request.meta.get("cookiejar")

        jar = self.jars[cookiejarkey]

        cookies = self._get_request_cookies(jar, request)

        for cookie in cookies:

            jar.set_cookie_if_ok(cookie, request)

        # set Cookie header

        request.headers.pop('Cookie', None)

        jar.add_cookie_header(request)

        self._debug_cookie(request, spider)

注意:如果在请求中同时给出了cookies和cookiejar,会使用cookies中的值复写cookiejar的值。

具体实现如下:

    def _get_request_cookies(self, jar, request):

        if isinstance(request.cookies, dict):

            cookie_list = [{'name': k, 'value': v} for k, v in \

                    six.iteritems(request.cookies)]

        else:

            cookie_list = request.cookies

        cookies = [self._format_cookie(x) for x in cookie_list]

        headers = {'Set-Cookie': cookies}

        response = Response(request.url, headers=headers)

        return jar.make_cookies(response, request)

 回应报文cookie设置

    def process_response(self, request, response, spider):

        if request.meta.get('dont_merge_cookies', False):

            return response

        # extract cookies from Set-Cookie and drop invalid/expired cookies

        cookiejarkey = request.meta.get("cookiejar")

        jar = self.jars[cookiejarkey]

        jar.extract_cookies(response, request)

        self._debug_set_cookie(response, spider)

        return response

会在收到服务器响应后对相应cookie值进行更新。

2.1.    cookie值更新

scrapy支持cookie保持,但cookie设置不是粘性的,需要在每次构造请求时重新指定。

首先,需要指定一个初始cookie

meta={‘cookiejar’:<number>}

还记得前面提过cookies会复写cookiejar么,这样会创建/更新一个键为number的jar元素,后面可以通过指定cookiejar引用:

meta={‘cookiejar’:1} 

可以更新,当然也可以不更新cookie值,在meta中指定:

meta = {‘don’t_merge_cookies’:True}

这样就不会更新cookie值。

3.      总结

爬虫中的cookie使用一般有两种形式:

  1. 固定不变式:cookie长时间不变,这种比较简单,无论是在请求构造时直接给出cookies参数或继承响应报文的cookie都可以;
  2. 变化式:需要指定cookiejar并时时更新。

猜你喜欢

转载自www.cnblogs.com/wodeboke-y/p/10010137.html