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

如何用VBA和Power Query从双页登录的加密网站拉取Excel表格?

双页登录下用Power Query自动下载Chatham利率数据的解决方案

要实现双页登录后自动下载指定Excel文件,核心思路是模拟浏览器的登录请求流程,保存会话Cookie后再发起下载请求。以下是具体实现步骤:

1. 抓取登录请求的关键参数

用浏览器开发者工具(按F12打开「网络」标签),完整走一遍登录流程,记录两个关键请求的细节:

  • 提交用户名到/login的POST请求:查看请求的Form Data(通常包含username字段)、响应头里的Set-Cookie(会话标识)
  • 提交密码到/login/password的POST请求:查看需要的表单参数(除了password,可能还有从第一步页面获取的csrf_token等隐藏字段)

2. 编写Power Query M代码实现登录与下载

将以下代码复制到Power Query的高级编辑器中,替换占位信息后执行:

let
    // 替换为你的实际账号密码
    Username = "your_account",
    Password = "your_password",
    
    // 第一步:提交用户名,获取会话初始Cookie
    Step1_Response = Web.Contents(
        "https://www.chathamdirect.com/login",
        [
            Headers = [
                #"Content-Type" = "application/x-www-form-urlencoded",
                #"User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
            ],
            Content = Text.ToBinary("username=" & Uri.EscapeDataString(Username)),
            ManualStatusHandling = {400, 401, 403, 500}
        ]
    ),
    // 提取第一步返回的Cookie(需根据实际返回的Cookie名称调整)
    Step1_Cookies = ResponseHeaders(Step1_Response)[#"Set-Cookie"],
    Cookie_String = Text.Combine(List.Transform(Step1_Cookies, each Text.BeforeDelimiter(_, ";")), "; "),
    
    // 第二步:提交密码,完成登录(若需要csrf_token,需从第一步响应HTML中提取后添加到Content)
    Step2_Response = Web.Contents(
        "https://www.chathamdirect.com/login/password",
        [
            Headers = [
                #"Content-Type" = "application/x-www-form-urlencoded",
                #"Cookie" = Cookie_String,
                #"User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
            ],
            Content = Text.ToBinary("password=" & Uri.EscapeDataString(Password)),
            ManualStatusHandling = {400, 401, 403, 500}
        ]
    ),
    // 提取登录后的有效会话Cookie
    Final_Cookies = ResponseHeaders(Step2_Response)[#"Set-Cookie"],
    Final_Cookie_String = Text.Combine(List.Transform(Final_Cookies, each Text.BeforeDelimiter(_, ";")), "; "),
    
    // 第三步:携带登录Cookie下载Excel文件
    Download_Response = Web.Contents(
        "https://chathamdirect.com/rates/api/v1/rateset/sonia/forwardcurves/export/",
        [
            Headers = [
                #"Cookie" = Final_Cookie_String,
                #"User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
            ],
            ManualStatusHandling = {400, 401, 403, 500}
        ]
    ),
    // 将二进制文件转为可编辑的Excel表格
    Imported_Excel = Excel.Workbook(Download_Response)
in
    Imported_Excel

关键注意事项

  • User-Agent匹配:确保代码中的User-Agent和你浏览器的一致,避免被网站拦截
  • 额外参数处理:如果登录需要csrf_token,需用Web.Page(Step1_Response)解析第一步的响应HTML,提取对应隐藏字段的值,添加到第二步的Content中(格式类似"password=xxx&csrf_token=xxx")
  • 隐私设置调整:打开Power Query选项 → 隐私 → 选择「忽略隐私级别设置」,避免跨站点请求被权限拦截

3. 调试方法

  • 用ResponseHeaders(Step1_Response)查看响应头,确认Cookie是否正确获取
  • 用Text.FromBinary(Step1_Response)查看响应内容,检查是否有错误提示或需要补充的参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 01:22:37