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

新手求助:编写Selenium Python XPath代码实现TV型号定时爬取

解决方案:Selenium爬取TV型号列表并定时检测更新

1. 正确定位目标元素的XPath写法

你的目标元素带有多个class属性,直接匹配完整class可能因属性顺序问题失效,推荐用contains组合匹配关键class,确保定位精准:

//*[contains(@class, 'crux-product-title') and contains(@class, 'classic-view__brand-and-model')]

如果确认页面中该class组合唯一且顺序固定,也可以直接匹配完整class:

//*[@class='crux-product-title crux-product-title--small classic-view__brand-and-model']

2. 解决TypeError: object of type 'WebElement' has no len()错误

这个错误是因为你误用了driver.find_element()(返回单个WebElement对象)却尝试获取长度。要获取所有匹配的元素,必须用复数形式的find_elements(),它会返回元素列表,支持len()和遍历操作。

完整爬取代码示例

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import schedule
import time

# 初始化Chrome浏览器
driver = webdriver.Chrome()

# 登录逻辑(替换为你的实际登录步骤)
def login():
    driver.get("目标网站URL")
    # 示例:输入账号密码并登录
    # driver.find_element(By.ID, "username").send_keys("你的账号")
    # driver.find_element(By.ID, "password").send_keys("你的密码")
    # driver.find_element(By.ID, "login-btn").click()

# 爬取所有TV型号列表
def get_tv_models():
    # 显式等待10秒,确保所有目标元素加载完成
    tv_elements = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located(
            (By.XPATH, "//*[contains(@class, 'crux-product-title') and contains(@class, 'classic-view__brand-and-model')]")
        )
    )
    # 提取元素文本并整理为列表
    return [elem.text.strip() for elem in tv_elements]

# 定时检测排名变化
old_models = []
def check_ranking_update():
    current_models = get_tv_models()
    if current_models != old_models:
        print("TV型号排名已更新!")
        print("新排名:", current_models)
        # 可在此添加保存结果、发送通知等逻辑
        global old_models
        old_models = current_models.copy()
    else:
        print("TV型号排名无变化")

# 启动流程
login()
old_models = get_tv_models()
# 设置每10分钟执行一次检测任务
schedule.every(10).minutes.do(check_ranking_update)

# 保持程序运行
while True:
    schedule.run_pending()
    time.sleep(1)

新手指引方向

  • 明确find_element()和find_elements()的区别:前者获取单个元素,后者获取元素列表,爬取多个元素必须用后者
  • 优先使用显式等待:比time.sleep()更灵活,能有效避免页面加载延迟导致的元素查找失败
  • 定时任务用schedule库:比循环time.sleep(600)更易维护,支持修改定时规则、添加多任务
  • 检测变化的核心逻辑:将每次爬取的列表与上一次的列表直接对比,用!=判断即可,也可将历史数据保存到本地文件,重启程序后仍能继续对比

内容的提问来源于stack exchange,提问作者Johnksk12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:55:21