笔记-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并时时更新。

笔记-scrapy-cookie的更多相关文章

  1. 笔记-scrapy与twisted

    笔记-scrapy与twisted Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码. 在任何情况下,都不要写阻塞的代码.阻塞的代码包括: ...

  2. 3.羽翼sqlmap学习笔记之Cookie注入

    Cookie注入: 1.假设这个网址"http://www.xxx.org/Show.asp?id=9"存在注入点.2.sqlmap命令提示符下输入下列内容进行跑表. sqlmap ...

  3. node学习笔记9——cookie,session相关操作

    下面讲的都是基Express及相关的包.所以在实践本篇文章之前,通过npm安装好Express, cookie-parser, cookie-session这三个安装包. 先简单说一下,如何用Expr ...

  4. Python Web学习笔记之Cookie,Session,Token区别

    一.Cookie,Session,Token简介 # 这三者都解决了HTTP协议无状态的问题 session ID or session token is a piece of data that i ...

  5. Django学习笔记之Cookie、Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  6. golang笔记:cookie

    在同一个问题上栽了两次,以后碰到cookie出问题多半都是因为这个. Request.Cookie(name)取Cookie的时候,返回值只有name和value cookie.go cookies ...

  7. 1.5(学习笔记)Cookie

    一.Cookie简介 Cookie是网站发送的一小段数据,在用户访问浏览网站时通过浏览器存储在用户的计算机上. 主要用于记录一些用户状态信息,例如记录用户的账号,当前所在地等,根据这些信息网站 可以提 ...

  8. Javaweb学习笔记5—Cookie&Session

    今天来讲javaweb的第五阶段学习. Cookie和Session同样是web开发常用到的地方. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的 ...

  9. 学习日常笔记<day11>cookie及session

    1.会话管理 1.1会话管理定义 会话管理:管理浏览器客户端和服务端之间的会话过程中产生的会话数据 域对象:实现资源之间的数据共享 request 域对象 context 域对象 1.2.会话技术 C ...

  10. django笔记10 cookie整理

    感谢武沛齐老师 Alex老师 cookie 没有cookie所有的网站都登录不上 客户端浏览器上的一个文件 {'user':'ljc'} {"user":'zpt'} reques ...

随机推荐

  1. es6-正则

    RegExp构造函数 在ES5中,RegExp构造函数的参数有两种情况. 第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag). var regex = new RegExp( ...

  2. List之Sort使用

    void TestListSort(){ List<string> st = new List<string> (); st.Add ("abcd"); s ...

  3. ArcGIS API for JavaScript开发初探——基本地图组件使用

    1.前言 在上一篇我们已经我们已经讲述了第一个地图应用程序的HelloMap的创建过程,这一篇我们来讲述基本地图组件:Home Button.比例尺.鹰眼图的使用方法. 2.基本地图组件 在ArcGI ...

  4. u-boot分析(六)----时钟初始化

    u-boot分析(六) 上篇博文我们按照210的启动流程,分析到了关闭看门狗,今天我们继续按照u-boot的启动流程进行分析,今天我们会主要分析时钟的初始化. 今天我们会用到的文档: 1.       ...

  5. Go编程语言学习笔记

    go如何组织代码?它有一个工作空间的概念.所谓工作空间其实就是一个目录,其中包含三个子目录. src目录包含Go的源文件,它们被组织成包(每个目录都对应一个包), pkg目录包含包对象, bin目录包 ...

  6. Quartz .Net(定时框架):

    Quartz .Net(定时框架): 基本说明: 说明:Quartz .Net 是一个从 Java 版的 Quartz 移植过来定时任务框架,可以实现异常灵活的定 时任务 用法: 安装 Quartz ...

  7. C++ Eigen库和Matlab对比

    // A simple quickref for Eigen. Add anything that's missing. // Main author: Keir Mierle #include &l ...

  8. 检测浏览器中是否有Flash插件

    由于IE和非IE浏览器检测方式不同,所以代码如下 function hasPlugin(name){ debugger; name = name.toLowerCase(); for(var i=0; ...

  9. [转载]互联网 免费的WebService接口

    股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webxml.com.cn/WebServices/St ...

  10. 线程 task pritce

    1.使用task类创建并执行简单任务: 使用task的构造函数来创建 任务,并调用start方法来启动任务,执行异步操作 aitAll用于等待提供的所有 System.Threading.Tasks. ...