You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python Requests POST方法登录网站时遭遇405错误求助

解决Python Requests登录Workable ID时的405错误

核心问题分析

405状态码表示请求方法不被允许,结合你的情况,主要可能是以下几个原因:

  • POST请求的目标URL错误:手动登录时表单实际提交到的地址并非你当前使用的login_url
  • CSRF参数名不匹配:你提取的CSRF字段name是csrf,但代码里用了csrf_token作为参数名,服务器无法识别
  • 缺少表单隐藏字段:登录表单可能包含其他必填的隐藏参数,仅提交邮箱、密码和CSRF令牌不够

解决方案步骤

  1. 确认表单提交的目标URL
    打开浏览器登录页,右键查看页面源代码,找到<form>标签的action属性,这才是POST请求的正确地址。
  2. 修正CSRF参数名
    你提取的CSRF输入框name是csrf,所以登录数据里的参数名必须是csrf,而非csrf_token。
  3. 提取所有表单字段
    登录表单通常包含utf8、commit等隐藏字段,需要将这些字段一并加入登录数据,确保参数完整。
  4. 优化请求头设置
    不要完全覆盖session的默认请求头,仅补充必要的字段(如User-Agent),避免丢失session自动管理的Cookie和其他必要头信息。

修正后的代码

import requests
from bs4 import BeautifulSoup

# 登录信息
login_page_url = 'https://id.workable.com/oidc/i/Kefaqe8c2wvMA9ZThPceF'
email = 'your_email@example.com'
password = 'your_password'

# 创建会话
session = requests.Session()

# 模拟浏览器请求头,仅补充必要字段
session.headers.update({
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
})

# 获取登录页面
response = session.get(login_page_url)
if response.status_code != 200:
    print(f"获取登录页面失败,状态码:{response.status_code}")
    exit()

# 解析页面获取表单信息
soup = BeautifulSoup(response.text, 'html.parser')
login_form = soup.find('form')
if not login_form:
    print("未找到登录表单")
    exit()

# 提取表单所有字段
login_data = {}
for input_tag in login_form.find_all('input'):
    name = input_tag.get('name')
    value = input_tag.get('value', '')
    if name:
        login_data[name] = value

# 替换邮箱和密码
login_data['email'] = email
login_data['password'] = password

# 获取表单提交的目标URL
form_action = login_form.get('action')
if not form_action:
    print("未找到表单提交地址")
    exit()
# 处理相对路径,拼接成完整URL
if form_action.startswith('/'):
    post_url = 'https://id.workable.com' + form_action
else:
    post_url = form_action

# 发送登录请求
response = session.post(post_url, data=login_data, allow_redirects=True)

# 验证登录结果:可通过检查跳转后的URL或页面内容判断
if 'dashboard' in response.url or '已登录' in response.text:
    print("登录成功!")
else:
    print(f"登录失败,状态码:{response.status_code}")
    print("响应内容:", response.text[:500])  # 打印部分响应内容排查

额外提示

  • 若仍失败,打开浏览器开发者工具(F12),切换到Network标签,手动登录时查看POST请求的详细信息,对比你的代码请求的参数、头信息、URL是否完全一致
  • 注意Workable可能有反爬机制,若频繁请求可能触发验证,建议模拟真实浏览器的请求间隔

内容的提问来源于stack exchange,提问作者Pardha Saradhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:07:38