使用Python Requests POST方法登录网站时遭遇405错误求助
解决Python Requests登录Workable ID时的405错误
核心问题分析
405状态码表示请求方法不被允许,结合你的情况,主要可能是以下几个原因:
- POST请求的目标URL错误:手动登录时表单实际提交到的地址并非你当前使用的
login_url - CSRF参数名不匹配:你提取的CSRF字段name是
csrf,但代码里用了csrf_token作为参数名,服务器无法识别 - 缺少表单隐藏字段:登录表单可能包含其他必填的隐藏参数,仅提交邮箱、密码和CSRF令牌不够
解决方案步骤
- 确认表单提交的目标URL
打开浏览器登录页,右键查看页面源代码,找到<form>标签的action属性,这才是POST请求的正确地址。 - 修正CSRF参数名
你提取的CSRF输入框name是csrf,所以登录数据里的参数名必须是csrf,而非csrf_token。 - 提取所有表单字段
登录表单通常包含utf8、commit等隐藏字段,需要将这些字段一并加入登录数据,确保参数完整。 - 优化请求头设置
不要完全覆盖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
相关产品推荐
相关产品推荐

