You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的核心是元素引用失效:

  1. 每次循环中获取分页链接时,依赖的是当前页面的DOM元素,但页面跳转后,之前页面的DOM已被销毁,后续循环再查找该元素会导致引用失效。
  2. 即使等待元素可见,页面动态渲染过程中,部分元素可能在遍历前就已被更新或移除,导致引用失效。

修复方案

修复后的代码

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()

关键修复点

  1. 构造分页URL:进入分类页后,提取基础URL,通过拼接?page={page}直接生成分页链接,彻底避免依赖页面上的分页元素,从根源解决引用失效问题。
  2. 等待元素集合可见:使用visibility_of_all_elements_located等待所有商品元素加载完成,确保获取的元素列表是当前页面的有效引用。
  3. 异常捕获:遍历元素时添加异常捕获,即使个别元素引用失效,也不会中断整个爬取流程。

内容的提问来源于stack exchange,提问作者Nguyễn Thành Đạt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:54:55