能否使用Selenium抓取网站产品图片并以页面标注的产品名称命名保存?
需求可行性结论
该需求完全可以通过Selenium实现,整体实现逻辑清晰,站点结构也符合自动化爬取的适配条件,具体实现步骤和注意事项如下:
实现步骤
- 第一步:初始化Selenium驱动,访问产品列表页
http://www.laboory.com/products,通过CSS选择器/XPath定位所有产品详情页的跳转链接,去重后存储为列表备用。 - 第二步:遍历产品链接列表,逐个加载产品详情页,首先定位General(概况)分区的产品名称元素,提取文本内容后提前替换掉
/ \ : * ? " < > |等Windows/Linux系统不允许出现在文件名中的特殊字符,避免后续保存文件报错。 - 第三步:定位页面上的Gallery(图集)子菜单按钮,执行点击操作切换到图集分区,通过显式等待确保分区内容、所有图片资源加载完成。如果站点采用图片懒加载策略,可以补充执行页面滚动操作,触发所有图片的加载逻辑。
- 第四步:提取Gallery分区下所有图片的资源链接,按出现顺序给图片编号,拼接成
{产品名称}{序号}.jpg格式的文件名,调用requests库下载图片资源到指定本地路径即可。
核心代码示例(简化版)
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import requests import re # 初始化驱动 driver = webdriver.Chrome() wait = WebDriverWait(driver, 10) # 1. 获取所有产品链接 driver.get("http://www.laboory.com/products") product_links = [elem.get_attribute("href") for elem in driver.find_elements(By.CSS_SELECTOR, "替换为实际的产品链接选择器")] product_links = list(set(product_links)) # 去重 for link in product_links: driver.get(link) # 2. 提取产品名 product_name = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "替换为General区产品名选择器"))).text.strip() # 替换非法文件名字符 product_name = re.sub(r'[\\/:*?"<>|]', '_', product_name) # 3. 切换到Gallery分区 wait.until(EC.element_to_be_clickable((By.XPATH, "//*[text()='Gallery']"))).click() # 等待图片加载 img_elements = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "替换为Gallery区图片选择器"))) # 4. 下载图片 for idx, img_elem in enumerate(img_elements, start=1): img_url = img_elem.get_attribute("src") resp = requests.get(img_url) with open(f"./自定义保存路径/{product_name}{idx}.jpg", "wb") as f: f.write(resp.content) driver.quit()
注:代码中的元素选择器需要根据页面实际的DOM结构调整替换即可。
注意事项
- 如果站点有反爬机制,可以适当增加请求间隔时间,或者配置Selenium的无头模式、自定义UA头,降低被拦截的概率。
- 如果图片是动态加载的,可以补充滚动触发逻辑,确保所有图片资源都能正常获取。
内容的提问来源于stack exchange,提问作者Lunedor
相关产品推荐
相关产品推荐

