使用Python requests库登录网站遇错误:Cannot POST /az/login
问题解决:requests登录返回Cannot POST及登录方式疑惑
问题描述
尝试用Python的requests库登录https://edvgerial.kapitalbank.az/az/login,代码如下:
import requests s = requests.session() login_url = 'https://edvgerial.kapitalbank.az/az/login' s.headers.update({"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"}) csrf_token=s.get(login_url).cookies.get('_csrf') payload = { "loginMethod":"PIN", "pin": "My_pin", "password":"My_password", "_csrf": csrf_token } res=s.post(url=login_url, data=payload) print(res.text)
网站返回:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Error</title> </head> <body> <pre>Cannot POST /az/login</pre> </body> </html>
同时对登录方式的选择存在疑惑。
解决步骤
1. 修正POST目标URL
/az/login是登录页面的展示URL,而非表单提交的接口地址。用浏览器开发者工具(F12)确认真实接口:
- 打开登录页,切换到「网络」标签
- 手动提交登录请求,查看请求列表里的POST请求,复制其真实接口地址(通常是类似
/api/auth/login这类路径) - 将代码中的
login_url替换为该真实地址
2. 验证CSRF Token的获取方式
部分网站的CSRF Token并非存在Cookie中,而是嵌入在页面HTML的隐藏输入框里:
- 用
BeautifulSoup解析页面提取Token:
from bs4 import BeautifulSoup response = s.get(login_url) soup = BeautifulSoup(response.text, 'html.parser') csrf_token = soup.find('input', {'name': '_csrf'})['value']
3. 完善请求头信息
除User-Agent外,可能需要补充Referer、Content-Type等必要头:
s.headers.update({ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36", "Referer": login_url, "Content-Type": "application/x-www-form-urlencoded" })
关于登录方式的说明
- 若选择
PIN登录,需确认网站是否要求先调用切换登录模式的前置接口(比如发送请求告知服务器使用PIN验证),再提交凭证。通过开发者工具查看正常登录的完整请求流程,确认是否有前置请求。 - 检查
pin和password的字段名是否与页面表单一致:查看登录输入框的name属性,确保payload中的字段名完全匹配。
内容的提问来源于stack exchange,提问作者Sahinbus
相关产品推荐
相关产品推荐

