请求后如何使用库requests
(在python中)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
bot = requests.session()
bot.get('http://google.com')
将所有 cookie 保存在文件中,然后从文件中恢复 cookie。
请求后如何使用库requests
(在python中)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
bot = requests.session()
bot.get('http://google.com')
将所有 cookie 保存在文件中,然后从文件中恢复 cookie。
没有直接的方法可以做到这一点,但这并不难。
您可以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。
在诸如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,你必须做一些工作来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))
扩展@miracle2k 的答案, requestsSession
被记录为可以与任何cookielib 一起使用 CookieJar
。LWPCookieJar
(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)
我通过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)
这将完成这项工作:
session.cookies = LWPCookieJar('cookies.txt')
CookieJar API 要求您手动调用 load() 和 save()。如果您不关心 cookies.txt 格式,我有一个ShelvedCookieJar实现,它将在更改时持续存在。
我发现其他答案有问题:
这个答案解决了这两个问题:
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)
加载。就那么简单。
您可以直接腌制 cookie 对象:
cookies = pickle.dumps(session.cookies)
dict 表示遗漏了很多信息:过期、域、路径……
这取决于您打算对 cookie 进行的使用,但如果您没有关于过期的信息,例如,您应该实现手动跟踪过期的逻辑。
酸洗库返回的对象可以让您轻松地重建状态,然后您可以中继库实现。
显然,这样一来,腌制对象的消费者需要使用同一个库
将 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
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 属性(例如端口)的信息。
dtheodor 的回答有 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 won't import cookielib