【问题标题】:Download picture through xmlhttp通过xmlhttp下载图片
【发布时间】:2020-10-29 11:43:30
【问题描述】:

我正在尝试获取页面上图片的 src 属性,然后下载该图片,这是我的代码

picURL = "https://iofferman.x.yupoo.com/33269655?uid=1"

Set htmlPic = GetHTML(picURL)
Debug.Print Replace(htmlPic.querySelector(".viewer__imgwrap img").getAttribute("src"), "about:", "https:")
Dim myPic As String
myPic = Replace(htmlPic.querySelector(".viewer__imgwrap img").getAttribute("src"), "about:", "https:")
'URLDownloadToFile 0, myPic, ThisWorkbook.Path & "\" & picID & ".jpg", 0, 0
Call SaveWebFile(myPic, ThisWorkbook.Path & "\" & picID & ".jpg")

这个和代码有关

Function GetHTML(ByVal sURL As String) As HTMLDocument
    Dim http As MSXML2.XMLHTTP60, html As MSHTML.HTMLDocument
    Set http = New MSXML2.XMLHTTP60
    Set html = New MSHTML.HTMLDocument
    With http
        .Open "Get", sURL, False
        .send
        html.body.innerHTML = .responseText
    End With
    Set GetHTML = html
End Function

这是下载图片的UDF

Function SaveWebFile(ByVal sFile$, ByVal sPath$) As Boolean
    Dim f&, oResp() As Byte
    With CreateObject("MSXML2.ServerXMLHTTP")
        .Open "GET", sFile, False
        .send
        Do While (.readyState <> 4): DoEvents: Loop
        oResp = .responseBody
    End With
    f = FreeFile
    If Dir(sPath) <> "" Then Kill sPath
    Open sPath For Binary As #f
    Put #f, , oResp
    Close #f
End Function

我可以获取图片的链接,例如:https://photo.yupoo.com/iofferman/2d03c9b8/326e8e47.jpg,但是当导航到它时,有时我可以正确获取图片,有时会给出不正确的输出,例如http://adc.yupoo.com/res/703.gif。如何正确下载图片?

【问题讨论】:

  • 我不得不删除我的答案。链接https://iofferman.x.yupoo.com/33269655?uid=1 不是图片链接。这是一个网页链接。如果你查看网页的来源,你会看到图片的实际链接是"//photo.yupoo.com/iofferman/2d03c9b8/326e8e47.jpg"你可以看到在页面的来源&lt;a id="viewer__origin_img" target="_blank" class="button small onlydesktop" href="//photo.yupoo.com/iofferman/2d03c9b8/326e8e47.jpg"&gt;Original image&lt;/a&gt;你需要寻找锚文本Original image然后提取从那里链接
  • 这就是问题所在。当您取出此链接并尝试查看图像时(有时有效,有时给我另一张被认为不正确的图片)
  • 您需要查找锚文本Original image,然后从那里提取链接。这样,您将始终获得正确的链接
  • 什么锚文本?你能把这张图片的链接提取出来试试吗?不是正确的链接https//photo.yupoo.com/iofferman/2d03c9b8/326e8e47.jpg吗?
  • Isn't the correct link https//photo.yupoo.com/iofferman/2d03c9b8/326e8e47.jpg 是的。这就是我在上面发布的第一条评论中提到的。在浏览器中打开链接https://iofferman.x.yupoo.com/33269655?uid=1,然后右键单击它并单击View Source。在那里你可以看到网页的来源。搜索文本Original image。在那里你可以看到实际的链接。如果您可以提供几个链接,我可以建议一个代码从中提取链接

标签: excel vba xmlhttprequest


【解决方案1】:

您可以通过 ADODB.Stream 下载图片:

Sub DownloadFile(ImageURL, SavePath)

    Dim WinHttpReq As Object

    Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
    WinHttpReq.Open "GET", ImageURL, False
    WinHttpReq.send
    
    If WinHttpReq.Status = 200 Then
        Set MyStream = CreateObject("ADODB.Stream")
        MyStream.Open
        MyStream.Type = 1
        MyStream.Write WinHttpReq.responseBody
        MyStream.SaveToFile SavePath, 2 ' 1: Don't overwrite, 2: Overwrite
        MyStream.Close
    End If

End Sub

【讨论】:

  • 非常感谢。我在这一行被拒绝访问winHttpReq.send
  • 像这样添加访问凭据:WinHttpReq.Open "GET", ImageURL, False, "username", "password"
  • 即使在输入凭据后,我仍然会拒绝访问。
  • http://adc.yupoo.com/res/703.gif 是一个小GIF,有中文文字,我看不懂。但是文件名“703”可能暗示这是一条703错误信息,“远程访问错误”。我的猜测是正在进行服务器重定向,可能是因为预期的图像不可用。这是服务器问题,不是 VBA 问题。
  • 如果是服务器重定向,可能是有意阻止脚本抓取图像。显然 703 错误也可能是由防火墙或 AV 引起的,或者可能是访问凭据的问题——基本上是任何干扰您访问资源的能力的问题。如果你想更深入地研究这个问题,你应该发布一个以此为主题的新问题。
猜你喜欢
  • 2013-11-27
  • 2020-10-08
  • 2011-03-03
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 2021-01-29
  • 2012-01-13
  • 2013-07-03
相关资源
最近更新 更多