【发布时间】:2011-08-02 03:23:51
【问题描述】:
我需要从服务器发送的 HTTP 响应中获取 cookie,并将其放入下一个请求的标头中。我该怎么做?
提前致谢。
【问题讨论】:
标签: python cookies http-headers
我需要从服务器发送的 HTTP 响应中获取 cookie,并将其放入下一个请求的标头中。我该怎么做?
提前致谢。
【问题讨论】:
标签: python cookies http-headers
您应该将 cookielib module 与 urllib 一起使用。
它将在请求之间存储 cookie,您可以在磁盘上加载/保存它们。这是一个例子:
import cookielib
import urllib2
cookies = cookielib.LWPCookieJar()
handlers = [
urllib2.HTTPHandler(),
urllib2.HTTPSHandler(),
urllib2.HTTPCookieProcessor(cookies)
]
opener = urllib2.build_opener(*handlers)
def fetch(uri):
req = urllib2.Request(uri)
return opener.open(req)
def dump():
for cookie in cookies:
print cookie.name, cookie.value
uri = 'http://www.google.com/'
res = fetch(uri)
dump()
res = fetch(uri)
dump()
# save cookies to disk. you can load them with cookies.load() as well.
cookies.save('mycookies.txt')
请注意,NID 和 PREF 的值在请求之间是相同的。如果您省略了HTTPCookieProcessor,这些将有所不同(urllib2 不会在第二次请求中发送Cookie 标头)。
【讨论】:
查看 urllib 模块:
(对于 Python 3.1,在 Python 2 中,请改用 urllib2.urlopen) 检索 cookie:
>>> import urllib.request
>>> d = urllib.request.urlopen("http://www.google.co.uk")
>>> d.getheader('Set-Cookie')
'PREF=ID=a45c444aa509cd98:FF=0:TM=14.....'
对于发送,只需发送带有请求的 Cookie 标头。像这样:
r=urllib.request.Request("http://www.example.com/",headers={'Cookie':"session_id=1231245546"})
urllib.request.urlopen(r)
编辑:
“http.cookie”(Python 2 的“Cookie”)可能更适合您:
【讨论】:
d.info()['Set-Cookie']。
d.getheader('Set-Cookie')(在 3.4.1 中测试)。
你可以在 Python 2.7 中使用
url="http://google.com"
request = urllib2.Request(url)
sock=urllib2.urlopen(request)
cookies=sock.info()['Set-Cookie']
content=sock.read()
sock.close()
print (cookies, content)
当发回请求时
def sendResponse(cookies):
import urllib
request = urllib2.Request("http://google.com")
request.add_header("Cookie", cookies)
request.add_data(urllib.urlencode([('arg1','val1'),('arg1','val1')]))
opener=urllib2
opener=urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1))
sock=opener.open(request)
content=sock.read()
sock.close()
print len(content)
【讨论】:
目前的答案是使用 Requests 模块和 requests.Session 对象。
您可能需要先pip install requests 或pipenv install requests。
【讨论】: