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

如何用BeautifulSoup爬取Yahoo Finance季度财务报告?

抓取Yahoo Finance季度财务报告的Python实现

之前已经实现了抓取Yahoo Finance年度资产负债表的代码,现在需要获取点击页面中「季度报告」按钮后展示的季度财务数据。以下是两种可行方案:

方案一:用Selenium模拟交互(直观易实现)

季度数据是点击按钮后动态加载的,通过Selenium模拟浏览器操作切换到季度视图,再抓取表格内容:

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 pandas as pd

def get_quarterly_balance_sheet(ticker):
    url = f'https://finance.yahoo.com/quote/{ticker}/balance-sheet?p={ticker}'
    # 初始化Chrome浏览器(需提前安装对应版本的chromedriver)
    driver = webdriver.Chrome()
    driver.get(url)
    
    try:
        # 等待「季度报告」按钮加载完成并点击
        quarterly_btn = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, '//button[text()="Quarterly"]'))
        )
        quarterly_btn.click()
        
        # 等待季度表格加载完成
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, 'BdT'))
        )
        
        # 解析页面表格数据
        soup = BeautifulSoup(driver.page_source, 'html.parser')
        table = soup.select_one('.BdT')
        all_data = []
        for row in table.select('.D\\(tbr\\)'):
            data = [cell.text for cell in row.select('.Ta\\(c\\), .Ta\\(start\\)')]
            all_data.append(data)
        
        df = pd.DataFrame(all_data[1:], columns=all_data[0])
        return df
    finally:
        # 无论成功失败都关闭浏览器
        driver.quit()

注意事项

  • 需安装Selenium库:pip install selenium
  • 需下载对应浏览器版本的驱动(如ChromeDriver),并配置到系统PATH或指定路径

方案二:直接请求API接口(高效无浏览器依赖)

通过分析页面网络请求,可直接调用Yahoo Finance的公开API获取季度数据,无需模拟浏览器:

import requests
import pandas as pd

def get_quarterly_balance_sheet_api(ticker):
    # 构造季度资产负债表API请求URL
    url = f'https://query1.finance.yahoo.com/v10/finance/quoteSummary/{ticker}?modules=balanceSheetHistoryQuarterly'
    # 设置请求头,避免被反爬拦截
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }
    
    response = requests.get(url, headers=headers)
    data = response.json()
    
    # 解析API返回的JSON数据
    balance_sheet_list = data['quoteSummary']['result'][0]['balanceSheetHistoryQuarterly']['balanceSheetStatements']
    # 提取所有指标名称
    metrics = list(balance_sheet_list[0].keys())
    # 提取季度日期
    dates = [item['endDate']['fmt'] for item in balance_sheet_list]
    
    # 构造DataFrame的数据源
    df_data = {'Breakdown': metrics}
    for idx, date in enumerate(dates):
        df_data[date] = [
            balance_sheet_list[idx][metric]['raw'] if metric in balance_sheet_list[idx] else None 
            for metric in metrics
        ]
    
    return pd.DataFrame(df_data)

扩展说明

  • 如需获取季度利润表,将API的modules参数改为incomeStatementHistoryQuarterly
  • 如需获取季度现金流量表,将modules参数改为cashflowStatementHistoryQuarterly
  • API返回的raw字段是原始数值,fmt字段是格式化后的字符串,可按需选择

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 20:42:08