Python 关于爬虫过程中 使用pickle 保持cookies到本地 以及读取的简单方法

来源:互联网 发布:数据泄密如何防止拍照 编辑:程序博客网 时间:2024/05/22 13:28

在写Pixiv爬虫的后面 想要进行功能完善的时候,想到平时浏览器可以通过保存的cookies进行登陆,不需要每次都输入密码,便也想给自己的爬虫加上这个功能。

一开始尝试的是

直接使用 基本的write函数 将Session().cookies保存到本地 然后通过read函数进行读取并赋值

开始试的时候就发现 还是想的太简单了 。write函数只能写入str类型,无法直接写入cookies这种 (伪)dict类型

后来 搜素了下write函数 写入dict类型的方法 发现无非就是 遍历键及其键值 ,然后将字符串存入,最后读取字符串的时候再还原成字典,并对cookies进行复制。

我用这种方法试了下,发现P站还是无法登陆,进过进一步搜索 发现 cookies是一种伪字典类型,即虽然它可以通过字典类型进行输入以及复制,但他并不是dict类型。

若强行转换,则可能丢失时间戳以及domain等数据,导致部分网站的cookies失效(如果我的理解错了,欢迎指正

无奈最后再次搜索保存cookies到本地并读取的方法,发现网上的大部分都是通过dict进行保存的。一些则是通过python2版本的urlib库相关。更是有好多相同的照搬的文章。

还有一些用的是cookiesjar的函数。我试着照搬轮子运行,发现doomain等数据任然没保存下来(或许我的步骤还是错了,没有来得及通读cookielib的文档

最后尝试性的用谷歌浏览器用英文搜索了一番 ' requests how to save cookies to' ,最后在stackoverflow发现了这个问题,并且许多大佬给出了解决方案

l链接:Stackoverflow

方法一

import requests.cookiesdef save_cookies(session, filename):    if not os.path.isdir(os.path.dirname(filename)):        return False    with open(filename, 'w') as f:        f.truncate()        pickle.dump(session.cookies._cookies, f)def load_cookies(session, filename):    if not os.path.isfile(filename):        return False    with open(filename) as f:        cookies = pickle.load(f)        if cookies:            jar = requests.cookies.RequestsCookieJar()            jar._cookies = cookies            session.cookies = jar        else:            return False

主要运用python自带的pickle功能块, 保存和读取的时候只需要分别调用 save_cookies和load_cookies函数就好了


方法二

A full example :

import requests, requests.utils, picklesession = requests.session()# Make some callswith open('somefile', 'w') as f:    pickle.dump(requests.utils.dict_from_cookiejar(session.cookies), f)

Loading is then :

with open('somefile') as f:    cookies = requests.utils.cookiejar_from_dict(pickle.load(f))    session = requests.session(cookies=cookies)

本质上也是对Pickle功能块的运用

Pickle官方文档


pickle与writle相比最大的差别就是pickle是序列化存储以及读取的,即 不管是python中的什么数据结构,都直接原样打包保存,读取的时候再原样读取。这样 可以避免丢失cookies中至关重要的时间戳和domain等数据

最后我使用 方法一 成功得 保存且利用读取的cookies登陆pixiv

谷歌大法好 遇上不会的完全可以先上stackoverflow搜索


阅读全文
0 0
原创粉丝点击