我在使用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

metacookie_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的更多相关文章

  1. scrapy加载cookies登陆

    import scrapy from xxxx.items import XXXXItem from scrapy.http.request import Request class ZndsSpid ...

  2. Java将对象保存到文件中/从文件中读取对象

    1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: public static void writeObjectToFile(Obje ...

  3. python之scrapy爬取数据保存到mysql数据库

    1.创建工程 scrapy startproject tencent 2.创建项目 scrapy genspider mahuateng 3.既然保存到数据库,自然要安装pymsql pip inst ...

  4. php cUrl模拟登录,cookie保存到文件中

    源码如下: <?php header("Content-Type:text/html;charset=utf-8"); //模拟群友通讯录手机号登录 $curl = curl ...

  5. php导出csv数据在浏览器中输出提供下载或保存到文件的示例

    来源:http://www.jb51.net/article/49313.htm 1.在浏览器输出提供下载 /** * 导出数据到CSV文件 * @param array $data 数据 * @pa ...

  6. Python3操作MySQL,查询数据并保存到文件中

    我们在测试过程中,可能需要到数据库中拉去一些数据,为从测试准备.比如最近在做接口性能测试的时候,就需要很多数据来支撑,所以就需要的数据库去查询数据,下面就是python3 查询 mysql 并且保存到 ...

  7. Object 保存到文件中

    6月4日 Object 保存到文件中  Q. 你添加一个新类到你的项目当中且你希望可以保存这个类的一个实例对象到磁盘文件 并在需要时从磁盘文件读回到内存中  A. 方案  确保你的类遵循 NSCodi ...

  8. python pickle模块的使用/将python数据对象序列化保存到文件中

    # Python 使用pickle/cPickle模块进行数据的序列化 """Python序列化的概念很简单.内存里面有一个数据结构, 你希望将它保存下来,重用,或者发送 ...

  9. Log 日志工具类 保存到文件 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. BootStrap_02之全局样式及组件

    1.BootStrap指定的四种屏幕尺寸: ①超大PC屏幕--lg(large):w>=1200px: ②中等PC屏幕--md(medium):1200px>w>=992px: ③P ...

  2. html5标签canvas函数drawImage使用方法

    html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本.参数传递三种形式: drawImage(image,x,y):在 ...

  3. 在 C# 里使用 F# 的 option 变量

    在使用 C# 与 F# 混合编程的时候(通常是使用 C# 实现 GUI,F#负责数据处理),经常会遇到要判断一个 option 是 None 还是 Some.虽然 Option module 里有 i ...

  4. dotNet Core开发环境搭建及简要说明

    一.安装 .NET Core SDK 在 Windows 上使用 .NET Core 的最佳途径:使用Visual Studio. 免费下载地址: Visual Studio Community 20 ...

  5. Java程序:从命令行接收多个数字,求和并输出结果

    一.设计思想:由于命令行接收的是字符串类型,因此应先将字符串类型转化为整型或其他字符型,然后利用for循环求和并输出结果 二.程序流程图: 三.源程序代码:   //王荣荣 2016/9/23     ...

  6. Linux自动共享USB设备:udev+Samba

    一.概述 公司最近要我实现USB设备插入Ubuntu后,自动共享到网络上,能像Windows共享一样(如\\192.168.1.10)访问里面的内容,不需要写入权限.当时听完这需求,我这新人表示惊呆了 ...

  7. 解决Chrome 下载带半角分号出现net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION的问题

    方式一:添加双引号Response.AddHeader("content-disposition", "attachment; filename=\"" ...

  8. 关押罪犯 and 食物链(并查集)

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...

  9. Xamarin和微软发起.NET基金会

    新闻<微软宣布成立.NET基金会全面支持开源项目 包括C#编译器Roslyn>,看到大家对微软的开放都很兴奋.在此之前在.NET社区也有了大量的开源项目,所列的24个项目也是早就开源,这次 ...

  10. Mac 词典工具推荐:Youdao Alfred Workflow(可同步单词本)

    想必大家都有用过 Mac 下常见的几款词典工具: 特性 系统 Dictionary 欧路词典 Mac 版 有道词典 Mac 版 在线搜索 ✗ ✔ ✔ 屏幕取词 ☆☆☆ ★★☆ ★☆☆ 划词搜索 ★★★ ...