【问题标题】:VBA download file from website - popup window从网站下载 VBA 文件 - 弹出窗口
【发布时间】:2018-10-16 01:05:16
【问题描述】:

我正在尝试自动从网站下载文件。当我手动下载时,我所要做的就是单击“保存”图标(软盘),然后会弹出另一个窗口一秒钟并开始下载(同时弹出的窗口消失)。

我通常做的(当我自动下载时)是找到文件的 URL,然后我使用 URLDownloadToFile 函数。但在这种情况下,我无法在 html 中找到 url。我尝试在对象上使用.clickFireEvent,但没有任何效果。

所以我开始考虑(基于此站点中的类似问题)当我按下“保存”图标时脚本会生成 URL。不幸的是,我不熟悉 javascript 或它是如何工作的。现在,我正在尝试使用浏览器的开发人员工具控制台来确定单击对象时会发生什么。顺便说一句:这个对象是一个<img> 对象。

我在网上搜索了答案,我想如果我想下载文件,我必须自己调用 javascript,比如execScript。但是,当我单击图标时,如何找出调用了哪个脚本?更重要的是,我是否能够在不完全了解网页工作原理的情况下理解您的答案? :)

P.S.:我知道如果我能给你网站地址会容易得多,但它需要登录才能看到我正在谈论的东西......

【问题讨论】:

  • TBH 我不知道如何在这里提供帮助。没有 HTML 可以分享吗?缩小范围的东西。这一点感觉都没有minimal reproducible example。我对 js 函数调用的有限经验是,它确实有助于在现场看到它并能够计算出页面的整个流程。我确实注意到了您关于登录的评论。
  • @QHarr 我编辑了我的问题,让我知道如何提供更多帮助,而无需访问实际站点。
  • 有什么说 image.setUrl 的吗?
  • HTML 代码中没有。如果我稍微打开 EventListener(你可以在我刚刚添加到问题的第二个打印屏幕上看到它),我会看到“proto”函数相互嵌入(无限 - 如我所见)。但是里面有“set caller”和“set argument”之类的东西。
  • 您可以使用 Fiddler 检查您在浏览器中手动单击并下载文件时是否生成了任何 XHR,如果是,则从 VBA 代码中重现该 XHR。

标签: vba excel web-scraping automation xmlhttprequest


【解决方案1】:

假设您正在尝试下载图像 -
看看How do I base64 encode a string efficiently using Excel VBA? 在那里你会找到一个解码方法。在 url 的 base64 部分使用它,即"data:image/png;base64," 之间的文本。将其保存为二进制文件,您就有了图像。

【讨论】:

  • 你能完整地展示上面的内容是如何工作的吗?或者你需要更多的 HTML 吗?
  • 这很有趣,我从来没有听说过这种方法。但正如你所说,它会给我图像本身,而不是文件。我用网站上模拟下载的 GIF 更新了我的帖子。我希望这会有所帮助。
  • 没关系。我刚刚意识到我误解了你的问题描述。网址中的图像是按钮上的图标,我认为这没什么意义。
【解决方案2】:

这有帮助吗?

Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
  "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
    szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Sub DownloadFilefromWeb()
    Dim strSavePath As String
    Dim URL As String, ext As String
    Dim buf, ret As Long
    URL = Worksheets("Sheet1").Range("A2").Value
    buf = Split(URL, ".")
    ext = buf(UBound(buf))
    strSavePath = "C:\Users\rshuell\Desktop\Downloads\" & "DownloadedFile." & ext
    ret = URLDownloadToFile(0, URL, strSavePath, 0, 0)
    If ret = 0 Then
        MsgBox "Download has been succeed!"
    Else
        MsgBox "Error"
    End If
End Sub

或者....

Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
  "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
    szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Private Sub pMain()
  Dim sURL As String
  Dim sDestination As String
  Dim bSuccess As Boolean
  Dim lRow As Long
  Dim ws As Excel.Worksheet
  Dim strSavePath As String
  Dim URL As String, ext As String
  Dim buf, ret As Long

  'Change to suit
  Set ws = ThisWorkbook.Worksheets("Sheet1")

  With ws
    For lRow = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row
      sURL = .Cells(lRow, "A")
      sDestination = .Cells(lRow, "B")

      buf = Split(sURL, ".")
      ext = buf(UBound(buf))

        pos = InStrRev(sURL, "/", -1)
        file = Mid(sURL, pos + 1, 99)
        strSavePath = sDestination & file
        ret = URLDownloadToFile(0, sURL, strSavePath, 0, 0)
            If ret = 0 Then
                .Cells(lRow, "C") = "File download successfully!"
            Else
                .Cells(lRow, "C") = "Couldn't download the file!"
            End If

      DoEvents
    Next lRow
  End With
End Sub

【讨论】:

  • 我知道这种方法,但这需要我知道文件的 URL。这就是问题所在,我不知道......我认为它是在我单击图标时以某种方式生成的(你可以在我帖子末尾的 GIF 上看到它的实际效果)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多