如何用Python登录门户下载文件?请求未授权问题排查
解决Oracle BI门户Excel下载未授权问题
核心问题分析
你的代码直接通过GET请求下载链接并传递登录参数,不符合该Oracle BI门户的认证流程——这类门户需要先通过POST请求完成登录,获取会话Cookie后,再用已认证的会话请求下载资源。直接GET传参不会触发认证,因此返回未授权。
修正步骤与代码
- 使用
requests.Session()管理会话,自动保存登录后的Cookie - 先POST到登录端点完成认证
- 用已认证的会话请求下载链接
import requests from io import BytesIO import pandas as pd # 初始化会话,统一设置请求头 session = requests.Session() session.headers.update({ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36' }) # 登录端点(Oracle BI标准登录地址,若失效需抓包确认实际地址) login_url = 'https://totoro.banrep.gov.co/analytics/saw.dll?Logon' login_payload = { 'NQUser': 'publico', 'NQPassword': 'publico123', 'NQLocale': 'es_ES' # 补充语言参数,抓包可验证是否需要 } # 执行登录 login_resp = session.post(login_url, data=login_payload) # 简单验证登录状态(可根据响应内容调整判断逻辑) if login_resp.status_code == 200 and 'Logon' not in login_resp.url: print("认证成功") else: print(f"认证失败,状态码:{login_resp.status_code},响应片段:{login_resp.text[:300]}") # 发起下载请求 download_url = 'https://totoro.banrep.gov.co/analytics/saw.dll?Go&ViewID=o%3ago%7er%3areport&Action=Download&SearchID=g8of6g3fbae0jp7va1ru23h9rm&ViewName=compoundView%211&fmapId=I5IMHw&ViewState=d8lnokl6jm050tk65k2v7mq8k6&ItemName=1.2.5.IPC_Serie_variaciones&path=%2fshared%2fSeries%20Estad%c3%adsticas_T%2f1.%20IPC%20base%202018%2f1.2.%20Por%20a%c3%b1o%2f1.2.5.IPC_Serie_variaciones&Format=excel2007&Extension=.xlsx&bNotSaveCommand=true' download_resp = session.get(download_url) # 验证下载结果 if download_resp.status_code == 200 and 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' in download_resp.headers.get('Content-Type', ''): xls = pd.ExcelFile(BytesIO(download_resp.content)) print(f"Excel文件加载成功,工作表:{xls.sheet_names}") else: print(f"下载失败,状态码:{download_resp.status_code},响应片段:{download_resp.text[:300]}")
额外注意事项
- 登录端点验证:如果
saw.dll?Logon无法成功登录,打开浏览器开发者工具(F12),手动登录时观察「网络」标签下的POST请求地址,替换为实际登录URL。 - 参数补充:抓包查看登录表单的所有字段(比如可能有
NQTimeZone等隐藏参数),全部加入login_payload。 - Azure Function适配:在
requirements.txt中添加依赖包:requests>=2.31.0 pandas>=2.2.1 openpyxl>=3.1.2 - 错误排查:若仍失败,打印登录/下载的响应内容,查看具体未授权原因(比如Cookie未正确保存、参数缺失)。
内容的提问来源于stack exchange,提问作者Pipe
相关产品推荐
相关产品推荐

