我正在研究请求库(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
。
-
我的代码有错误吗? 任何回复都会很感激。
答案 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对象对我们来说非常好!