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

Python Selenium爬取网页图片仅得3张,无法获取全部图片如何解决

问题原因

你只能爬到3张图核心是两个问题:

  • 页面用了Swiper轮播组件放穿搭图,初始只加载视口内可见的前3张,这部分图片才会带lazyloaded类名,剩下没进入视口、没触发轮播切换的图片都是懒加载待加载状态,类名是lazyload,根本不会被你写的.p-link-card__image-body--contain.lazyloaded选择器匹配到。
  • 你把滚动页面的代码注释掉了,也没有触发轮播滑动,未加载的图片连真实的src地址都不会渲染到DOM里,自然选不出来。另外你循环里用driver.get(src)直接跳去图片地址,只要跳一次,原页面的DOM就失效了,哪怕后面返回也得重新选元素,逻辑本身也有问题。
修复代码
import time
import requests
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
# 需要无头模式可以放开下面这行配置
# options.add_argument('--headless=new')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
site = "https://crosset.onward.co.jp/coordinate/2828615"
driver.get(site)
wait = WebDriverWait(driver, 10)

# 等页面标题加载完成
name = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "c-breadcrumb__head-text"))).get_attribute("innerText").strip()
# 拿到轮播组件下所有slide节点,不要过滤lazyloaded类
swiper_slides = driver.find_elements(By.CSS_SELECTOR, ".p-styling-image.p-styling-image__content .swiper-slide")
print(f"检测到总轮播图数量:{len(swiper_slides)}")

img_urls = []
# 逐个触发轮播切换加载图片
for idx, slide in enumerate(swiper_slides):
    slide.click()
    time.sleep(0.3)
    # 等当前激活的slide里的图片加载完成再取地址
    active_img = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".swiper-slide-active .p-link-card__image-body--contain")))
    src = active_img.get_attribute("src")
    if src not in img_urls:
        img_urls.append(src)
        print(f"已获取第{len(img_urls)}张图片地址")

# 直接用请求下载图片,不用跳页
for idx, img_url in enumerate(img_urls):
    resp = requests.get(img_url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"})
    with open(f"{name}_{idx+1}.png", "wb") as f:
        f.write(resp.content)
        print(f"第{idx+1}张图片保存完成")

driver.quit()
关键改动说明
  • 移除了选择器里的.lazyloaded筛选条件,先把所有轮播项节点全部获取,不会漏掉未加载的图片
  • 逐个点击轮播项触发组件切换,等当前轮播项变为激活状态、图片加载完成后再提取src,能拿全全部10张穿搭图
  • 改用HTTP请求直接下载图片,避免跳转图片地址导致原页面DOM失效的问题,下载效率更高
  • 增加显式等待逻辑,避免页面未加载完成就操作元素触发报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:06:24