如何通过SSO认证的URL使用Python下载文件并解决认证错误
解决SSO认证下Python请求CSV文件的问题
问题分析
返回的HTML内容显示目标网站采用OAM(Oracle Access Manager)单点登录系统,这类认证并非简单的HTTP基础认证(Basic Auth),而是需要通过表单提交、会话Cookie及JavaScript处理完成完整认证流程。你当前使用的requests.get(url, auth=(user, password))仅适用于Basic Auth,无法应对这种复杂的SSO认证逻辑。
解决方案
方法1:会话保持+模拟表单提交
先获取登录页面的动态隐藏参数,提交表单完成认证后,保持会话请求CSV文件:
import requests from bs4 import BeautifulSoup csv_url = "https://Path-to-url&Action=Download&format=CSV" username = 'user-name' password = 'password' # 创建会话对象,自动维护Cookie session = requests.Session() # 第一步:访问CSV地址,触发重定向获取登录页面 response = session.get(csv_url) soup = BeautifulSoup(response.content, 'html.parser') # 提取表单中所有隐藏参数 form_data = {} for input_tag in soup.find_all('input', type='hidden'): form_data[input_tag['name']] = input_tag['value'] # 填入账号密码 form_data['username'] = username form_data['password'] = password # 获取表单提交地址 login_url = soup.find('form')['action'] # 第二步:提交登录表单完成认证 session.post(login_url, data=form_data) # 第三步:再次请求CSV文件,此时会话已通过认证 csv_response = session.get(csv_url) # 保存文件 with open("BGCustomersbySKU-OCI.csv", "wb") as f: f.write(csv_response.content)
方法2:浏览器自动化(应对复杂JS验证)
如果上述方法失效(如存在验证码、动态JS校验),可直接模拟浏览器行为:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time csv_url = "https://Path-to-url&Action=Download&format=CSV" username = 'user-name' password = 'password' # 初始化Chrome浏览器(需对应版本的chromedriver) driver = webdriver.Chrome() driver.get(csv_url) # 等待登录页面加载并输入账号密码 wait = WebDriverWait(driver, 10) username_input = wait.until(EC.presence_of_element_located((By.NAME, 'username'))) password_input = driver.find_element(By.NAME, 'password') username_input.send_keys(username) password_input.send_keys(password) # 提交登录表单 driver.find_element(By.CSS_SELECTOR, 'form[name="myForm"]').submit() # 等待文件下载完成(根据实际情况调整等待时长) time.sleep(5) driver.quit()
关键注意事项
- OAM认证依赖会话Cookie,必须使用
requests.Session()保持会话状态,避免每次请求重新初始化连接。 - 登录表单中的
bmctx、OAM_REQ等参数为动态生成,需每次请求时实时提取,不可硬编码。 - 若网站启用多因素认证(MFA),需额外添加对应验证步骤的处理逻辑。
内容的提问来源于stack exchange,提问作者keshav
相关产品推荐
相关产品推荐

