You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium find_elements获取TSLA全部历史数据失败求助

问题:无法获取雅虎财经TSLA更早的历史数据?

我用Selenium的find_elements方法爬取雅虎财经特斯拉(TSLA)的历史数据,但目前只能拿到截至2023年5月2日的记录,拿不到2022年9月23日及更早的数据,代码如下:

import os
import pandas as pd
import numpy as np
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import csv
import sys

driver = webdriver.Chrome()
driver.get('https://au.finance.yahoo.com/')
time.sleep(5)

search_box = driver.find_element(By.ID, 'yfin-usr-qry')
search_box.send_keys('TSLA')
time.sleep(5)
search_box.submit()
time.sleep(5)

historical_data = driver.find_element(By.XPATH, '//*[@id="quote-nav"]/ul/li[4]/a/span')
action = ActionChains(driver)
action.click(on_element = historical_data)
action.perform()
time.sleep(5)

Table  = driver.find_elements(By.XPATH, '//*[@id="Col1-1-HistoricalDataTable-Proxy"]/section/div[2]')
TableList=[]
for value in Table:
    TableList.append(value.text)
    print(value.text)

解决方案

雅虎财经历史数据页面默认只加载最近的部分数据,更早的数据需要手动调整日期范围或者滚动页面触发动态加载,以下是两种实用方法:

方法1:精准设置日期范围(推荐)

直接修改页面的日期选择器,指定你需要的起止日期,确保一次性加载目标时间段的所有数据:

import os
import pandas as pd
import numpy as np
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import csv

driver = webdriver.Chrome()
driver.get('https://au.finance.yahoo.com/')
time.sleep(3)

# 搜索TSLA
search_box = driver.find_element(By.ID, 'yfin-usr-qry')
search_box.send_keys('TSLA')
search_box.submit()
time.sleep(3)

# 进入历史数据页面
historical_data = driver.find_element(By.XPATH, '//*[@id="quote-nav"]/ul/li[4]/a/span')
historical_data.click()
time.sleep(3)

# 打开日期选择面板
date_range_btn = driver.find_element(By.XPATH, '//*[@id="Col1-1-HistoricalDataTable-Proxy"]/section/div[1]/div[1]/div[1]/div/div/div/span')
date_range_btn.click()
time.sleep(2)

# 设置起始日期为2022-09-23
start_date_input = driver.find_element(By.XPATH, '//*[@id="dropdown-menu"]/div/div[1]/input')
start_date_input.clear()
start_date_input.send_keys('2022-09-23')
time.sleep(1)

# 设置结束日期为2023-05-02(可选,默认是当前日期)
end_date_input = driver.find_element(By.XPATH, '//*[@id="dropdown-menu"]/div/div[2]/input')
end_date_input.clear()
end_date_input.send_keys('2023-05-02')
time.sleep(1)

# 应用日期筛选
apply_btn = driver.find_element(By.XPATH, '//*[@id="dropdown-menu"]/div/div[3]/button[1]')
apply_btn.click()
time.sleep(5)

# 获取完整表格数据
table = driver.find_element(By.XPATH, '//*[@id="Col1-1-HistoricalDataTable-Proxy"]/section/div[2]/table')
table_data = table.text
print(table_data)

# 保存为CSV文件(可选)
with open('tsla_historical_data.csv', 'w', encoding='utf-8') as f:
    f.write(table_data)

driver.quit()

方法2:滚动页面加载更多数据

如果不想固定日期范围,可以通过循环滚动页面底部,触发动态加载直到获取到目标时间段的数据:

# 进入历史数据页面后,添加这段滚动逻辑
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # 滚动到页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)
    # 检查是否加载了新数据
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break  # 无更多数据可加载
    last_height = new_height

# 之后再获取表格数据
table = driver.find_element(By.XPATH, '//*[@id="Col1-1-HistoricalDataTable-Proxy"]/section/div[2]/table')
print(table.text)

内容的提问来源于stack exchange,提问作者OrangeEfficiency

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:37:27