来自网站

时间:2018-05-05 20:12:11

标签: vba excel-vba web-scraping automation xmlhttprequest

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

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

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

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

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

编辑#1:

这是所述对象的HTML代码:

<img src="https://mek.mavir.hu/mek/mek/clear.cache.gif" style="width: 16px; height: 16px; background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB6klEQVR42pWT204aURSGd+JbSKw4Iow4lFFgBmaU8dCiyIQWkz5FD8/Qt2gfwMRbjY9gDGoPXkDRRrlo4gWOBg9RYzImf9faIEUuTLn4stYe1vevgRnEslsqW9OzyDoL4EpnrG1uPsuL4SDPlQuFkiYs28H7D5+QztgygPvTuzuc3d/DIxrUn9ze4s/NDRbzLn5fXkIZDYG9/PKbsshYWeTog+LbFRmwuOTi6PoadYJr7eoKlWYT3zxPBmw1Goio49Kx7CxE2prGwus83GJJBrzK5VGlLUzl4gL75+f4TtIO8RigxeJyziRXmKaNufkcCm5RBjA/adsPhoZ3ia02BxTKdXIqhVlyDHJF0khjxplHaeWdDOHfQmLZ//ouzIyFlJGRDrsikTTld2nhdFWn53ovWbAr4nQ7fCtfV9dxePbwX3yhWSNtQydXxPQpSjJQr26jXtmW9bjaqs+RSJl4qU9CaFocup7AASV38HiTT73/5Pqh164EOxP0NIQa1WRzRNuZ45762Pee2VGjMYgwvRRqdAK/Tn3ioQVtqrXhc83rxpeVHXZFKBzBWERFhQarT/Bl7QR7fiece3bYFSP0XiujYTQ/D/SFEhoDu2JYUehxJPsOYCdIrhgMDG3w33Pvo+iL4IiCwUBg4y/mf5J5tS4fFwAAAABJRU5ErkJggg==&quot;) 0px 0px no-repeat; margin: 0px 5px 0px 0px;" border="0" class="gwt-Image pointerCursor x-component" id="x-auto-206">

当我在eventListener上查找时,我可以看到它有一个&#34; click&#34;事件。它说:

事件监听:

EventListener

EventListener Unwrapped:

EventListener Unwrapped

GIF我在网站上闲逛(下载文件):

downloading the file

编辑#2:

对不起伙计们,我在这个&#34;项目&#34;上工作了好几天,我完全忘记了,如果我只是找到<img>对象,然后执行.Click它会下载文件。 但是! IE会弹出一个窗口,其中包含&#34; Save,SaveAs,Cancel 等等选项。我知道如何处理这个弹出窗口有很多问题,但我认为我的问题仍然存在。因为最好的解决方案是找到生成的URL,然后下载该链接。 URLDownloadToFile。这样我就不必与IE的弹出窗口进行交互。我希望这有点清楚。

2 个答案:

答案 0 :(得分:0)

假设您正在尝试下载图像 -
看看How do I base64 encode a string efficiently using Excel VBA? 在那里你会找到一个Decode方法。在网址的base64部分使用该部分,即&quot;data:image/png;base64,&quot;之间的文字。将其保存为二进制文件,即可获得图像。

答案 1 :(得分:0)

这有帮助吗?

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

enter image description here