使用Python的lxml、requests爬取Google Finance股票数据XPath返回空问题
问题原因
- 页面数据为JavaScript动态渲染:
requests只能获取初始静态HTML内容,你需要的股票价格数据是页面加载后通过异步接口请求、JS渲染生成的,初始HTML中不存在对应元素,因此xpath匹配结果为空。 - 所用Xpath稳定性极低:你使用的是浏览器自动生成的全层级Xpath,其中
yDmH0d属于Google页面动态生成的随机ID,不同访问场景下ID、页面层级都会发生变化,硬写该路径天然无法稳定匹配元素。 - 未携带合法请求头:Google会拦截无有效
User-Agent的请求,返回验证码页或错误页,你拿到的返回内容本身就不是正常的股票详情页,自然找不到目标元素。
解决方法
方案1:使用动态渲染工具爬取(推荐,适配性更高)
使用Selenium、Playwright等工具模拟真实浏览器运行,等待页面JS执行完成后再提取数据,同时使用更稳定的属性匹配规则,避免依赖动态ID和全层级路径。
示例代码(以Playwright为例):
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") page.goto("https://www.google.com/finance/quote/HPQ:NYSE?comparison=NASDAQ%3AINTC%2CNASDAQ%3AAAPL%2CNASDAQ%3AAVGO%2CNASDAQ%3AQCOM") # 等待价格元素加载完成 page.wait_for_selector("[data-last-price]", timeout=5000) # 提取所有对比股票的价格,对应data-last-price属性就是实时价格 price_elements = page.locator("[data-last-price]").all() prices = [float(elem.get_attribute("data-last-price")) for elem in price_elements] print(prices) browser.close()
方案2:优化requests请求+解析静态预存数据
Google Finance的初始静态HTML中会将基础数据存在<script>标签内,你可以携带UA请求页面后,用正则匹配提取对应股票的价格数据,无需依赖动态渲染。
import requests import re headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } url = "https://www.google.com/finance/quote/HPQ:NYSE?comparison=NASDAQ%3AINTC%2CNASDAQ%3AAAPL%2CNASDAQ%3AAVGO%2CNASDAQ%3AQCOM" resp = requests.get(url, headers=headers) # 匹配所有带data-last-price属性的元素值 price_pattern = re.compile(r'data-last-price="(\d+\.?\d*)"') prices = price_pattern.findall(resp.text) print([float(p) for p in prices])
内容的提问来源于stack exchange,提问作者TJ1
相关产品推荐
相关产品推荐

