excel VBA从HTML网页抓取URL(src="”)

yhxst69z  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(172)

我试着合并代码部分,我可以使工作,但它是工作与,但它是不工作与谁能帮助使它的工作?
我试图得到:https://www.lego.com/cdn/cs/set/assets/blt34360a0ffaff7811/11015_alt.png?fit=bounds&format=png&width=800&height=800&dpr=1从以下代码:

<img src="https://www.lego.com/cdn/cs/set/assets/blt34360a0ffaff7811/11015_alt.png?fit=bounds&amp;format=png&amp;width=800&amp;height=800&amp;dpr=1" alt="" class="Imagestyles__Img-sc-1qqdbhr-0 cajeby">

Code part where i want to get the Src url

Sub picgrab()

  Dim Doc As Object  
  Dim nodeAllPic As Object
  Dim nodeOnePic As Object
  Dim pic As Object

  Set Doc = CreateObject("htmlFile")

  With CreateObject("MSXML2.XMLHTTP.6.0")
  
    url = "https://www.lego.com/hu-hu/product/around-the-world-11015"
    .Open "GET", url, False
    .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
    .send
' It is important that i can't use InternetExplorer.

'This should work i guess, but it skips after 'For Each' line.
    Set nodeAllPic = Doc.getElementsByClassName("Imagestyles__Img-sc-1qqdbhr-0 cajeby")

    For Each nodeOnePic In nodeAllPic
        If nodeOnePic.getAttribute("class") = "Imagestyles__Img-sc-1qqdbhr-0 cajeby" Then
           Set pic = nodeOneVip.getElementsByClassName("Imagestyles__Img-sc-1qqdbhr-0 cajeby")(0)
           ActiveCell.Value = pic.getAttribute("src")
        
        End If
    Next nodeOnePic
  
  End With
  
End Sub

我厌倦了上面的代码,并修改了它的许多方式,但不能得到的Src="”的内容。

qpgpyjmq

qpgpyjmq1#

需要写入响应

首先,你从来没有为htmlfile对象编写HTML响应,所以当你调用getElementsByClassName方法时,你什么也找不到。
在尝试使用Doc对象之前,请确保包含以下行:

Doc.Write .responseText

动态内容

其次,该页面上的一些内容不在XMLHTTP接收的原始HTTP请求中,该页面包含动态加载内容的JavaScript代码。
要在Chrome中测试这一点,您可以打开该页面上的Chrome DevTools窗口,然后disable JavaScript并刷新页面。
然后,您将看到原始HTML和一个通知,说明JavaScript已禁用。

现在,如果您在Elements选项卡中搜索,您将找不到您要查找的元素(至少我找不到任何带有类“cajeby”的元素)。

浏览器仿真

那么,现在该怎么办呢?你需要使用一个对象来操纵原始响应以执行JavaScript代码。为此,你可以使用Selenium。这是使用VBA进行web抓取或任何浏览器自动化的现代方法。
您可以很容易地找到关于如何开始使用Selenium for VBA的教程,但我会推荐WiseOwlTutorials的这款video
那么您的代码可能如下所示:

Dim Browser As New Selenium.WebDriver
    Browser.Start "chrome", "https://www.lego.com/hu-hu/product/around-the-world-11015"
    Browser.Get "/"
    
    Dim img As WebElement
    Set img = Browser.FindElementByCss(".Imagestyles__Img-sc-1qqdbhr-0.cajeby", timeout:=5000)
    
    Debug.Print img.Attribute("src")
    
    Set Browser = Nothing
关于代码的一些注解
  • 确保已包含对Selenium库的引用
  • 注意FindElementByCss的使用,这是必要的,因为您使用了2个类名,并且目前没有其他方法支持它,但是您需要使用CSS选择器语法(更多关于here的信息)。
  • 注意timeout:=5000的使用,它让Selenium知道您愿意等待最多5000毫秒,以便JavaScript代码加载您正在查找的内容(更多详细信息here)。

相关问题