Python POST请求返回404状态代码,但GET请求返回200
我正在尝试登录网站。当我提交一个简单的GET请求时,我得到了预期的200个响应Python POST请求返回404状态代码,但GET请求返回200,python,python-3.x,python-requests,Python,Python 3.x,Python Requests,我正在尝试登录网站。当我提交一个简单的GET请求时,我得到了预期的200个响应 import requests login_url = 'https://urs.earthdata.nasa.gov/' sess = requests.Session() sess.headers ={'User-Agent':'Mozilla/5.0'} sess.verify=False r1 = sess.get(login_url) print (r1.status_code) >>>
import requests
login_url = 'https://urs.earthdata.nasa.gov/'
sess = requests.Session()
sess.headers ={'User-Agent':'Mozilla/5.0'}
sess.verify=False
r1 = sess.get(login_url)
print (r1.status_code)
>>>200
然而,当我尝试使用POST请求实际登录时,我得到一个404错误。(请求的有效负载来源于页面的html,并使用Firefox中的页面检查器。)
导入请求
进口稀土
产品https://datapool.asf.alaska.edu/L1.5/A3/ALPSRP171431190-L1.5.zip'
登录https://urs.earthdata.nasa.gov/'
用户名='username'
密码='password'
sess=requests.Session()
sess.headers={'User-Agent':'Mozilla/5.0'}
sess.verify=False
r1=sess.get(产品url)
tkn_ptn=“”
tkn=重新搜索(tkn_ptn,r1.text)。组(1)
打印('CSRF令牌:{}'。格式(tkn))
>>>'CSRF令牌:CDOX5tOhBtX2vvZn/c/MLRaYJtW7hzeQLm/eEVn09cHosnlsR/5P8a+k4YEaAzYQZRxCgNf9evDqyhWiZiefmQ='
cli_ptn=“”
cli=重新搜索(cli\u ptn,r1.text).group(1)
打印('客户端ID:{}'。格式(cli))
>>>'客户端ID:BO_N7NTILJDVU6KRRB3G'
redir_ptn=“”
redir=re.search(redir\u ptn,r1.text)。组(1)
打印('重定向URL:{}'。格式(redir))
>>>'重定向URL:https://auth.asf.alaska.edu/login'
有效负载={'username':用户名,
“密码”:密码,
“真实性令牌”:tkn,
“客户端id”:cli,
“重定向uri”:重拨,
“响应类型”:“代码”,
“留守”:“1”,
“提交”:“登录”}
r2=sess.post(登录地址,数据=有效负载)
打印(r2.状态代码)
>>>404
为什么页面不接受我的负载并允许我登录 有效负载数据来自登录页面本身,因此应该是
https://urs.earthdata.nasa.gov/
查看浏览器上的“网络”选项卡。我刚刚输入了一些随机用户名和密码,查看我的网络选项卡,我看到一篇帖子发到
https://urs.earthdata.nasa.gov/login
。查看有效负载,这是它的格式:
utf8: ✓
authenticity_token: ...token base64...
username: 123
password: 123
client_id:
redirect_uri:
commit: Log in
因此,我们只需要从源代码中提取authenticity\u令牌。查看登录页面的源代码,我们可以看到以下信息:
因此,我们只需要使用一些正则表达式来提取这个位,因为对于像这样的一次性使用的东西,它更快(您可以使用任何其他方法或正则表达式):
token=re.search(r'authenticity\u token.*?“(*?”),webpage.text)。组(1)
最后创建数据并将其传递给POST方法:
数据={
“utf8”:”✓",
“真实性令牌”:令牌,
“用户名”:用户名,
“密码”:密码,
“客户id”:“,
“重定向uri”:“”,
“提交”:“登录”,
}
login=requests.post(“https://urs.earthdata.nasa.gov/login,headers={'User-Agent':'Mozilla/5.0'},data=data)
当您使用请求时,为什么要使用re进行搜索?还要仔细检查Cookie。有时,如果Cookie是由JS在浏览器中设置的,则它们不会在会话对象中设置。您需要尝试r2=sess.post(login\u url+'login',data=payload)
由于凭据将在/login
视图中验证。@supersew我认为在此处使用re没有问题,不需要解析整个网页来提取一些tokens@Xosrov这不是一个“问题”,但它不太像蟒蛇
utf8: ✓
authenticity_token: ...token base64...
username: 123
password: 123
client_id:
redirect_uri:
commit: Log in