我正在尝试使用python请求模块执行登录。我首先使用我的用户名和密码发布到登录页面,以保存响应中的cookie。之后我尝试进入受密码保护的页面。问题是响应页面说我必须激活cookie才能登录到这个页面,但是我得到了一个我可以显示的Cookie。 这是代码
从登录页面输入参数:
<input type="hidden" name="security_token" value="kAvcFvod9KSrGLS1JX30+dhNI8QhmVpbqbe00zuvztE=">
<input type="hidden" name="login_ticket" value="3781fe1e16e441e9957bec8b32aa4630">
<input type="hidden" name="resolution" value="">
<input type="hidden" name="device_pixel_ratio" value="1">
和
<input type="text" autofocus id="loginname" name="loginname" value="" size="20" maxlength="63">
<input type="password" id="password" name="password" size="20">
Python代码:
import requests
login = r'LOGIN_URL'
url = 'PROTECTED_URL'
values = {'loginname': 'USERNAME', 'password': r'PASSWORD','security_token' : r'kAvcFvod9KSrGLS1JX30+dhNI8QhmVpbqbe00zuvztE=', 'login_ticket' : r'3781fe1e16e441e9957bec8b32aa4630', 'resolution' : '', 'device_pixel_ratio' : '1'}
session = requests.Session()
r = session.post(login, data = values)
print r.content
print r.cookies
s = session.get(url)
(之前我从另一个get请求中获取安全令牌和登录票证) 因此,r.content打印出一个网页,主要说:登录不成功,因为Cookies没有被激活。
但是r.cookies的输出是:
<RequestsCookieJar[<Cookie Seminar_Session=abbfdd4e96ee048b1b97fd027a2c7de4 for URL/>]>
如果您没有登录并尝试访问受保护的页面,则s.get只返回您获得的登录页面。
所以我认为一切正常,只是网页认为我不保存已发送的cookie。我该如何解决这个问题?
编辑(解决方案):
工作,谢谢!
使用BeautifulSoup解决方案:
import requests
from bs4 import BeautifulSoup
login = 'LOGIN_URL'
url = 'PROTECTED_URL'
session = requests.Session()
l = session.get(login)
soup = BeautifulSoup(l.content,'lxml')
values = {'loginname': 'USERNAME', 'password': r'PASSWORD','security_token' : soup.find('input')['value'], 'login_ticket' : soup.find('input').next_sibling.next_sibling['value'], 'resolution' : '', 'device_pixel_ratio' : '1'}
r = session.post(login, data = values)
s = session.get(url)
答案 0 :(得分:1)
使用GET
尝试登录页面的初始r = session.get(login)
。然后检查session.cookies
- 它应包含会话cookie。您还需要提取security_token
,login_ticket
和其他字段的各种值,以便您可以将它们包含在登录POST请求中。
关键是使用您用于获取所有后续请求的令牌的相同会话。服务器可能会将会话ID与其分配的令牌相关联,因此您需要在客户端将它们保持在一起。通过在获得令牌后创建新会话,正如您所做的那样,关联将丢失。
在代码中:
import requests
login = r'LOGIN_URL'
url = 'PROTECTED_URL'
session = requests.Session()
r = session.get(login) # retrieve cookie, tokens, and other stuff
# parse the response to extract the tokens etc. (perhaps use BeautifulSoup). Store in "values". Add username and password to "values"
r = session.post(login, data=values) # perform the login
r = session.get(url) # get the protected page