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

