西部数码主机 | 阿里云主机| 虚拟主机 | 服务器 | 返回乐道官网
当前位置: 主页 > 开发教程 > python教程 >

scrapy cookies:将cookies保存到文件以及从文件加载cookies

时间:2016-02-28 17:25来源:未知 作者:好模板 点击:
在使用scrapy模拟登录新浪微博时,想将登录成功后的cookies保存到本地,下次加载它实现直接登录,省去中间一系列的请求和POST等。关于如何从本次请求中获取并在下次请求中附带上c

在使用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存储到文件

可以通过 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)
(责任编辑:好模板)
顶一下
(1)
12.5%
踩一下
(7)
87.5%
------分隔线----------------------------
栏目列表
热点内容