如何将请求(Python)Cookie保存到文件中



如何在请求之后使用库 requests(在python中)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
bot = requests.session()
bot.get('http://google.com')

将所有cookie保留在文件中,然后从文件中还原cookie。

没有立即的方法,但是它是不难做。

您可以从session.cookies的会话中获取CookieJar对象,然后使用pickle将其存储到文件中。

一个完整的示例:

import requests, pickle
session = requests.session()
# Make some calls
with open('somefile', 'wb') as f:
    pickle.dump(session.cookies, f)

加载是:

session = requests.session()  # or an existing session
with open('somefile', 'rb') as f:
    session.cookies.update(pickle.load(f))

requests库使用requests.cookies.RequestsCookieJar()子类,该子类明确支持腌制和类似于dict的API。RequestsCookieJar.update()方法可用于更新现有的会话cookie jar,并使用从腌制文件中加载的cookie。

呼叫之后,例如r = requests.get()r.cookies将返回您可以直接pickleRequestsCookieJar,即

import pickle
def save_cookies(requests_cookiejar, filename):
    with open(filename, 'wb') as f:
        pickle.dump(requests_cookiejar, f)
def load_cookies(filename):
    with open(filename, 'rb') as f:
        return pickle.load(f)
#save cookies
r = requests.get(url)
save_cookies(r.cookies, filename)
#load cookies and do a request
requests.get(url, cookies=load_cookies(filename))

如果要以人类可读格式保存饼干,则必须做一些工作才能将RequestsCookieJar提取到LWPCookieJar

import cookielib
def save_cookies_lwp(cookiejar, filename):
    lwp_cookiejar = cookielib.LWPCookieJar()
    for c in cookiejar:
        args = dict(vars(c).items())
        args['rest'] = args['_rest']
        del args['_rest']
        c = cookielib.Cookie(**args)
        lwp_cookiejar.set_cookie(c)
    lwp_cookiejar.save(filename, ignore_discard=True)
def load_cookies_from_lwp(filename):
    lwp_cookiejar = cookielib.LWPCookieJar()
    lwp_cookiejar.load(filename, ignore_discard=True)
    return lwp_cookiejar
#save human-readable
r = requests.get(url)
save_cookies_lwp(r.cookies, filename)
#you can pass a LWPCookieJar directly to requests
requests.get(url, cookies=load_cookies_from_lwp(filename))

我提供JSON的方式:

保存cookie-

import json
with open('cookie.txt', 'w') as f:
    json.dump(requests.utils.dict_from_cookiejar(bot.cookies), f)

和加载cookie-

import json
session = requests.session()  # or an existing session
with open('cookie.txt', 'r') as f:
    cookies = requests.utils.cookiejar_from_dict(json.load(f))
    session.cookies.update(cookies)

在 @miracle2k的答案上扩展,请求 Session s可以与任何cookielib CookieJar一起使用。LWPCookieJar(和MozillaCookieJar)可以保存并从文件中保存并加载其cookie。这是一个完整的代码段,可以为请求会话保存和加载cookie。ignore_discard参数用于与HTTPBIN一起进行测试,但您可能不想将其包含在真实的代码中。

import os
from cookielib import LWPCookieJar
import requests

s = requests.Session()
s.cookies = LWPCookieJar('cookiejar')
if not os.path.exists('cookiejar'):
    # Create a new cookies file and set our Session's cookies
    print('setting cookies')
    s.cookies.save()
    r = s.get('http://httpbin.org/cookies/set?k1=v1&k2=v2')
else:
    # Load saved cookies from the file and use them in a request
    print('loading saved cookies')
    s.cookies.load(ignore_discard=True)
    r = s.get('http://httpbin.org/cookies')
print(r.text)
# Save the session's cookies back to the file
s.cookies.save(ignore_discard=True)

我发现其他答案有问题:

  • 他们不适用于会议。
  • 他们没有正确保存和加载。只保存了cookie名称和值,到期日期,域名等都丢失了。

