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

使用Python BeautifulSoup爬取Yahoo财经仅获75条数据,如何获取更多?

如何获取Yahoo财经可口可乐(KO)更多历史数据?

嘿,我来帮你搞定这个问题!你遇到的情况其实挺常见的——Yahoo财经的历史数据页面是动态加载的,你当前用BeautifulSoup写的代码只能抓取页面初始渲染的那75条数据,更早的内容需要触发滚动加载才会显示出来,而BeautifulSoup只能解析页面第一次加载的静态HTML,没法处理这种动态生成的内容。

下面给你两种可行的解决方案,你可以根据自己的需求选择:

方法1:用Selenium模拟浏览器加载全部数据

这种方法最直观,适合爬虫新手,它能模拟真实用户的浏览器操作(比如滚动页面),让页面把所有历史数据都加载出来,之后再解析HTML。

步骤:

  1. 先安装Selenium:
pip install selenium
  1. 下载对应你浏览器的驱动(比如ChromeDriver),确保驱动版本和你的浏览器版本匹配,然后把驱动路径配置好(或者放到系统PATH里)。
  2. 替换你的代码为下面的版本:
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
from bs4 import BeautifulSoup
import time

# 配置Chrome浏览器选项,模拟真实用户的浏览器标识
options = webdriver.ChromeOptions()
options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36')
driver = webdriver.Chrome(options=options)

# 目标URL和你原来的一致
url = 'https://finance.yahoo.com/quote/KO/history?period1=-252374400&period2=1595116800&interval=1mo&filter=history&frequency=1mo'
driver.get(url)

# 模拟滚动页面,直到加载完所有数据
last_scroll_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # 滚动到当前页面最底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待2秒让数据加载(可以根据网络情况调整)
    time.sleep(2)
    # 获取新的页面高度
    new_scroll_height = driver.execute_script("return document.body.scrollHeight")
    # 如果高度不再变化,说明没有更多数据了,退出循环
    if new_scroll_height == last_scroll_height:
        break
    last_scroll_height = new_scroll_height

# 等待表格数据完全加载完成
WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'tr.BdT.Bdc($seperatorColor).Ta(end).Fz(s).Whs(nw)'))
)

# 拿到完整的页面HTML,然后用BeautifulSoup解析
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
data = soup.find_all("tr", {'class':'BdT Bdc($seperatorColor) Ta(end) Fz(s) Whs(nw)'})
data = [x.get_text("|") for x in data]

# 记得关闭浏览器
driver.quit()

# 打印一下获取到的数据数量,验证效果
print(f"成功获取到{len(data)}条历史数据")

这个方法的核心就是通过执行JavaScript滚动页面,让Yahoo加载所有隐藏的历史数据,之后再解析完整的页面内容,就能拿到所有的<tr>标签了。

方法2:直接调用Yahoo财经的API(更高效)

如果你追求效率,不想启动浏览器,可以直接请求Yahoo财经用来加载数据的API接口,返回的是JSON格式的数据,解析起来更方便,速度也更快。不过要注意API的参数可能会随时变化。

示例代码:

import requests
import json
import datetime

# 设置请求头,模拟真实浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36',
    'Accept': 'application/json'
}

# 先建立会话,获取必要的验证参数(crumb)
session = requests.Session()
session.get('https://finance.yahoo.com/quote/KO/history', headers=headers)
# 从会话的cookie中提取crumb(不同时期Yahoo的验证方式可能有变化,这里是一种可行的方式)
crumb = session.cookies.get('B')

# 构造API请求URL,参数和你原来的时间范围、频率一致
api_url = f'https://query1.finance.yahoo.com/v8/finance/chart/KO?period1=-252374400&period2=1595116800&interval=1mo&includePrePost=false&events=div%7Csplit%7Cearn&lang=en-US&region=US&crumb={crumb}&corsDomain=finance.yahoo.com'

# 发送请求并解析JSON数据
response = session.get(api_url, headers=headers)
data = json.loads(response.text)

# 提取核心数据
chart_data = data['chart']['result'][0]
timestamps = chart_data['timestamp']
price_data = chart_data['indicators']['quote'][0]

# 处理并输出数据,把时间戳转成可读日期
for ts, open_p, high_p, low_p, close_p, vol in zip(timestamps, price_data['open'], price_data['high'], price_data['low'], price_data['close'], price_data['volume']):
    date_str = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d')
    print(f"{date_str}|{open_p}|{high_p}|{low_p}|{close_p}|{vol}")

注意事项:

  • API的参数(比如crumb的获取方式)可能会随着Yahoo的更新而变化,如果代码失效了,你可以通过浏览器的开发者工具(Network面板)查看页面加载时的XHR请求,找到最新的API地址和参数。
  • 不要频繁发送请求,避免被Yahoo封禁IP,可以适当添加请求间隔。
  • 一定要设置正确的User-Agent,避免被识别为爬虫。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:27:50