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
相关产品推荐
相关产品推荐

