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

从指定网页批量下载多币种多日期数据至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是更友好的选择,它可以模拟浏览器请求,还能轻松实现多日期、多货币的批量下载:

  1. 准备参数表:在Excel中创建一个表格,包含两列:Fecha(格式如2018.12.31)和MonedaID(如313、318)
  2. 创建自定义函数:
    • 点击「数据」→「获取数据」→「从其他来源」→「空白查询」
    • 打开高级编辑器,替换为以下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并保存
  3. 批量调用函数:
    • 选中参数表,点击「数据」→「从表格/范围」导入到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:58:49