You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium如何等待轮播图内图片完全加载且src属性有效填充

轮播图src属性可靠提取方案

你当前代码的核心问题是driver.get()执行完成后立刻抓取页面源码做解析,此时轮播组件内的img标签虽已完成DOM挂载,但真实src属性由前端JS异步填充,等待外层容器存在、等待img标签挂载、固定时长休眠三类方案,都无法精准匹配src属性赋值完成的时机,必然存在偶发失败的概率。

实现思路

采用Selenium自定义显式等待逻辑,直接校验目标业务状态,不依赖间接关联的元素状态判断:

  • 第一步先等待轮播外层容器完成挂载,将容器滚动到页面视口中间位置,触发可能存在的图片懒加载逻辑,避免图片因未进入可视区域始终不加载
  • 自定义等待轮询规则:每次检查轮播容器内的所有img标签,确认标签携带非空、非占位资源的有效src属性,直到满足预设的有效图片数量阈值、或等待超时才终止轮询
  • 必须等等待条件校验通过后,再抓取页面源码交给BeautifulSoup解析,避免拿到DOM未更新完成的静态快照

修正后代码

from bs4 import BeautifulSoup
import json
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

options = Options()
options.set_preference("dom.webnotifications.enabled", False)
options.set_preference("dom.push.enabled", False)
driver = webdriver.Firefox(options=options)
driver.maximize_window()
driver.set_page_load_timeout(30)
# 可根据实际网络情况调整等待超时时间
wait = WebDriverWait(driver, 15)

driver.get("https://www.homedepot.com.mx/electrico/placas-y-dimmers/placas-decorativas/tapa-i-tipo-quinzino-apag-sencillo-461027")

# 等待轮播容器挂载
carousel_wrapper = wait.until(
    EC.presence_of_element_located((By.CSS_SELECTOR, 'div[data-test="carousel-wrapper"]'))
)
# 滚动到轮播区域,触发懒加载
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", carousel_wrapper)

# 自定义等待条件:轮播内图片全部完成src赋值
def carousel_imgs_with_valid_src(driver):
    img_tags = carousel_wrapper.find_elements(By.TAG_NAME, 'img')
    valid_src_count = 0
    for img in img_tags:
        src = img.get_attribute('src')
        # 过滤空值、base64占位图、加载中临时资源
        if src and not src.startswith('data:image') and 'loading' not in src.lower():
            valid_src_count += 1
    # 可根据需求调整有效图片阈值,示例为最多取6张
    return valid_src_count >= min(len(img_tags), 6)

# 等待条件满足后再解析页面
wait.until(carousel_imgs_with_valid_src)
prod_soup = BeautifulSoup(driver.page_source, "html.parser")

pics_json = ""
pictures = []
pictures_container = prod_soup.find(
    "div", {"data-test": "carousel-wrapper"}
)
if pictures_container:
    picture_tags = pictures_container.find_all("img")
    if picture_tags:
        max_pictures = 0
        for pic_tag in picture_tags:
            try:
                src = pic_tag["src"]
                # 二次过滤无效src,和等待逻辑保持一致
                if not src.startswith('data:image') and 'loading' not in src.lower():
                    pictures.append(src)
            except Exception as ex:
                print(ex)
            max_pictures = max_pictures + 1
            if max_pictures >= 6:
                break
        pics_json = json.dumps(pictures)

print(pics_json)
driver.quit()

适配说明

如果目标站点采用懒加载方案将真实图片地址存放在data-src、data-lazy-src这类自定义属性上,只需要在自定义等待逻辑、后续解析逻辑中,同步读取对应属性做校验和提取即可,不需要修改整体等待框架。

内容的提问来源于stack exchange,提问作者Alain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:31:15