Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python POST请求返回404状态代码,但GET请求返回200_Python_Python 3.x_Python Requests - Fatal编程技术网

Python POST请求返回404状态代码,但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) >>>

我正在尝试登录网站。当我提交一个简单的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)
>>>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