使用Python请求库获取包含cookie的页面

时间:2013-09-29 06:50:45

标签: python cookies python-requests

我正在研究请求库(http://docs.python-requests.org/en/latest/), 并且遇到了如何使用请求获取带有cookie的页面的问题。

例如:

url2= 'https://passport.baidu.com'
parsedCookies={'PTOKEN': '412f...', 'BDUSS': 'hnN2...', ...} #Sorry that the cookies value is replaced by ... for instance of privacy
req = requests.get(url2, cookies=parsedCookies)
text=req.text.encode('utf-8','ignore')
f=open('before.html','w')
f.write(text)
f.close()
req.close()

当我使用上面的代码获取页面时,它只是将登录页面保存到'before.html'而不是登录页面,它指的是实际上我还没有成功登录。

但是如果我使用URLlib2来获取页面,它会按预期正常工作。

parsedCookies="PTOKEN=412f...;BDUSS=hnN2...;..." #Different format but same content with the aboved cookies
req = urllib2.Request(url2)
req.add_header('Cookie', parsedCookies)
ret = urllib2.urlopen(req)
f=open('before_urllib2.html','w')
f.write(ret.read())
f.close()
ret.close()

当我使用这些代码时,它会将登录的页面保存在before_urllib2.html

-

我的代码有错误吗? 任何回复都会很感激。

1 个答案:

答案 0 :(得分:2)

您可以使用Session对象来获得您想要的内容:

url2='http://passport.baidu.com'
session = requests.Session()  # create a Session object 
cookie = requests.utils.cookiejar_from_dict(parsedCookies) 
session.cookies.update(cookie) # set the cookies of the Session object

req = session.get(url2, headers=headers,allow_redirects=True)

如果您使用requests.get函数,则不会为重定向页面发送Cookie。相反,如果您使用Session()。get函数,它将维护并发送所有http请求的cookie,这就是“会话”的概念的确切含义。

让我试着详细说明这里发生的事情:

当我向http://passport.baidu.com/center发送Cookie并将参数allow_redirects设置为false时,返回的状态代码为302,响应的标题之一为“location”:'/ center?_t = 1380462657'(此是服务器生成的动态值,您可以将其替换为从服务器获取的值:

url2= 'http://passport.baidu.com/center'
req = requests.get(url2, cookies=parsedCookies, allow_redirects=False)
print req.status_code # output 302
print req.headers

但是当我将参数allow_redirects设置为True时,它仍然没有重定向到页面(http://passport.baidu.com/center?_t=1380462657),服务器返回登录页面。原因是requests.get不会为重定向页面发送cookie,这里是http://passport.baidu.com/center?_t=1380462657,因此我们可以成功登录。这就是我们需要Session对象的原因。

如果我设置url2 = http://passport.baidu.com/center?_t=1380462657,它将返回您想要的页面。一种解决方案是使用上面的代码来获取动态位置值并形成http://passport.baidu.com/center?_t=1380462657之类帐户的路径,然后您就可以获得所需的页面。

url2= 'http://passport.baidu.com' + req.headers.get('location')
req = session.get(url2, cookies=parsedCookies, allow_redirects=True )

但这很麻烦,所以在处理cookies时,Session对象对我们来说非常好!