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
相关产品推荐
相关产品推荐

