使用Selenium与chromedriver爬取时如何提取event__time排除event__stage
实现方法
你当前直接通过event__time类名匹配元素的写法,会把同时携带event__stage类的节点也抓取到——这类节点是赛程阶段分隔标识,不是你需要的比赛时间数据,通过CSS选择器做反向过滤即可解决,同时建议替换Selenium新版本中已经废弃的旧定位API,增加显式等待避免动态加载导致的数据抓取不全问题。
核心修改点
- 导入Selenium的
By类,替换已废弃的find_elements_by_class_name定位方法 - 使用CSS选择器
.event__time:not(.event__stage)做精准匹配,直接过滤掉带event__stage类的无效节点,这个表达式的含义是:选中所有class包含event__time、且class不包含event__stage的元素 - 增加显式等待逻辑,等页面动态加载完目标元素再执行抓取,比固定时长的
time.sleep()效率更高、稳定性更好 - 合并文本提取和换行替换的逻辑,减少冗余循环
修改后完整代码
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 import pandas as pd country = 'china' ligue = 'cba' year= '2021-2022' url = f'https://www.flashscore.es/baloncesto/{country}/{ligue}/resultados/' driver = webdriver.Chrome() driver.get(url) # 等待过滤后的比赛时间元素加载完成,最长等待10秒 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.event__time:not(.event__stage)'))) # 直接抓取过滤后的有效节点 time_nodes = driver.find_elements(By.CSS_SELECTOR, '.event__time:not(.event__stage)') # 提取文本并替换换行符 data_clean = [node.text.replace("\n", ";") for node in time_nodes] # 导出CSV df = pd.DataFrame(data_clean) df.to_csv(f'{country}{ligue}{year}.csv', index=False) # 抓取完成后关闭浏览器 driver.quit()
如果需要抓取更多历史数据,只需要在定位元素前加页面滚动逻辑,触发页面加载更多已完赛的赛程数据即可。
内容的提问来源于stack exchange,提问作者Enrique Ramirez Moreno
相关产品推荐
相关产品推荐

