我需要编写一个Python脚本,向同一站点发出多个HTTP请求。除非我理解有误(也有可能),urllib会为每个请求重新认证。由于某些原因,我需要能够认证一次,然后在接下来的请求中使用该会话。我正在使用Python 2.3.4版本。
使用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"}}'
如果你想要保持认证,你需要重复使用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)
如果这是基于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')
...并为每个请求使用相同的打开器。
在Python3中,urllib2和cookielib被移动到http.request和http.cookiejar。