How to save requests (python) cookies to a file?
Solution 1:
There is no immediate way to do so, but it's not hard to do.
You can get a CookieJar
object from the session with session.cookies
, and use pickle
to store it to a file.
A full example:
import requests, pickle
session = requests.session()
# Make some calls
with open('somefile', 'wb') as f:
pickle.dump(session.cookies, f)
Loading is then:
session = requests.session() # or an existing session
with open('somefile', 'rb') as f:
session.cookies.update(pickle.load(f))
The requests
library uses the requests.cookies.RequestsCookieJar()
subclass, which explicitly supports pickling and a dict-like API. The RequestsCookieJar.update()
method can be used to update an existing session cookie jar with the cookies loaded from the pickle file.
Solution 2:
After a call such as r = requests.get()
, r.cookies
will return a RequestsCookieJar
which you can directly pickle
, i.e.
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))
If you want to save your cookies in human-readable format, you have to do some work to extract the RequestsCookieJar
to a 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))
Solution 3:
Expanding on @miracle2k's answer, requests Session
s are documented to work with any cookielib CookieJar
. The LWPCookieJar
(and MozillaCookieJar
) can save and load their cookies to and from a file. Here is a complete code snippet which will save and load cookies for a requests session. The ignore_discard
parameter is used to work with httpbin for the test, but you may not want to include it your in real code.
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)
Solution 4:
I offer a way by json:
to save cookie -
import json
with open('cookie.txt', 'w') as f:
json.dump(requests.utils.dict_from_cookiejar(bot.cookies), f)
and to load 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)