Python登录Windows CE舒适面板下载CSV返回HTML问题解决
问题根因
你拿到HTML而非目标CSV的核心原因有两个:
- 会话未复用:你在
with requests.session() as s代码块内完成了登录鉴权,但后续发起文件下载请求时,用的是独立的requests.get()方法,这个全新请求没有携带登录成功后服务端下发的认证Cookie,会被服务端判定为未授权访问,自动重定向到登录页面,最终保存的就是登录页的HTML源码。 - 缺失必要请求头:Windows CE架构舒适面板的内置Web服务会校验请求来源,下载文件时如果不带对应目录页的Referer头,会直接返回目录浏览的HTML页面,不会触发文件下载。
修正代码
import requests from bs4 import BeautifulSoup loginurl = "http://10.70.148.11/FormLogin" secure_url = "http://10.70.148.11/StorageCardSD?UP=TRUE&FORCEBROWSE" downloadurl = "http://10.70.148.11/StorageCardSD/AuditTrail0.csv?UP=TRUE&FORCEBROWSE" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', 'Referer': secure_url } payload = { 'Login': 'Admin', 'Password': 'Pass' } with requests.session() as s: # 统一给会话挂载请求头,所有该会话发起的请求都会自动携带 s.headers.update(headers) # 发起登录请求 login_resp = s.post(loginurl, data=payload) # 访问存储卡目录页,校验登录是否生效 dir_resp = s.get(secure_url) soup = BeautifulSoup(dir_resp.content, 'html.parser') print(soup.prettify()) # 复用同一个已登录的会话发起下载请求,不要新建独立请求 file_resp = s.get(downloadurl, allow_redirects=True) # 简单校验返回内容,避免把HTML存成CSV if b'<html' in file_resp.content.lower()[:200]: raise ValueError("下载返回内容为HTML,未获取到CSV文件,请检查登录状态、文件路径是否正确") # 写入文件 with open('audittrail.csv', 'wb') as csv_file: csv_file.write(file_resp.content)
排查补充说明
- 先在浏览器手动完成登录,直接访问下载路径确认文件真实地址,部分面板的审计追踪文件会按日期生成序号,不一定固定为
AuditTrail0.csv。 - 如果校验时发现返回的是登录页HTML,先检查登录接口的payload字段是否和浏览器实际提交的一致,部分面板的登录接口还需要携带隐藏的CSRF token字段,需要先访问登录页解析出对应字段再提交登录请求。
- 如果返回的是存储卡目录页HTML,检查下载URL的参数是否正确,
FORCEBROWSE参数不能缺失,且参数顺序不能随意调整,否则服务端不会返回文件内容。
内容的提问来源于stack exchange,提问作者Eduardo Montemayor García
相关产品推荐
相关产品推荐