此答案解决了这两个问题:

import requests.cookies
def 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

然后只需致电save_cookies(session, filename)保存或load_cookies(session, filename)加载即可。很简单。

这将完成工作:

session.cookies = LWPCookieJar('cookies.txt')

cookiejar api需要您调用load()并手动保存()。如果您不关心cookies.txt格式,我将有一个shedvedcookiejar实现,它将坚持更改。

python 3

请注意,Internet上绝大多数Cookie都是Netscape Cookie。因此,如果您想将cookie保存到mozilla cookies.txt文件格式(也是由lynx和Netscape浏览器使用的),请使用mozillacookiejar

from http.cookiejar import MozillaCookieJar
import requests
s = requests.Session()
s.cookies = MozillaCookieJar('cookies.txt')
# or s.cookies = MozillaCookieJar() and later use s.cookies.filename = 'cookies.txt' or pass the file name to save method.
response = s.get('https://www.msn.com')
s.cookies.save()

如果文件已经存在,则该文件将被覆盖,从而擦除其包含的所有cookie。稍后可以使用load()或还原()方法来恢复保存的cookie。

请注意,save()方法无论如何都不会保存会话cookie,除非 您通过通过一个真正的imagore_discard参数来提出其他要求。

s.cookies.save(ignore_discard=True)

使用加载方法:

从文件加载cookie。

旧饼干保留,除非被新装载的饼干覆盖。

s.cookies.load()

使用还原方法:

从保存的文件中清除所有cookie和重新加载cookie。

s.cookies.revert()

您可能还需要在加载或恢复方法中传递真正的ignore_discard参数。

关于使用Mozillacookiejar的注意:

请注意,这将失去有关RFC 2965 Cookie的信息,也丢失有关RFC 2965 Cookie的信息 较新的或非标准的cookie-atributes,例如端口。

更多阅读

您可以直接腌制cookie对象:

cookies = pickle.dumps(session.cookies)

dict代表错过了很多信息:到期,域,路径...

这取决于您打算使用cookie的用法,但是如果您没有有关到期的信息,则应实现逻辑以通过手动跟踪到期。

腌制库返回的对象使您可以轻松地重建状态,然后您可以在库实现上中继。

显然,这样,腌制对象的消费者需要使用相同的库

将cookie转换为dicts列表并保存的简单方法到JSON或DB。这是具有session属性的类的方法。

def dump_cookies(self):
    cookies = []
    for c in self.session.cookies:
        cookies.append({
            "name": c.name,
            "value": c.value,
            "domain": c.domain,
            "path": c.path,
            "expires": c.expires
        })
    return cookies
def load_cookies(self, cookies):
    for c in cookies:
        self.session.cookies.set(**c)

我们只需要五个参数,例如:namevaluedomainpathexpires

<ptheodor的答案在那里获得了95%的答案,除此之外>

session = requests.session(cookies=cookies)

对我而言,这引起了一个例外,说session()不接受争论。

我通过在cookie.get_dict上获取键/值并使用:

手动将它们添加到会话中,从而围绕它进行了工作。
session.cookies.set(cookies.keys()[n],cookies.values()[n])

对于使用cookielib的所有解决方案,在python 3.0中,它已更改为http.cookiejar请查找Python 3.2不会导入Cookielib

受 @miracle2k答案的启发,我实现了jaraco.net.http.cookies.shelvedcookiejar。我开始使用相同的shelve.Shelf返回的商店,但后来发现该接口是不足的便携式和可检查的,因此我创建了由JSONPICKLE支持的定制Shelf类。这种方法具有良好的可移植性和并发行为,但也具有透明度(可以检查文件名,cookie文件是人体,机器可读)。用法在微不足道上很简单:

from jaraco.net.http.cookies import ShelvedCookieJar
session = requests.Session()
session.cookies = ShelvedCookieJar.create()

此后,cookie持续存在于./cookies.json中。没有何时持续价值的手动管理。没有手动打开文件。只需创建和使用。

最新更新