使用Selenium 4.8.2+Python爬取电商网站无输出无报错求解决
问题分析与解决方案
你的代码没有输出的核心原因有三个:动态生成的CSS类名导致元素定位失败、使用find_elements()而非find_element()、固定等待不可靠。以下是具体修正方案:
问题点拆解
- 动态class名失效:代码中使用的
sc-bcXHqe ergypN这类class是前端构建工具动态生成的,页面更新或环境变化时会改变,导致divs始终是空列表,循环根本没执行。 find_elements()使用错误:该方法返回元素列表,直接调用.text会抛出AttributeError,但被try-except捕获后赋值为空字符串,你看不到错误信息。每个产品卡片里的标题、价格、评分都是唯一的,应该用find_element()(单数)。- 固定等待不稳定:
time.sleep(15)不能保证元素完全加载,可能页面还没渲染完就开始查找元素,导致定位失败。
修正后的代码
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 json # 初始化浏览器 driver = webdriver.Chrome() driver.minimize_window() url = "https://www.meesho.com/crepe-kurtis/p/156p4t" driver.get(url) # 显式等待产品卡片加载完成,最多等待20秒 wait = WebDriverWait(driver, 20) # 改用更稳定的定位:通过组件基础类名前缀匹配 divs = wait.until(EC.presence_of_all_elements_located( (By.XPATH, "//div[contains(@class, 'NewProductCardstyled__CardStyled')]") )) print(f"找到{len(divs)}个产品卡片") # 调试用,确认是否找到元素 product_info = [] for div in divs: # 提取标题 try: title = div.find_element(By.XPATH, ".//p[contains(@class, 'StyledDesktopProductTitle')]").text except: title = '' # 提取价格 try: price = div.find_element(By.XPATH, ".//h5[contains(@class, 'iIAyXW')]").text except: price = '' # 提取评分 try: rating = div.find_element(By.XPATH, ".//span[contains(@class, 'eXFtxl')]").text except: rating = '' product_info.append({ 'title': title, 'price': price, 'rating': rating }) # 写入JSON文件,避免中文乱码 with open('data.json', 'w', encoding='utf-8') as f: json.dump(product_info, f, ensure_ascii=False, indent=4) print("数据已成功写入data.json") driver.quit()
关键优化说明
- 稳定定位:用
contains(@class, '固定前缀')替代完整的动态class名,组件基础类名不会轻易改变,避免定位失效。 - 显式等待:
WebDriverWait会等待元素出现后再执行后续代码,比固定sleep更可靠,节省不必要的等待时间。 - 调试输出:增加元素数量打印,快速确认是否成功定位到目标元素,方便排查问题。
- 编码处理:写入JSON时指定UTF-8编码和关闭ASCII转义,避免中文内容乱码。
内容的提问来源于stack exchange,提问作者abadyal
相关产品推荐
相关产品推荐

