如何用Requests下载需JS点击触发的CSV文件?
用Requests轻量下载BVMF的CSV文件
问题分析
你请求的接口https://bvmf.bmfbovespa.com.br/NegociosRealizados/Registro/DownloadArquivoDiretorio?data=返回的字符串是Base64编码的CSV内容——从页面的JS函数carregarDownloadArquivo里的convertBase64(t)就能看出,前端会把接口返回的Base64字符串解码后生成Blob文件完成下载。你的现有代码仅获取了编码后的内容,未做解码和保存操作,所以无法得到可用的CSV文件。
解决方案代码
直接用Requests请求接口,对返回的Base64字符串解码后保存为CSV即可,代码如下:
import requests import base64 # 请求接口,添加User-Agent模拟浏览器避免被拦截 url = "https://bvmf.bmfbovespa.com.br/NegociosRealizados/Registro/DownloadArquivoDiretorio?data=" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers, allow_redirects=True) # 解码Base64格式的返回内容 csv_content = base64.b64decode(response.text) # 保存为CSV文件,文件名可参考前端逻辑自定义 with open("negocios_balcao.csv", "wb") as f: f.write(csv_content)
关键逻辑说明
- Base64解码:页面JS中的
convertBase64函数就是执行Base64解码操作,对应Python里的base64.b64decode()方法。 - Headers设置:添加
User-Agent是为了模拟浏览器请求,避免服务器拒绝无标识的请求。 - 文件保存:解码后的内容为二进制格式,需用
wb模式写入文件,直接得到可正常打开的CSV。
方案选择建议
- Requests方案远轻于Selenium:无需启动浏览器,资源占用小、速度快,适合批量或定时任务场景。
- 仅当页面存在复杂动态渲染(如多层交互、极难逆向的JS加密)时,才考虑使用Selenium。此场景下Requests完全能满足需求,没必要用笨重的浏览器自动化工具。
前端代码逻辑拆解
你提取的JS函数核心流程为:
- 点击触发
carregarDownloadArquivo,发起AJAX请求到你调用的接口。 - 接口返回Base64编码的CSV字符串。
- 调用
convertBase64解码,生成Blob对象。 - 通过
saveAs或IE专属方法将Blob下载为CSV文件。
我们用Python直接复现了「请求→解码→保存」核心步骤,跳过了前端浏览器渲染环节。
内容的提问来源于stack exchange,提问作者Victor Reial
相关产品推荐
相关产品推荐

