从指定网页批量下载多币种多日期数据至Excel的技术求助
解决BCRA货币数据批量下载的问题
看来你在批量抓取BCRA的货币汇率数据时遇到了网站拦截的问题,原有的VBA代码因为请求方式或者参数问题被限制了。我给你几个可行的解决方案,从代码到可视化工具都有:
一、修正并优化VBA代码(模拟浏览器请求)
你的原代码有两个小问题:一是URL末尾多了多余的双引号,二是直接用Application.Workbooks.Open发送的请求没有浏览器标识,容易被网站的反爬机制拦截。我们改用XMLHTTP模拟浏览器请求,并正确解析返回的HTML表格:
Sub DescargarDatosBCRA() Dim xmlHttp As Object Dim htmlDoc As Object Dim tableElement As Object Dim row As Object, col As Object Dim i As Integer, j As Integer Dim fecha As String, moneda As Integer Dim ws As Worksheet ' 配置参数:日期格式必须是YYYY.MM.DD,货币ID对应网站下拉框的value值 fecha = "2018.12.31" moneda = 313 ' 示例:Dólar Estadístico的ID Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) ws.Name = "Moneda_" & moneda & "_" & fecha ' 创建XMLHTTP对象(模拟浏览器) Set xmlHttp = CreateObject("MSXML2.XMLHTTP.6.0") ' 构造正确URL:注意用&代替&,去掉多余引号 Dim url As String url = "http://www.bcra.gob.ar/PublicacionesEstadisticas/Evolucion_moneda_3.asp?tipo=E&Fecha=" & fecha & "&Moneda=" & moneda ' 设置浏览器请求头,避免被识别为爬虫 xmlHttp.Open "GET", url, False xmlHttp.setRequestHeader "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" xmlHttp.send ' 检查请求是否成功 If xmlHttp.Status <> 200 Then MsgBox "请求失败,状态码:" & xmlHttp.Status & vbCrLf & "请检查URL或网络连接" Exit Sub End If ' 解析返回的HTML内容 Set htmlDoc = CreateObject("htmlfile") htmlDoc.body.innerHTML = xmlHttp.responseText ' 定位到页面中的数据表格(如果第一个表格不是目标表,调整索引值) On Error Resume Next Set tableElement = htmlDoc.getElementsByTagName("table")(0) On Error GoTo 0 If tableElement Is Nothing Then MsgBox "未找到数据表格,请检查页面结构是否变化" Exit Sub End If ' 写入表头 i = 1 j = 1 For Each col In tableElement.Rows(0).Cells ws.Cells(i, j) = Trim(col.innerText) j = j + 1 Next col ' 写入数据行 i = 2 For Each row In tableElement.Rows If i > 2 Then ' 跳过已写入的表头行 j = 1 For Each col In row.Cells ws.Cells(i, j) = Trim(col.innerText) j = j + 1 Next col i = i + 1 End If Next row MsgBox "数据已成功下载到工作表:" & ws.Name End Sub
代码要点说明:
- 用
MSXML2.XMLHTTP发送请求并设置User-Agent头,模拟真实浏览器的访问行为 - 确保URL参数正确:日期格式为
YYYY.MM.DD,货币ID要和网站下拉框的value属性一致(可以右键查看原页面源代码获取) - 解析HTML表格提取数据,避免直接打开网页的限制
二、用Power Query(Get & Transform)批量处理(适合非代码用户)
如果你不想写代码,Power Query是更友好的选择,它可以模拟浏览器请求,还能轻松实现多日期、多货币的批量下载:
- 准备参数表:在Excel中创建一个表格,包含两列:
Fecha(格式如2018.12.31)和MonedaID(如313、318) - 创建自定义函数:
- 点击「数据」→「获取数据」→「从其他来源」→「空白查询」
- 打开高级编辑器,替换为以下M代码:
let DescargarMoneda = (Fecha as text, MonedaID as number) => let Url = "http://www.bcra.gob.ar/PublicacionesEstadisticas/Evolucion_moneda_3.asp?tipo=E&Fecha=" & Fecha & "&Moneda=" & Text.From(MonedaID), Source = Web.Page(Web.Contents(Url, [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"]])), DataTable = Source{0}[Data], // 若目标表格不是第一个,调整索引值 AddMetadata = Table.AddColumns(DataTable, { "Fecha_Seleccionada", each Fecha, "Moneda_ID", each MonedaID }) in AddMetadata in DescargarMoneda - 将函数命名为
DescargarMoneda并保存
- 批量调用函数:
- 选中参数表,点击「数据」→「从表格/范围」导入到Power Query
- 点击「添加列」→「调用自定义函数」,选择刚才创建的
DescargarMoneda,匹配参数列 - 展开生成的「DescargarMoneda」列,合并所有数据后加载回Excel
三、关键注意事项
- 货币ID确认:打开原页面
http://www.bcra.gob.ar/PublicacionesEstadisticas/Evolucion_moneda.asp,右键查看源代码,找到货币下拉框的option标签,获取每个货币对应的value值(比如Euro是318) - 日期格式:必须使用
YYYY.MM.DD格式,和网站日期选择器的格式一致 - 反爬机制:如果频繁请求被拦截,可以在代码中添加
Application.Wait(VBA)或自定义延迟逻辑(Power Query),避免请求过于频繁
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

