• Cookie保存在本地方法介绍


    方法一:

    结合cookielib及urllib2,Python2时期比较常用的方法,年代比较久远了。个人觉得太麻烦,改用requests.

    ▲需要注意的是cookielib在python3中已经改成了http.cookiejar

    保存cookie
    import urllib2
    import cookielib
    
    #将cookie保存在文件中
    def saveCookie():
        #设置保存cookie的文件
        filename = 'cookie.txt'
        #声明一个MozillaCookieJar对象来保存cookie,之后写入文件
        cookie = cookielib.MozillaCookieJar(filename)
        #创建cookie处理器
        handler = urllib2.HTTPCookieProcessor(cookie)
        #构建opener
        opener = urllib2.build_opener(handler)
        #创建请求
        res = opener.open('http://www.baidu.com')
        #保存cookie到文件
        #ignore_discard的意思是即使cookies将被丢弃也将它保存下来
        #ignore_expires的意思是如果在该文件中cookies已经存在,则覆盖原文件写入
        cookie.save(ignore_discard=True,ignore_expires=True)
    
    读取cookie
        #从文件中获取cookie并且访问(我们通过这个方法就可以打开保存在本地的cookie来模拟登录)
    def getCookie():
            #创建一个MozillaCookieJar对象
            cookie = cookielib.MozillaCookieJar()
            #从文件中的读取cookie内容到变量
            cookie.load('cookie.txt',ignore_discard=True,ignore_expires=True)
            #打印cookie内容,证明获取cookie成功
            for item in cookie:
                print 'name:' + item.name + '-value:' + item.value
            #利用获取到的cookie创建一个opener
            handler = urllib2.HTTPCookieProcessor(cookie)
            opener = urllib2.build_opener(handler)
            res = opener.open('http://www.baidu.com')
            print res.read()
    

    方法二:

    使用requests.cookie

    读取cookies

    在这里我用的是LWPCookieJar保存在txt文件中,还有个是MozillaCookieJar,都是由FileCookieJar 派生而来,实现了save()方法,而FileCookieJar 没有实现save()

    • MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
    • LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。
    #实例化一个LWPCookieJar对象
    load_cookiejar = cookielib.LWPCookieJar()
    #从文件中加载cookies(LWP格式)
        
    load_cookiejar.load('cookies.txt', ignore_discard=True, ignore_expires=True)
    #工具方法转换成字典
    load_cookies = requests.utils.dict_from_cookiejar(load_cookiejar)
    #工具方法将字典转换成RequestsCookieJar,赋值给session的cookies.
    session.cookies = requests.utils.cookiejar_from_dict(load_cookies)
    
    存储cookies

    将cookies转换成LWP格式然后保存为文本格式

    #实例化一个LWPcookiejar对象
    new_cookie_jar = cookielib.LWPCookieJar('cookie.txt')
    
    #将转换成字典格式的RequestsCookieJar(这里我用字典推导手动转的)保存到LWPcookiejar中
    ===>RequestsCookieJar没有实现save()方法
    requests.utils.cookiejar_from_dict({c.name: c.value for c in self.session.cookies}, new_cookie_jar)
    
    #保存到本地文件
    new_cookie_jar.save('cookies.txt', ignore_discard=True, ignore_expires=True)
    


    方法三:

    将cookie字典弄成字典形式然后pickle或者json写入文件中

    存储cookie
    import requests,json,pprint
    s = requests.session()
    s.headers = {...}
    a = s.get("https://www.baidu.com")
    cookies = requests.utils.dict_from_cookiejar(s.cookies)
    with open(".\cook.txt", "w") as fp:
        json.dump(cookies, fp)
    pprint.pprint(cookies,width=5)
    
    读取cookie
    with open(".cook.txt", "w") as fp:
        load_cookies=son.load(fp)
    session.cookie = requests.utils.cookiejar_from_dict(load_cookies)
    

    方法四:

    将requests.cookie设置为LWPCookieJar、或MozillaCookieJar保存

    session = requests.Session()
    #创建个 LWPCookieJar对象
    session.cookies = LWPCookieJar(filename='cook.txt')
    s.get('https://www.baidu.com/',headers=headers)
    session.cookies.save(ignore_discard=True, ignore_expires=True)
    #如果save()时没有写filename参数,则默认为实例化LWPCookieJar时给的文件名
    


    save()方法的两个重要参数

    • ignore_discard: save even cookies set to be discarded.
    • ignore_expires: save even cookies that have expired.The file is overwritten if it already exists

    ignore_discard的意思是即使cookies将被丢弃也将它保存下来,ignore_expires的意思是如果cookies已经过期也将它保存并且文件已存在时将覆盖

    总结方法二和方法三可以看出,就是要将cookie转换成然后save()


    简单介绍下cookielib模块作用,科普下实现cookie知识

    python3中将cookielib模块改为了http.cookiejar
    cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源。例如可以利用本模块 的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送。coiokielib模块用到的对象主要有下面几个:CookieJar、 FileCookieJar、MozillaCookieJar、LWPCookieJar。其中他们的关系如下:

  • 相关阅读:
    简单 android popupwindow 实现
    Android json 数据解析
    java 重载父类报错 Remove '@override' annotation解决办法
    Android数据的四种存储方式
    Java将Unix时间戳转换成指定格式日期
    Android中MenuInflater实例
    技术转载:Jni学习四:如何编写jni方法
    android NDk环境编译总结
    Android JNI学习之javah命令的正确使用(找了好半天才找到的,汉,网上好多说法都没用)
    android项目中如何加载已有so库 <转>
  • 原文地址:https://www.cnblogs.com/nymrli/p/9535075.html
Copyright © 2020-2023  润新知