scrapy cookies:将cookies保存到文件以及从文件加载cookies
我在使用scrapy模拟登录新浪微博时,想将登录成功后的cookies保存到本地,下次加载它实现直接登录,省去中间一系列的请求和POST等。关于如何从本次请求中获取并在下次请求中附带上cookies的方法,官方文档已经有很好的说明,网上也有很多相关的资料,但是将cookies存储到文件和从文件加载cookies却未找到相关的说明,只好自己折腾了,经过一番尝试,总算是实现了该功能,方法记录如下。
简单分析scrapy的cookies
查看scrapy与cookies有关的源码,在http/cookies.py文件中,下面是部分代码:
import time
from cookielib import CookieJar as _CookieJar, DefaultCookiePolicy, IPV4_RE
from scrapy.utils.httpobj import urlparse_cached
class CookieJar(object):
def __init__(self, policy=None, check_expired_frequency=10000):
self.policy = policy or DefaultCookiePolicy()
self.jar = _CookieJar(self.policy)
self.jar._cookies_lock = _DummyLock()
self.check_expired_frequency = check_expired_frequency
self.processed = 0
def extract_cookies(self, response, request):
wreq = WrappedRequest(request)
wrsp = WrappedResponse(response)
return self.jar.extract_cookies(wrsp, wreq)
@property
def _cookies(self):
return self.jar._cookies
def set_cookie(self, cookie):
self.jar.set_cookie(cookie)
可以看出scrapy的CookieJar类基本上是通过cookielib的CookieJar类来实现的相应功能。
获取cookies
将meta的cookie_jar设置为CookieJar对象,通过response.meta['cookie_jar']即可获得cookies的内容。
from scrapy.http.cookies import CookieJar
cookie_jar = CookieJar()
return [scrapy.FormRequest(url="http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)",
formdata=self.login_data,
meta = {'dont_merge_cookies': True, 'cookiejar': cookie_jar},#首次请求
callback=self.after_post)]
......
#之后的每次请求通过传递这个CookieJar对象
yield scrapy.Request(login_url, meta = {'dont_merge_cookies': True, 'cookiejar' : response.meta['cookiejar']}, callback=self.verify_login)
......
#登录成功后,得到要保存的cookies,为CookieJar对象
cookie_jar = response.meta['cookiejar']
cookie_jar.extract_cookies(response, response.request)
将cookies存储到文件
可以通过CookieJar._cookies方法将cookies转换为字典类型进行存储,也可以通过遍历的方式将各条cookies分别存储,为了后续解析的简单,我选择了遍历的方式:
with open(self.cookie_file, 'wb+') as f:
for cookie in cookie_jar:
f.write(str(cookie) + '\n')
这种方式相比直接存储为字典格式的方式而言,遍历后自动忽略了一部分cookies,数量相比后者有明显减少,但分析后发现,关于最后一次请求也就是登录成功时的请求的cookies都被保存了下来,没有被忽略,如果不放心,完全可以直接解析完整的字典类型的cookies。保存下来的cookies格式如:
<Cookie SRF=1456586813 for .passport.weibo.com/>
......
<Cookie SSOLoginState=1456586813 for .weibo.com/>
从文件加载cookies
通过FireFox分析微博登录成功时的请求返回的cookies以及这篇博客可知,用于登录的cookies的domain都是.weibo.com,那么可以通过正则表达式从文件中提取相关的cookies:
with open(self.cookie_file) as f:
cookiejar = f.read()
p = re.compile('\<Cookie (.*?) for .weibo.com\/\>')
cookies = re.findall(p, cookiejar)
cookies = (cookie.split('=') for cookie in cookies)
cookie_jar = dict(cookies)
这里之所以将读取的cookies转换为字典类型,是因为若要在scrapy的请求中手动添加cookies,需要使用scrapy.Request方法中的cookies参数。将从文件中加载的字典类型的cookie_jar赋值给cookies参数,可以实现直接登录微博:
yield scrapy.Request(url='http://weibo.com', cookies=cookie_jar, callback=self.logined)
scrapy cookies:将cookies保存到文件以及从文件加载cookies的更多相关文章
- scrapy加载cookies登陆
import scrapy from xxxx.items import XXXXItem from scrapy.http.request import Request class ZndsSpid ...
- Java将对象保存到文件中/从文件中读取对象
1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: public static void writeObjectToFile(Obje ...
- python之scrapy爬取数据保存到mysql数据库
1.创建工程 scrapy startproject tencent 2.创建项目 scrapy genspider mahuateng 3.既然保存到数据库,自然要安装pymsql pip inst ...
- php cUrl模拟登录,cookie保存到文件中
源码如下: <?php header("Content-Type:text/html;charset=utf-8"); //模拟群友通讯录手机号登录 $curl = curl ...
- php导出csv数据在浏览器中输出提供下载或保存到文件的示例
来源:http://www.jb51.net/article/49313.htm 1.在浏览器输出提供下载 /** * 导出数据到CSV文件 * @param array $data 数据 * @pa ...
- Python3操作MySQL,查询数据并保存到文件中
我们在测试过程中,可能需要到数据库中拉去一些数据,为从测试准备.比如最近在做接口性能测试的时候,就需要很多数据来支撑,所以就需要的数据库去查询数据,下面就是python3 查询 mysql 并且保存到 ...
- Object 保存到文件中
6月4日 Object 保存到文件中 Q. 你添加一个新类到你的项目当中且你希望可以保存这个类的一个实例对象到磁盘文件 并在需要时从磁盘文件读回到内存中 A. 方案 确保你的类遵循 NSCodi ...
- python pickle模块的使用/将python数据对象序列化保存到文件中
# Python 使用pickle/cPickle模块进行数据的序列化 """Python序列化的概念很简单.内存里面有一个数据结构, 你希望将它保存下来,重用,或者发送 ...
- Log 日志工具类 保存到文件 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- 让姑姑不再划拳 码农也要有原则 : SOLID via C#
“姑娘,别这样.我们是有原则的.” “一个有原则的程序猿是不会写出 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去.” “对,是时候和那些只会滚键盘的麻瓜不同了, ...
- 【组织级项目管理】P2 MSP P3O
组织级项目管理--有你,有我,有大家 在过去的2年,无论对于企业来讲,还是对于我们个人都有很多大脑的冲击,有几个词大家应该特别耳熟能详:转型,变革,敏捷,互联网+,组织的项目化管理等.就是这些让我们的 ...
- 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)
在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...
- 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型
前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.
- 简单分析JavaScript中的面向对象
初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...
- Android中AlarmManager使用示例(持续更新,已经更改)
现在普遍的手机都会有一个闹钟的功能,如果使用Android来实现一个闹钟可以使用AtarmManager来实现.AtarmManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个服 ...
- windows charles response 乱码解决办法
使用windows 版本的charles来做代理,发现服务端返回的response会出现中文乱码的情况, 查看软件设置,遗憾的是并没有关于编码的选项. 好在charles windows版本安装目录下 ...
- C 盘的不速之客
C 盘的报告内容既然上GB的空间 操作系统版本 原来是微软这个查找解决异常关闭解决方案生成的报告 参考 How To Disable Vista Error Reporting Feature ...
- 写个Fragment方便的抽象基类 BaseFragment
package com.zb.zhihuianyang.base; import android.app.Activity; import android.os.Bundle; import andr ...
- Spring Security OAuth2 开发指南
官方原文:http://projects.spring.io/spring-security-oauth/docs/oauth2.html 翻译及修改补充:Alex Liao. 转载请注明来源:htt ...