Python+Edge环境下Selenium无法获取Shopee全部目标元素求助
解决Shopee搜索页无法获取全部60个商品元素的方案
核心问题原因
Shopee搜索结果采用滚动懒加载机制,初始仅渲染30个商品,剩余30个需要触发页面滚动才会加载;另外WebDriver默认窗口过小可能导致页面无滚动条,无法触发加载逻辑。
具体解决步骤
调整浏览器窗口大小
启动Edge驱动后先最大化窗口,确保页面出现滚动条:from selenium import webdriver from selenium.webdriver.edge.options import Options from selenium.webdriver.common.by import By import time options = Options() driver = webdriver.Edge(options=options) driver.maximize_window() # 最大化窗口 driver.get("https://shopee.vn/search?keyword=iphone&page=0&sortBy=sales")模拟滚动到底部触发加载
循环执行JavaScript滚动,直到商品数量达到60个或者滚动多次后停止:# 等待初始页面加载 time.sleep(3) target_count = 60 current_count = len(driver.find_elements(By.CSS_SELECTOR, "div[data-sqe='name']")) while current_count < target_count: # 执行JavaScript滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待加载新内容 time.sleep(2) # 更新当前商品数量 current_count = len(driver.find_elements(By.CSS_SELECTOR, "div[data-sqe='name']")) # 防止无限循环,最多滚动5次 if current_count == len(driver.find_elements(By.CSS_SELECTOR, "div[data-sqe='name']")) and current_count < target_count: break获取全部商品名称
修正原CSS选择器,直接定位带[data-sqe='name']的元素:names = [elem.text for elem in driver.find_elements(By.CSS_SELECTOR, "div[data-sqe='name']")] print(f"共获取到{len(names)}个商品名称") print(names) driver.quit()优化:用显式等待替代固定睡眠
固定睡眠不够灵活,改用显式等待等待新元素加载:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 滚动后等待新元素出现 WebDriverWait(driver, 10).until( lambda d: len(d.find_elements(By.CSS_SELECTOR, "div[data-sqe='name']")) > current_count )
额外注意事项
- 若滚动后仍无法加载,可尝试模拟滚动到某个特定元素位置,而非直接到底部
- 部分地区Shopee可能有反爬机制,可适当增加滚动间隔,避免触发限制
内容的提问来源于stack exchange,提问作者Luận Đặng Văn
相关产品推荐
相关产品推荐

