Selenium爬取Tipranks页面数据返回空结果问题排查求助
问题描述
尝试使用Selenium爬取Tipranks分析师页面(示例链接:https://www.tipranks.com/experts/analysts/dan-payne)的"Success Rate"数据,编写的代码如下:
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 time driver = webdriver.Chrome('chromedriver') url = 'https://www.tipranks.com/experts/analysts/john-pitzer' driver.get(url) time.sleep(30) elements = driver.find_elements(By.CSS_CLASS,"override") # 浏览器检查器中定位到的元素:<text class="override fontSizemedium colorgreen fontWeightsemibold" x="50%" y="50%" fill="#1ead00" text-anchor="middle" dy="0.28em">69%</text> for all in elements: print(all.text)
运行后返回空结果,无论是用该CSS选择器还是复制的XPATH(示例:/html/body/div[1]/div[2]/div[4]/div/div[3]/div[1]/div[1]/div[1]/div[2]/div[3]/div[2]/div[2]/div[2]/div[1]/div[2]/svg/g/text)都无法获取有效数据,需要排查问题原因。
问题排查与解决方案
1. 元素定位参数错误
你使用的By.CSS_CLASS是无效参数,Selenium中定位class的正确方式是By.CLASS_NAME,或者用By.CSS_SELECTOR配合CSS语法。另外目标元素的class是多值组合,用By.CLASS_NAME只能指定单个class(如override),但页面中可能存在大量同名元素,导致定位精度不足。
2. SVG元素的特殊定位规则
目标数据位于<svg>内部的<text>标签中,Selenium对SVG元素的定位需要特殊语法:
- CSS选择器需明确关联SVG层级,比如:
svg g text.override.fontSizemedium - 避免使用绝对XPATH(极易因页面结构变动失效),改用相对路径,比如:
//svg//g//text[contains(@class, 'override') and contains(@class, 'colorgreen')]
3. 等待机制优化
固定的time.sleep(30)无法保证元素已加载完成,改用显式等待精准等待目标元素:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化等待对象,最长等待20秒 wait = WebDriverWait(driver, 20) # 等待SVG内的目标文本元素出现 success_rate_element = wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, 'svg g text.override.fontSizemedium.colorgreen') )) print(success_rate_element.text)
4. 反爬机制应对
Tipranks可能存在反爬检测,可通过以下方式优化:
- 添加浏览器参数模拟真实用户环境:
options = webdriver.ChromeOptions() options.add_argument('--disable-blink-features=AutomationControlled') options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36') driver = webdriver.Chrome(options=options)
- 检查页面是否需要登录才能查看完整数据,若有登录弹窗需先完成登录流程。
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

