使用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
相关产品推荐
相关产品推荐

