VBA网页抓取问题:无法提取HTML中img标签的src属性
解决VBA抓取乐高产品页特定
标签src的问题
我来帮你搞定这个网页抓取的问题!你说代码能处理<span>和<meta>标签,但抓不到目标<img>的src,而且循环直接跳过,大概率是两个原因:要么是你对复合class的元素选择方式错了,要么是页面是JS动态渲染的,静态抓取拿不到内容。下面给你分两种情况的解决方案,都不用IE:
一、静态抓取方案(适用于页面内容是静态输出的情况)
这个方案用MSXML2获取页面原始HTML,再用HTMLDocument解析,速度快还不用开浏览器。核心是正确处理带多个class的元素选择:
Sub GetLegoImageSrc() Dim xmlHttp As Object Dim htmlDoc As Object Dim imgElements As Object Dim imgElement As Object Dim url As String url = "https://www.lego.com/hu-hu/product/around-the-world-11015" ' 创建XMLHTTP对象(后期绑定,不用添加引用) Set xmlHttp = CreateObject("MSXML2.XMLHTTP.6.0") ' 设置请求头,模拟浏览器访问(避免被网站拦截) xmlHttp.Open "GET", url, False xmlHttp.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" xmlHttp.send ' 检查请求是否成功 If xmlHttp.Status <> 200 Then MsgBox "请求失败,状态码: " & xmlHttp.Status Exit Sub End If ' 加载HTML内容到文档对象 Set htmlDoc = CreateObject("HTMLFile") htmlDoc.body.innerHTML = xmlHttp.responseText ' 关键:用CSS选择器匹配带两个class的img标签 ' 复合class的选择器写法是 .class1.class2(两个class用点连接,不要空格) Set imgElements = htmlDoc.querySelectorAll(".Imagestyles__Img-sc-1qqdbhr-0.cajeby") ' 遍历提取src属性 If imgElements.Length > 0 Then For Each imgElement In imgElements ' getAttribute比直接用imgElement.src更可靠,能避免相对路径转绝对路径的问题 Debug.Print "图片链接: " & imgElement.getAttribute("src") Next imgElement Else MsgBox "没找到目标图片!可能页面是JS动态加载的,试试下面的Selenium方案" End If ' 释放对象 Set imgElement = Nothing Set imgElements = Nothing Set htmlDoc = Nothing Set xmlHttp = Nothing End Sub
为什么之前的循环会跳过?
你之前可能用了getElementsByClassName("Imagestyles__Img-sc-1qqdbhr-0 cajeby"),这个方法只接受单个class名称,带空格的复合class会直接返回空集合,自然就跳过循环了。用querySelectorAll配合正确的CSS选择器就能解决这个问题。
二、动态抓取方案(适用于JS渲染的页面)
如果上面的静态方案找不到元素,说明这张图片是浏览器加载页面后通过JavaScript动态生成的,XMLHTTP拿不到渲染后的内容。这时候可以用Selenium模拟真实浏览器来抓取:
准备工作
- 下载和你的Chrome浏览器版本匹配的
ChromeDriver,放到系统PATH目录(比如C:\Windows),或者在代码里指定路径。 - 安装Selenium VBA(可以通过VBA编辑器的「工具」→「引用」添加
Selenium Type Library,或者用后期绑定)。
Sub GetLegoImageSrc_Selenium() Dim driver As Object Dim imgElements As Object Dim imgElement As Object Dim url As String url = "https://www.lego.com/hu-hu/product/around-the-world-11015" ' 启动Chrome浏览器(后期绑定写法) Set driver = CreateObject("Selenium.ChromeDriver") ' 如果ChromeDriver不在PATH里,手动指定路径: ' driver.SetBinaryPath "C:\你的路径\chromedriver.exe" driver.Start driver.Get url ' 等待页面完全加载(可以用显式等待更精准,这里简单用固定等待) driver.Wait 5000 ' 等待5秒 ' 用同样的CSS选择器找目标img Set imgElements = driver.FindElementsByCss(".Imagestyles__Img-sc-1qqdbhr-0.cajeby") If imgElements.Count > 0 Then For Each imgElement In imgElements Debug.Print "图片链接: " & imgElement.Attribute("src") Next imgElement Else MsgBox "还是没找到?检查下class名称有没有写错哦" End If ' 关闭浏览器 driver.Quit Set driver = Nothing End Sub
这个方案模拟真实用户浏览页面,能获取到所有JS渲染后的内容,几乎能解决所有动态页面的抓取问题。
内容的提问来源于stack exchange,提问作者hwka
相关产品推荐
相关产品推荐

