Selenium Python爬取Tiki.vn遇StaleElementReferenceException问题求助
解决Selenium爬取Tiki.vn时的StaleElementReferenceException错误
问题场景
尝试用Selenium爬取零售网站Tiki.vn的手机信息,计划爬取3页内容。第一页运行正常,但后续页面触发StaleElementReferenceException错误,已尝试WebDriverWait、time.sleep等方法仍未解决。
原代码
driver = webdriver.Chrome() driver.get('https://tiki.vn/') category = driver.find_element(By.XPATH,"//a[@title='Điện Thoại - Máy Tính Bảng']").click() phone_information = [] for page in range(1,4): next_page = driver.find_element(By.XPATH, '//a[@data-view-label="{}"]'.format(page)).get_attribute('href') driver.get(next_page) element = (By.XPATH, '//div[@class="inner"]') WebDriverWait(driver, 30).until(EC.visibility_of_element_located(element)) phone_names = driver.find_elements(By.XPATH , '//div[@class="info"]') for phone in phone_names: print(phone.text) WebDriverWait(driver, 60) driver.quit()
报错信息
StaleElementReferenceException Traceback (most recent call last) Cell In[7], line 16 14 time.sleep(10) 15 for phone in phone_names: ---> 16 print(phone.text) 17 time.sleep(20) 19 WebDriverWait(driver, 60)
问题原因
StaleElementReferenceException的核心是元素引用失效:
- 每次循环中获取分页链接时,依赖的是当前页面的DOM元素,但页面跳转后,之前页面的DOM已被销毁,后续循环再查找该元素会导致引用失效。
- 即使等待元素可见,页面动态渲染过程中,部分元素可能在遍历前就已被更新或移除,导致引用失效。
修复方案
修复后的代码
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 driver = webdriver.Chrome() driver.get('https://tiki.vn/') # 进入手机分类页 driver.find_element(By.XPATH,"//a[@title='Điện Thoại - Máy Tính Bảng']").click() # 获取分类页基础URL,用于构造分页链接 WebDriverWait(driver, 30).until(EC.url_contains("dien-thoai-may-tinh-bang")) base_url = driver.current_url.split('?')[0] phone_information = [] for page in range(1, 4): # 直接构造分页URL,避免依赖页面元素 page_url = f"{base_url}?page={page}" driver.get(page_url) # 等待页面商品列表加载完成 WebDriverWait(driver, 30).until( EC.visibility_of_all_elements_located((By.XPATH, '//div[@class="info"]')) ) # 重新获取当前页面的手机元素列表 phone_names = driver.find_elements(By.XPATH, '//div[@class="info"]') for phone in phone_names: try: phone_text = phone.text print(phone_text) phone_information.append(phone_text) except: # 若元素引用失效,跳过该元素或重新获取 continue driver.quit()
关键修复点
- 构造分页URL:进入分类页后,提取基础URL,通过拼接
?page={page}直接生成分页链接,彻底避免依赖页面上的分页元素,从根源解决引用失效问题。 - 等待元素集合可见:使用
visibility_of_all_elements_located等待所有商品元素加载完成,确保获取的元素列表是当前页面的有效引用。 - 异常捕获:遍历元素时添加异常捕获,即使个别元素引用失效,也不会中断整个爬取流程。
内容的提问来源于stack exchange,提问作者Nguyễn Thành Đạt
相关产品推荐
相关产品推荐

