如何在请求之后使用库 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
将返回您可以直接pickle
的RequestsCookieJar
,即
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)
我们只需要五个参数,例如:name
,value
,domain
,path
,expires
<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
中。没有何时持续价值的手动管理。没有手动打开文件。只需创建和使用。