在进行HTTP请求时保持Python会话

27
我需要编写一个Python脚本,向同一站点发出多个HTTP请求。除非我理解有误(也有可能),urllib会为每个请求重新认证。由于某些原因,我需要能够认证一次,然后在接下来的请求中使用该会话。我正在使用Python 2.3.4版本。

认证由站点驱动。如果他们要求认证(通过401响应),您的客户端可以提供它。您有时可以预先处理此问题。这取决于站点对Nonce的使用。 - S.Lott
3个回答

29

使用Requests库。从http://docs.python-requests.org/en/latest/user/advanced/#session-objects了解到:

Session对象让你可以在请求之间保留一些参数,同时也会在该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"}}'

requests存在严重的内存泄漏问题:https://github.com/requests/requests/issues/4601 - ospider

26

如果你想要保持认证,你需要重复使用cookie。我不确定在Python 2.3.4中是否可用urllib2,但是这里有一个示例:

req1 = urllib2.Request(url1)
response = urllib2.urlopen(req1)
cookie = response.headers.get('Set-Cookie')

# Use the cookie is subsequent requests
req2 = urllib2.Request(url2)
req2.add_header('cookie', cookie)
response = urllib2.urlopen(req2)

Python 2.3.4确实有urllib2。谢谢。 - Hector Scout
2
这并不像你所展示的那样简单。请参阅RFC 6265,第5.4节“Cookie头”,当您找到此语句用户代理程序必须使用等效于以下算法的算法,从cookie存储和请求URI计算“cookie-string”:使用以下算法。 - Piotr Dobrogost

16

Python 2

如果这是基于cookie的身份验证,请使用 HTTPCookieProcessor

import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

如果这是HTTP身份验证,请使用基本的或摘要的AuthHandler

import urllib2
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='https://mahler:8092/site-updates.py',
                          user='klem',
                          passwd='kadidd!ehopper')
opener = urllib2.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib2.install_opener(opener)
urllib2.urlopen('http://www.example.com/login.html')

...并为每个请求使用相同的打开器。

Python 3

在Python3中,urllib2和cookielib被移动到http.requesthttp.cookiejar


我们可以同时管理会话和基本身份验证吗?例如使用更多的处理程序,即:opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), auth_handler) ?? - Fabiano Tarlao
1
@FabianoTarlao 当然可以。这就是Python的urllib的美妙之处 :-) - lispmachine
谢谢,我本来要更新我的评论,但你比我更快——我已经成功尝试过了,而且非常好用。 - Fabiano Tarlao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接