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

