使用Selenium+XPath爬取Morningstar.com数据遇问题求排查
解决Selenium爬取Morningstar ETF/共同基金数据失败的问题
我帮你分析下代码跑不通的几个常见原因,结合你的情况来看大概率是这些点:
1. 页面动态加载导致元素未及时渲染
Morningstar的页面是动态渲染的,你的代码在打开页面后立刻就去查找元素,这时候浏览器可能还没加载完目标元素,自然拿不到数据。这是动态页面爬取里最常见的坑。
2. 元素定位方法的小疏漏
你用了find_elements_by_xpath(复数形式),它返回的是匹配到的元素列表,就算找到元素也只会打印列表对象,而不是你要的实际数据。如果目标元素是唯一的,应该用单数的find_element_by_xpath,再获取它的文本或者属性值。
修复后的代码示例
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() link = "https://www.morningstar.com/etfs/bats/maga/quote.html" driver.get(link) try: # 等待NAV元素加载完成,最多等10秒 tna_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//td[@class="gr_table_colm2b"]//span[@id="NAV"]')) ) print("TNA值:", tna_element.text) # 等待货币元素加载完成 currency_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//span[@class="gr_text3" and @id="navCurrency"]')) ) print("货币:", currency_element.text) finally: driver.close()
额外需要排查的点
- 如果还是拿不到元素,检查页面是否存在iframe:打开浏览器开发者工具,看看目标元素是不是嵌套在某个iframe里,如果是,需要先切换到对应的iframe再执行元素查找。
- 留意页面反爬机制:比如是否需要登录验证,或者有Cloudflare之类的人机验证步骤,不过从你能正常启动Chrome打开页面来看,这个可能性相对较低,但也可以确认下页面加载时有没有弹出验证窗口。
内容的提问来源于stack exchange,提问作者Stefano Leone
相关产品推荐
相关产品推荐

