笔记-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使用一般有两种形式:
- 固定不变式:cookie长时间不变,这种比较简单,无论是在请求构造时直接给出cookies参数或继承响应报文的cookie都可以;
- 变化式:需要指定cookiejar并时时更新。
笔记-scrapy-cookie的更多相关文章
- 笔记-scrapy与twisted
笔记-scrapy与twisted Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码. 在任何情况下,都不要写阻塞的代码.阻塞的代码包括: ...
- 3.羽翼sqlmap学习笔记之Cookie注入
Cookie注入: 1.假设这个网址"http://www.xxx.org/Show.asp?id=9"存在注入点.2.sqlmap命令提示符下输入下列内容进行跑表. sqlmap ...
- node学习笔记9——cookie,session相关操作
下面讲的都是基Express及相关的包.所以在实践本篇文章之前,通过npm安装好Express, cookie-parser, cookie-session这三个安装包. 先简单说一下,如何用Expr ...
- Python Web学习笔记之Cookie,Session,Token区别
一.Cookie,Session,Token简介 # 这三者都解决了HTTP协议无状态的问题 session ID or session token is a piece of data that i ...
- Django学习笔记之Cookie、Session和自定义分页
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- golang笔记:cookie
在同一个问题上栽了两次,以后碰到cookie出问题多半都是因为这个. Request.Cookie(name)取Cookie的时候,返回值只有name和value cookie.go cookies ...
- 1.5(学习笔记)Cookie
一.Cookie简介 Cookie是网站发送的一小段数据,在用户访问浏览网站时通过浏览器存储在用户的计算机上. 主要用于记录一些用户状态信息,例如记录用户的账号,当前所在地等,根据这些信息网站 可以提 ...
- Javaweb学习笔记5—Cookie&Session
今天来讲javaweb的第五阶段学习. Cookie和Session同样是web开发常用到的地方. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的 ...
- 学习日常笔记<day11>cookie及session
1.会话管理 1.1会话管理定义 会话管理:管理浏览器客户端和服务端之间的会话过程中产生的会话数据 域对象:实现资源之间的数据共享 request 域对象 context 域对象 1.2.会话技术 C ...
- django笔记10 cookie整理
感谢武沛齐老师 Alex老师 cookie 没有cookie所有的网站都登录不上 客户端浏览器上的一个文件 {'user':'ljc'} {"user":'zpt'} reques ...
随机推荐
- Linux学习_按时间顺序解压多个文件,搜索文件中的内容
ls的结果按时间数据先排序,再取末尾5个文件,再调用tar命令 ls -1 | sort -u | tail -5 |xargs -n1 tar xzvf 利用grep命令从文件中搜索. grep - ...
- linux下使用iperf测试服务器带宽
准备工具 1.2台Linux服务器(要求其中至少1台主机为腾讯云主机,另外一台任意主机均可,确保2台主机可以互相访问即可)2.Iperf软件为专业网络性能测试工具. 测试目标 上海地区主机外网带宽是否 ...
- Python基础学习-列表基本操作
列表:Python的“苦力”. 列表不同于元组和字条串的地方:列表是可变的——可以改变列表的内容,并且列表有很多有用的.专门的方法. 1.list函数 因为字符串不能像列表一样被修改,所有有时根 ...
- 火车进站输出路径(HDU1022)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022 解题报告: 思路: 就是维护好这个栈,只要它不是空,并且头部和ans相同,就一直出栈,直到不满足 ...
- node执行环境
nodejs本质上是一个javascript的执行环境,只是由于他的封装,加上更多web底层的一个处理,赋予了更多的能力,那么执行环境到底是什么呢,我们到浏览器里面体验看看,在chrome里面控制台, ...
- maven parent version not found
需要把parent工程,也就是package是pom的那个工程先install一下 要是不行的话可以试下mvn -X clean install,-X表示强制从远程库更新dependency:再不行可 ...
- P3391 【模板】文艺平衡树(Splay)
Splay #include<cstdio> #include<algorithm> #include<iostream> using namespace std; ...
- 【Java-POJO-设计模式】JavaEE中的POJO与设计模式中多态继承的冲突
最近看<重构>谈到利用OO的多态来优化 if else 和 switch 分支语句,但是我发现OO语法中的多态在使用框架的JavaEE中是无法实践的.对此,我感到十分的疑惑,加之之前项目中 ...
- Map the Debris -freecodecamp算法题目
Map the Debris 1.要求 返回一个数组,其内容是把原数组中对应元素的平均海拔转换成其对应的轨道周期. 原数组中会包含格式化的对象内容,像这样 {name: 'name', avgAlt: ...
- 微信小程序开发踩坑与总结 -
原文链接:https://segmentfault.com/a/1190000008516296 前段时间把公司小程序项目开发完成了,所以来写写自己开发过程中碰到的问题和解决方法,以及用到的提高效率的 ...