新手求助:编写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
相关产品推荐
相关产品推荐

