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

Python Requests登录后下载xls文件返回欢迎页HTML源码问题求助

问题原因及解决方法

  • 修正代码变量笔误
    你代码中判断登录状态时使用了未定义的response变量,POST请求返回的响应对象是r,将判断条件改为if r.status_code == 200,避免逻辑判断失效。
  • 移除多余的cookie传参
    requests.Session()会自动管理整个会话周期的cookie,不需要手动在GET请求中传入cookies=r.cookies参数,多余的传参可能覆盖会话中已生效的有效凭证,直接删除该参数即可。
  • 修正登录提交地址
    你当前POST请求的地址是网站欢迎页,并非处理登录表单的后端接口。打开浏览器开发者工具的「网络」标签,重新走一次登录流程,找到Method为POST的登录接口真实地址,替换当前的site_url。
  • 补充登录必备的隐藏参数
    绝大多数网站的登录表单都带有CSRF Token、会话标识、时间戳等隐藏字段,仅提交用户名密码会被后端拦截。需要先GET请求登录页面,从返回的HTML中提取所有隐藏表单字段的value,和账号密码一起放入POST请求的data参数中提交。
  • 补充必要的请求头
    网站通常会校验请求的Referer头判断请求来源是否合法,在headers中添加'Referer': 'https://www.website.com/home/welcome',部分网站还会校验Accept头,可补充'Accept': '*/*'避免被拦截。

修正后的参考代码

import requests
from fake_useragent import UserAgent
# 如需要解析隐藏参数可导入BeautifulSoup
# from bs4 import BeautifulSoup

ua = UserAgent()
# 固定UA避免会话校验失败
fixed_ua = str(ua.chrome)
headers = {
    'Connection': 'keep-alive',
    'User-Agent': fixed_ua,
    'Referer': 'https://www.website.com/login' # 替换为实际登录页地址
}

s = requests.Session()
# 先请求登录页获取隐藏参数和初始cookie
login_page = s.get("https://www.website.com/login", headers=headers) # 替换为实际登录页地址
# 示例提取隐藏参数逻辑
# soup = BeautifulSoup(login_page.text, 'lxml')
# csrf_token = soup.find('input', {'name': 'csrf_token'})['value']

data = {
    'inUserName': 'username',
    'inUserPass': 'password',
    # 'csrf_token': csrf_token # 补充提取到的隐藏参数
}
# 替换为实际登录接口地址
login_api_url = 'https://www.website.com/api/login'
login_resp = s.post(login_api_url, data=data, headers=headers)

if login_resp.status_code == 200:
    download_resp = s.get("https://www.website.com/text/2017?y=2021&x=xls", allow_redirects=True, headers=headers)
    with open('file.xls', 'wb') as f:
        f.write(download_resp.content)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 17:45:01