62

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

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

将所有 cookie 保存在文件中,然后从文件中恢复 cookie。

4

11 回答 11

89

没有直接的方法可以做到这一点,但这并不难。

您可以CookieJar从会话中获取对象session.cookies,并使用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()子类,它明确支持酸洗和类似字典的 API。该RequestsCookieJar.update()方法可用于使用从 pickle 文件加载的 cookie 更新现有会话 cookie jar。

于 2012-10-23T13:33:01.400 回答
35

在诸如r = requests.get(),之类的调用之后r.cookies会直接返回一个RequestsCookieJar你可以直接返回的pickle,即

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))

如果你想以人类可读的格式保存你的 cookie,你必须做一些工作来RequestsCookieJarLWPCookieJar.

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))
于 2013-05-31T14:07:11.123 回答
24

扩展@miracle2k 的答案, requestsSession记录为可以与任何cookielib 一起使用 CookieJarLWPCookieJar(and ) 可以在MozillaCookieJar文件中保存和加载他们的cookies。这是一个完整的代码片段,它将为请求会话保存和加载 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)
于 2014-09-15T23:50:49.380 回答
24

我通过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)
于 2016-12-21T03:17:35.230 回答
9

这将完成这项工作:

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

CookieJar API 要求您手动调用 load() 和 save()。如果您不关心 cookies.txt 格式,我有一个ShelvedCookieJar实现,它将在更改时持续存在。

于 2013-10-21T03:22:41.423 回答
9

我发现其他答案有问题:

  • 它们不适用于会话。
  • 他们没有正确保存和加载。只保存了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)加载。就那么简单。

于 2015-10-22T12:07:37.800 回答
4

您可以直接腌制 cookie 对象:

cookies = pickle.dumps(session.cookies)

dict 表示遗漏了很多信息:过期、域、路径……

这取决于您打算对 cookie 进行的使用,但如果您没有关于过期的信息,例如,您应该实现手动跟踪过期的逻辑。

酸洗库返回的对象可以让您轻松地重建状态,然后您可以中继库实现。

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

于 2017-04-16T19:28:45.363 回答
4

将 cookie 转换为字典列表并保存到 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)

我们只需要五个参数,例如:name, value, domain, path,expires

于 2018-10-26T14:04:29.633 回答
4

python 3的代码

请注意,Internet 上的绝大多数 cookie 都是 Netscape cookie。因此,如果您想以 Mozilla cookies.txt 文件格式(Lynx 和 Netscape 浏览器也使用该格式)将 cookie 保存到磁盘,请使用 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。保存的 cookie 可以稍后使用 load() 或 revert() 方法恢复。

请注意, save() 方法无论如何都不会保存会话 cookie,除非您通过传递一个真正的 ignore_discard 参数来另外询问。

s.cookies.save(ignore_discard=True)

使用加载方法:

从文件加载 cookie。

旧的 cookie 会被保留,除非被新加载的覆盖。

s.cookies.load()

使用还原方法:

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

s.cookies.revert()

您可能还需要在 load 或 revert 方法中传递一个真正的 ignore_discard 参数。

关于使用 MozillaCookieJar 的注意事项:

注意 这会丢失有关 RFC 2965 cookie 以及更新或非标准 cookie 属性(例如端口)的信息。

更多阅读

于 2019-02-25T20:07:19.907 回答
2

dtheodor 的回答有 95%,除了这个:

session = requests.session(cookies=cookies)

对我来说,这引发了一个异常,说 session() 不接受参数。

我通过获取 cookie.get_dict 上的键/值并将它们手动添加到会话中来解决它:

session.cookies.set(cookies.keys()[n],cookies.values()[n])
于 2015-05-25T15:00:53.403 回答
0

对于所有使用 Cookielib 的解决方案,在 Python 3.0 中将其更改为 http.cookiejar 请查找Python 3.2 won't import cookielib

于 2021-09-16T11:39:10.090 回答