【问题标题】:Trouble with automated download from secure website从安全网站自动下载的问题
【发布时间】:2018-12-14 21:12:00
【问题描述】:

我正在寻求有关从安全网站下载文件的帮助。我在这方面的知识不多,所以我不确定我能提供什么会有帮助。如果你能告诉我从网站上抓取什么,我会的。

这里是基础知识。我必须使用IE。我正在使用 vba 发送自动代码。我可以登录网站,导航到他们的报告页面,运行我的报告。它返回一个带有超链接、名称等的表格。我只是在尝试下载一个示例的阶段,所以我知道下载是有效的。我想我可以毫无问题地循环表格并将超链接提供给循环。

当我为下载代码提供第一个超链接时,我得到了我的 pdf,但打开它时只有一条消息,说您必须登录才能查看。嗯,我已经登录了。那个用过

Call URLDownloadToFile(0, "https://atlasbridge.com/reports/atlasreportdownload.ashx?N=49837661&RT=PREVMAIL", "C:\Users\JCarney\Desktop\DownloadedMail\atlasreportdownload.ashx.pdf", 0, 0)

然后我尝试了:

 Dim theURL As String
 theURL = "https://atlasbridge.com/reports/atlasreportdownload.ashx?  N=49837661&RT=PREVMAIL"          
Debug.Print theURL
Dim WinHttpReq As Object
Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
WinHttpReq.Open "GET", theURL, False, UName, Pword
WinHttpReq.Send
theURL = WinHttpReq.responseBody
If WinHttpReq.Status = 200 Then
Debug.Print theURL
Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1
oStream.Write WinHttpReq.responseBody oStream.SaveToFile "C:\Users\JCarney\Desktop\DownloadedMail\atlasreportdownload.ashx.pdf", 2 ' 1 = no overwrite, 2 = overwrite
oStream.Close
End If

结果是一样的,一个 pdf 下载但说我没有登录。UName,Pword 是字符串变量,用于在 sub 中查找用户名和密码。他们正在查找正确的信息。我不知道从这里去哪里。我可以让vba“单击”超链接并下载并命名文件吗?还是我继续尝试从 WinHttpReq 下载。

表格的 html 如下所示:

 '<table align="center" id="ctl00_cphMain_dgMailings" style="border-collapse:collapse;" border="1" rules="all" cellspacing="0">
'<td>Policy</td><td>Insured</td><td>Type</td><td>Mailed</td>
'    <tbody><tr class="blacktextbold">
'        <td>&nbsp;</td><td>Policy</td><td>Insured</td><td>Type</td><td>Mailed</td>
'    </tr><tr class="blacktext">

'    </tr><tr class="blacktext" style="background-color:#D9D9D9;">
'        <td><a href="../reports/atlasreportdownload.ashx?N=49837661&amp;RT=PREVMAIL" target="_blank">View</a></td><td>1501-1603-1276</td><td>SUSAN</td><td>Amended Dec Page</td><td>12/08/2018</td>
'    </tr><tr class="blacktext">href="javascript:__doPostBack('ctl00$cphMain$dgMailings$ctl19$ctl01','')">&gt;</a></td>
'    </tr>
'</tbody></table>

格式正确的超链接将是什么,就像您手动执行此操作一样: "https://atlasbridge.com/reports/atlasreportdownload.ashx?N=49837661&RT=PREVMAIL" 该表向我们展示了截断的路径。

提前谢谢你。

快速编辑。当我检查元素时,表中的“视图”超链接。我明白了:

<a href="../reports/atlasreportdownload.ashx?N=49988945&amp;RT=PREVMAIL" target="_blank">View</a>

如果有帮助的话。对我没有任何启发,但也许有帮助。 如果我使用 SetCredentials "username","password",, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER 作为网站的登录屏幕,这是响应文本 login screen webpage

这是我直接点击 pdf 超链接时的响应文本: pdf hyperlink

【问题讨论】:

  • 如果您尝试从浏览器手动下载 PDF 报告文件会怎样?是否显示相同的错误消息或成功打开 PDF 文件?该站点可能应用了一些逻辑,并且只有在用户登录时才会在浏览器中打开文件。
  • 手动下载是我们现在的做法。但我也测试了代码的登录方面是否可以运行并获取文件。我们只需在另一个选项卡中单击查看超链接和 pdf 显示就可以了,或者您可以右键单击它并直接保存。所以它肯定会看到我以手动方式登录。这一切都很好。所以我想我要么需要自动化“点击 - 保存”步骤,要么仍然进行静默下载,但每次都将凭据传递给它,我不知道该怎么做。两种方法我都可以。
  • 我只是对这个理论进行了测试。我登录了。通过单击查看打开了一个文档。这当然奏效了。我复制了超链接并将其粘贴到另一个选项卡中,而我已登录并且它确实成功拉出文档,所以它不仅仅是单击拉出它的文档。第二次测试,在其中打开一个新选项卡自己的浏览器窗口并粘贴超链接,这也有效。因此,通过更多手动方法,IE 似乎仍然向文档服务器提供我登录的信息。
  • 我添加到 png 文件中,显示在登录页面和他们网站的 pdf 超链接上使用 setcredentials 时得到的响应文本。

标签: ms-access internet-explorer vba


【解决方案1】:

从您的上一篇文章中,我可以看到您的手动步骤正在运行。

但是,在您的代码中,您使用的是 WinHttpReq.Open 和其他代码。这与您手动操作的方式不同。

我建议您创建一个 Internet Explorer 对象,然后尝试使用它来打开您的网页。您可以尝试使用其 ID 查找 PDF 文件链接并尝试单击按钮或链接进行下载。

示例代码:

Sub demo()
            
        Dim IEapp As Object
        Dim WebUrl As String
        
        Set IEapp = CreateObject("InternetExplorer.Application") 
        WebUrl = "http://www.microsoft.com"
                                                                                       
        With IEapp
            .Silent = True
            .Visible = True
            .Navigate WebUrl


            Do While .Busy
                DoEvents
            Loop
            
            Do While .readyState <> 4
                DoEvents
            Loop
        
        End With
               
    End Sub

添加对 Microsoft Internet ControlsMicrosoft HTML Object Library 的引用以运行此代码。

这只是一个示例代码,您需要对其进行修改并添加更多代码以满足您的要求。

【讨论】:

  • 非常感谢您提供的信息。假设我成功导航到该页面,我可以如何保存 pdf 文件?我假设我只需在元素上使用“.click”即可单击代码中的超链接。我一直在通过对象浏览器,但没有看到保存/另存为类型命令。我确实认为我将能够使用 shell 转到正确的选项卡。我想我可以让它循环打开项目,直到它与 URL 匹配。我会知道元素的 URL,这样就可以了。
  • 您可以尝试参考以下线程中答案的代码示例,以获取有关下载文件的代码的信息。 stackoverflow.com/questions/38983302/…
  • 非常感谢!我会检查它并回帖,很可能直到假期结束后我才会对它有所了解,但我会告诉你的。非常感谢您的建议!
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2012-08-18
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
相关资源
最近更新 更多