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

使用Python Requests爬取ASP.NET网站Excel文件出现乱码问题求助

解决ASP.NET网站Excel下载乱码问题

我来帮你搞定这个Excel下载乱码的问题!你遇到的乱码其实是Excel文件的原始二进制内容——因为你把二进制文件当成文本处理了,加上请求头设置有误,才导致看起来一团糟。下面是具体的解决步骤和修改后的代码:

问题根源分析

  • 你设置的Content-Type请求头不对:这个头是用来告诉服务器你发送的内容类型,而不是你期望接收的类型。强制设置成application/vnd.ms-excel反而可能干扰服务器的响应逻辑。
  • 直接用t.text获取响应:Excel是二进制格式文件,t.text会尝试把二进制字节按文本编码解码,必然会出现乱码,应该用t.content获取原始二进制流。

修改后的代码

import requests
from bs4 import BeautifulSoup

link = 'https://www.canfax.ca/Main.aspx'
payload = {
    'ctl00$MainContent$userNameTextBox':'username',
    'ctl00$MainContent$passwordTextBox': 'password',
    'ctl00$MainContent$signInButton': 'Sign In'
}

with requests.Session() as s:
    # 设置基础请求头,模拟浏览器
    s.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36'
    s.headers["Accept-Language"] = "en-GB,en-US"
    s.headers["Referer"] = "https://www.canfax.ca/Main.aspx"
    s.headers["Sec-Fetch-Dest"] = "document"
    s.headers["sec-ch-ua"] = '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"'
    s.headers["sec-ch-ua-platform"] = '"macOS"'
    s.headers["Sec-Fetch-Mode"] = "navigate"
    s.headers["Sec-Fetch-Site"] = 'same-origin'
    s.headers["Sec-Fetch-User"] = '?1'
    # 注意:Cookie最好不要硬编码,会话会自动维护,硬编码可能导致会话过期
    # s.headers["Cookie"] = "..."  # 建议移除这行,让requests自动管理Cookie

    # 第一步:获取登录页面的VIEWSTATE等参数
    r = s.get(link)
    soup = BeautifulSoup(r.text,"lxml")
    payload['__VIEWSTATE'] = soup.select_one("#__VIEWSTATE")['value']
    payload['__VIEWSTATEGENERATOR'] = soup.select_one("#__VIEWSTATEGENERATOR")['value']
    payload['__EVENTVALIDATION'] = soup.select_one("#__EVENTVALIDATION")['value']

    # 第二步:提交登录请求
    res = s.post(link, data=payload)
    # 可以在这里验证是否登录成功,比如检查响应文本里是否有登录后的内容
    # if "Welcome" in res.text:
    #     print("登录成功!")

    # 第三步:下载Excel文件,注意不要修改Content-Type请求头
    url1 = 'https://www.canfax.ca/Report/SpreadsheetReport.aspx?catalogue=FullSpreadsheets&group=Weekly+Fed+Steer&report=Alberta'
    t = s.get(url1)

    # 第四步:保存二进制内容到文件
    if t.status_code == 200:
        with open('Alberta_Weekly_Fed_Steer.xls', 'wb') as f:
            f.write(t.content)
        print("Excel文件下载保存成功!")
    else:
        print(f"下载失败,状态码:{t.status_code}")

额外注意事项

  • 不要硬编码Cookie:requests的Session会自动维护会话Cookie,硬编码的Cookie可能很快过期,导致后续请求失败。
  • 验证登录状态:登录后可以检查响应内容,确认是否真的登录成功,避免因为登录失败导致下载无权限的内容。
  • 检查响应头:可以打印t.headers看看服务器返回的Content-Type是否为application/vnd.ms-excel或类似的Excel类型,确认服务器确实返回了正确的文件类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:03:11