将`Cookie`放在`CookieJar`中

Ram*_*hum 38 python cookies http-request python-requests

我正在使用新的Python Requests库来发出http请求.我从服务器获取cookie作为文本.如何将其变成CookieJar带有cookie的a ?

小智 47

我对这个问题很困惑.请求库会将cookie放入jar中.

import requests
import cookielib


URL = '...whatever...'
jar = cookielib.CookieJar()
r = requests.get(URL, cookies=jar)
r = requests.get(URL, cookies=jar)
Run Code Online (Sandbox Code Playgroud)

对URL的第一个请求将填充jar.第二个请求将cookie发送回服务器.标准库的urllib模块cookielib也是如此.(doc目前可用于2.x版本)

  • 只想指出"import cookielib"仅在2.X下有效 - 在3.X中,它是"import http.cookiejar". (6认同)
  • 这对我不起作用,所以我问了一个[类似的问题](http://stackoverflow.com/questions/21736970/using-requests-module-how-to-handle-set-cookie-in-request-response #21737086)澄清. (3认同)
  • 我无法让这段代码工作。即使向每个请求传递一个 cookie jar 也没有保留我的 cookie,但是在评论中列出的“requests.Session”和进一步向下工作完美。 (3认同)
  • 刚刚推出了一个新版本(v0.6.0),允许您使用简单的字典将cookie附加到请求中.http://docs.python-requests.org/en/latest/user/quickstart/#cookies (2认同)
  • 请注意,如果您使用`requests.Session`对象,则不需要**.它会完全为你处理饼干罐. (2认同)
  • 对于最新版本(v2.18.4),这对我来说**不起作用**。这有效:/sf/answers/3353949161/(不使用“Session”)。但我想“Session”是正确的选择。 (2认同)
  • 这个答案不再适用于 2012 年发布的 Requests 1.0.0。我已经[确认](https://github.com/psf/requests/issues/6117)它适用于 Python 2.7.13 和 Requests 0.14.2 (2认同)

ove*_*ink 26

请求Session还将接收和发送cookie.

s = requests.Session()

s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")

print(r.text)
# '{"cookies": {"sessioncookie": "123456789"}}'
Run Code Online (Sandbox Code Playgroud)

(以上代码来自http://www.python-requests.org/en/latest/user/advanced/#session-objects)

如果您希望cookie在代码运行之间保留在磁盘上,您可以直接使用cookie jar并保存/加载它们.更麻烦,但仍然很容易:

import requests
import cookielib

cookie_file = '/tmp/cookies'
cj = cookielib.LWPCookieJar(cookie_file)

# Load existing cookies (file might not yet exist)
try:
    cj.load()
except:
    pass

s = requests.Session()
s.cookies = cj

s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")

# Save cookies to disk, even session cookies
cj.save(ignore_discard=True)
Run Code Online (Sandbox Code Playgroud)

然后查看文件:

$ cat /tmp/cookies 
#LWP-Cookies-2.0
Set-Cookie3: sessioncookie=123456789; path="/"; domain="httpbin.org"; path_spec; discard; version=0
Run Code Online (Sandbox Code Playgroud)

  • 我真的希望这被投票到顶部.所选的最佳答案对于请求-2.3.0完全不起作用 (2认同)

Dan*_*nny 10

我认为这些答案中的许多都没有抓住要点。有时,其他库并没有在后台使用请求。或者不公开它正在使用的 cookiejar。有时我们所拥有的只是 cookie 字符串。就我而言,我试图从 pyVmomi 借用 auth cookie。

import requests
import http.cookies
raw_cookie_line = 'foo="a secret value"; Path=/; HttpOnly; Secure; '
simple_cookie = http.cookies.SimpleCookie(raw_cookie_line)
cookie_jar = requests.cookies.RequestsCookieJar()
cookie_jar.update(simple_cookie)
Run Code Online (Sandbox Code Playgroud)

这给了我们以下内容cookie_jar

In [5]: cookie_jar
Out[5]: <RequestsCookieJar[Cookie(version=0, name='foo', value='a secret value', port=None, port_specified=False, domain='', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=True, expires=None, discard=False, comment='', comment_url=False, rest={'HttpOnly': True}, rfc2109=False)]>
Run Code Online (Sandbox Code Playgroud)

我们可以正常使用:

requests.get(..., cookies=cookie_jar)
Run Code Online (Sandbox Code Playgroud)


Sna*_*fee 5

为了帮助您,我编写了整个模块。我用我的个人网页和Google的Cookie进行了尝试,因此我认为它可以工作。

我从如何在Python中将cookie添加到现有cookielib CookieJar实例中得到帮助

我在这里有很多非Python的代码,包括半混音,因此您的工作量可能会有所不同。根据需要进行调整,特别是对于假定的项(例如端口80),“ request”作为以下参数的类型为request.request,我意识到“ method”参数必须全为大写。希望我能帮上忙!

注意:我没有时间添加评论以进行澄清,因此您必须使用源。

import Cookie,cookielib,requests,datetime,time  #had this out but realized later I needed it when I continued testing

def time_to_tuple(time_string):
    wday = {'Mon':0,'Tue':1,'Wed':2,'Thu':3,'Fri':4,'Sat':5,'Sun':6}
    mon = {'Jan':1,'Feb':2,'Mar':3,'Apr':4,'May':5,'Jun':6,'Jul':7,'Aug':8,'Sep':9,'Oct':10,'Nov':11,'Dec':12}
    info = time_string.split(' ')
    info = [i.strip() for i in info if type(i)==str]
    month = None
    for i in info:
        if '-' in i:
            tmp = i.split('-')
            for m in tmp:
                try:
                    tmp2 = int(m)
                    if tmp2<31:
                        mday = tmp2
                    elif tmp2 > 2000:
                        year = tmp2
                except:
                    for key in mon:
                        if m.lower() in key.lower():
                            month = mon[key]
        elif ':' in i:
            tmp = i.split(':')
            if len(tmp)==2:
                hour = int(tmp[0])
                minute = int(tmp[1])
            if len(tmp)==3:
                hour = int(tmp[0])
                minute = int(tmp[1])
                second = int(tmp[2])
        else:
            for item in wday:
                if ((i.lower() in item.lower()) or (item.lower() in i.lower())):
                    day = wday[item]
            if month is None:
                for item in mon:
                    if ((i.lower() in item.lower()) or (item.lower() in i.lower())):
                        month = mon[item]
    return year,month,mday,hour,minute,second

def timefrom(year,month,mday,hour,minute,second):
    time_now = time.gmtime()
    datetime_now = datetime.datetime(time_now.tm_year,time_now.tm_mon,
                                     time_now.tm_mday,time_now.tm_hour,
                                     time_now.tm_min,time_now.tm_sec)
    then = datetime.datetime(year,month,mday,hour,minute,second)
    return (datetime_now-then).total_seconds()

def timeto(year,month,mday,hour,minute,second):
    return -1*timefrom(year,month,mday,hour,minute,second)



##['comment', 'domain', 'secure', 'expires', 'max-age', 'version', 'path', 'httponly']
def parse_request(request):
    headers = request.headers
    cookieinfo = headers['set-cookie'].split(';')
    name = 'Undefined'
    port=80
    port_specified=True
    c = Cookie.SmartCookie(headers['set-cookie'])
    cj = cookielib.CookieJar()
    for m in c.values():
        value = m.coded_value
        domain = m['domain']
        expires = m['expires']
        if type(expires) == str:
            tmp = time_to_tuple(expires)
            expires = timeto(tmp[0],tmp[1],tmp[2],tmp[3],tmp[4],tmp[5])
        max_age=m['max-age']
        version = m['version']
        if version == '':
            version = 0
        path = m['path']
        httponly = m['httponly']
        if httponly == '':
            if 'httponly' in headers['set-cookie'].lower():
                httponly = True
        else:
            httponly = False
        secure = m['secure']
        comment=m['comment']
        port = 80
        port_specified=False
        domain_specified=True
        domain_initial_dot = domain.startswith('.')
        path_specified=True
        discard = True
        comment_url=None
        rest={'HttpOnly':httponly}
        rfc2109=False
        ck = cookielib.Cookie(version,name,value,port,port_specified,domain,
                              domain_specified,domain_initial_dot,path,path_specified,
                              secure,expires,discard,comment,comment_url,rest,rfc2109)
        cj.set_cookie(ck)
    return cj
Run Code Online (Sandbox Code Playgroud)