首页 > 编程问答 >网页抓取 雅虎财经 Python

网页抓取 雅虎财经 Python

时间:2024-07-26 16:36:29浏览次数:23  
标签:python pandas beautifulsoup yahoo-finance

我正在尝试从损益表、资产负债表和现金流量报告中收集数据框中给定股票代码的雅虎财务数据。(下面提供了 URL)

我从使用 yfinance 的资产负债表中使用了此函数没有像雅虎财经那样的“总债务” 但它只适用于股票代码“AAPL”而没有其他内容。 我想要一个更强大的网络抓取工具,它适用于任何股票代码并能够获取所有内容其中 3 个报告无需太多修改。

                                          2022-09-30    2021-09-30    2020-09-30    2019-09-30
Total Assets                             352755000000  351002000000  323888000000  338516000000
Total Liabilities Net Minority Interest  302083000000  287912000000  258549000000  248028000000
Total Equity Gross Minority Interest      50672000000   63090000000   65339000000   90488000000
Total Capitalization                     149631000000  172196000000  164006000000  182295000000
Common Stock Equity                       50672000000   63090000000   65339000000   90488000000
Net Tangible Assets                       50672000000   63090000000   65339000000   90488000000
Working Capital                          -18577000000    9355000000   38321000000   57101000000
Invested Capital                         170741000000  187809000000  177775000000  198535000000
Tangible Book Value                       50672000000   63090000000   65339000000   90488000000
Total Debt                               120069000000  124719000000  112436000000  108047000000
Net Debt                                  96423000000   89779000000   74420000000   59203000000
Share Issued                              15943425000   16426786000   16976763000   17772944000
Ordinary Shares Number                    15943425000   16426786000   16976763000   17772944000

我计划为每个报告提供单独的功能

https://finance.yahoo.com/quote/{ticker}/financials?p={ticker}

import pandas as pd
import requests
from datetime import datetime
from bs4 import BeautifulSoup

def retrieve_balance_sheet(ticker):
    ticker = ticker.upper()

    url = f"https://finance.yahoo.com/quote/{ticker}/balance-sheet?p={ticker}"
    header = {'Connection': 'keep-alive',
                'Expires': '-1',
                'Upgrade-Insecure-Requests': '1',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) \
                AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'
                }
        
    r = requests.get(url, headers=header)
    html = r.text
    soup = BeautifulSoup(html, "html.parser")

    div = soup.find_all('div', attrs={'class': 'D(tbhg)'})
    if len(div) < 1:
        print("Fail to retrieve table column header")
        exit(0)

    col = []
    for h in div[0].find_all('span'):
        text = h.get_text()
        if text != "Breakdown":
            col.append( datetime.strptime(text, "%m/%d/%Y") )
    
    df = pd.DataFrame(columns=col)
    for div in soup.find_all('div', attrs={'data-test': 'fin-row'}):
        i = 0
        idx = ""
        val = []
        for h in div.find_all('span') :
            if i == 0:
                idx = h.get_text()
            else:
                num = int(h.get_text().replace(",", "")) * 1000
                val.append( num )
            i += 1
        row = pd.DataFrame([val], columns=col, index=[idx] )
        df = pd.concat([df, row])

    return df

当然,以下是如何使用 Python 从雅虎财经获取任何股票代码的损益表、资产负债表和现金流量表的财务数据的方法。

import requests
from bs4 import BeautifulSoup
import pandas as pd

def get_financial_data(ticker):
    """
    从雅虎财经获取给定股票代码的财务数据。

    Args:
        ticker: 股票代码(例如,AAPL)。

    Returns:
        一个包含损益表、资产负债表和现金流量表的字典。
    """

    # 创建要存储数据的字典
    financial_data = {}

    # 循环遍历报表类型列表
    for statement_type in ['financials', 'balance-sheet', 'cash-flow']:
        # 构造 URL
        url = f"https://finance.yahoo.com/quote/{ticker}/{statement_type}?p={ticker}"

        # 使用 requests 库获取网页内容
        response = requests.get(url)

        # 使用 BeautifulSoup 解析 HTML 内容
        soup = BeautifulSoup(response.content, 'html.parser')

        # 查找包含数据的表头
        headers = [header.text for header in soup.find_all('div', {'class': 'D(ib) Fz(18px) Ta(start)'})]

        # 查找包含数据行的所有行
        rows = soup.find_all('div', {'data-test': 'fin-row'})

        # 创建一个空列表来存储数据
        data = []

        # 循环遍历所有行
        for row in rows:
            # 获取每一列的数据并将其附加到数据列表中
            data.append([value.text for value in row.find_all('div', {'class': 'Ta(c)'})])

        # 将数据转换为 pandas DataFrame
        df = pd.DataFrame(data, columns=headers)

        # 将日期列转换为日期时间对象
        df[headers[0]] = pd.to_datetime(df[headers[0]])

        # 将日期列设置为索引
        df = df.set_index(headers[0])

        # 将 DataFrame 添加到财务数据字典中
        financial_data[statement_type] = df

    # 返回财务数据字典
    return financial_data

# 测试函数
ticker = 'AAPL'
financial_data = get_financial_data(ticker)

# 打印损益表
print(financial_data['financials'])

# 打印资产负债表
print(financial_data['balance-sheet'])

# 打印现金流量表
print(financial_data['cash-flow'])

解释:

  1. 导入必要的库:
  2. requests : 用于向雅虎财经发送 HTTP 请求以获取网页内容。
  3. beautifulsoup4 : 用于解析 HTML 内容并提取必要的数据。
  4. pandas : 用于处理和操作数据,特别是创建 DataFrames。

  5. 定义 get_financial_data 函数:

  6. 该函数接受一个 ticker 参数,该参数表示要从中获取财务数据的股票代码。
  7. 它使用一个循环来遍历三种不同类型的报表:
    • financials : 损益表
    • balance-sheet : 资产负债表
    • cash-flow : 现金流量表
  8. 对于每种报表类型,它都会构造 URL 并使用 requests 库获取网页内容。
  9. 然后,它使用 BeautifulSoup 解析 HTML 内容。
  10. 它使用 BeautifulSoup 的 find_all 方法找到包含列标题和数据行的特定 HTML 元素。
  11. 它从这些 HTML 元素中提取文本内容并将其存储在列表中。
  12. 最后,它使用提取的数据创建一个 pandas DataFrame 并将其存储在 financial_data 字典中。

  13. 调用 get_financial_data 函数:

  14. 代码使用 AAPL 作为股票代码调用 get_financial_data 函数。
  15. 该函数返回一个包含所有三种财务报表的字典。

  16. 打印财务报表:

  17. 代码打印存储在 financial_data 字典中的所有三种财务报表。

这段代码演示了如何使用网络抓取从雅虎财经获取财务数据。但是,在抓取网站时,请务必注意网站的使用条款,并且不要过度请求网站以避免被屏蔽。

标签:python,pandas,beautifulsoup,yahoo-finance
From: 76459687

相关文章

  • Python Selenium 操作链可以工作,但会停止我在 Firefox 中的程序
    我有时使用ActionsChains时遇到任何问题,今天它不起作用,你知道为什么吗?scrolling_bar=driver.find_element(By.CSS_SELECTOR,"#scrolling_bar")start=scrolling_bar.locationActionChains(driver)\.drag_and_drop_by_offset(scrolling_bar,start......
  • 在 Python 中将 Kivy 文件选择器添加到 PopUp
    我一直在尝试通过应用程序的按钮释放创建文件选择器弹出窗口。我分别管理了FileChooser和Popups,但无法将两者一起解决,这里有人可以帮助解决问题吗?我正在尝试用Python而不是Kivy.lang来实现PopUp,因为这是我在弹出窗口方面的经验。我也无法让KivyDoc示例正常工作。我......
  • Python基础知识点(1)基本语句
    基本语句1.if语句if表达式:语句块其中,表达式是一个返回True或False的表达式。如果表达式为True,则执行if下面的语句块;如果为False,则跳过语句块执行下面的语句。2.if…else语句if表达式:语句块1else:语句块2其中,表达式是一个返回True或False的表达式。如果......
  • 使用Python实现深度学习模型:语言翻译与多语种处理
    引言语言翻译和多语种处理是自然语言处理(NLP)中的重要任务,广泛应用于跨语言交流、国际化应用和多语言内容管理等领域。通过使用Python和深度学习技术,我们可以构建一个简单的语言翻译与多语种处理系统。本文将介绍如何使用Python实现这些功能,并提供详细的代码示例。所需工具......
  • python框架之Flask
    之前写过有关flask-restful: https://www.cnblogs.com/xingxia/p/flask_restful.html虽然早期使用python进行web应用搭建的使用该框架,但是好像很少总结,在此记录一下 [安装]pip3installflask [使用]#导入类库fromflaskimportFlask#创建实例......
  • Python 搜索和抓取
    我有一个问题想知道是否值得花时间尝试用Python来解决。我有一个包含鱼类学名的大型CSV文件。我想将该CSV文件与大型鱼类形态信息数据库(www.fishbase.ca)交叉引用,并让代码返回每条鱼的最大长度。基本上,我需要创建代码来搜索Fishbase网站上的每条鱼,然后找到页面上的最......
  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-54- 上传文件(input控件) - 上篇
    1.简介在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等。所以宏哥打算按上传文件的分类对其进行一下讲解和分享。2.上传文件的API(input控件)Playwright是一个现代化的自动化测试工具,它支持多种浏览器和操作系统,可以帮助开发人员和......
  • python requests 报错 Caused by ProxyError ('Unable to connect to proxy', OSError
    背景:访问https接口,使用http代理版本:requests:2.31.0 从报错可以看出,是proxy相关的报错调整代码,设定不使用代理,将http与https对应的proxy值置空即可(尝试过proxies={},但此写法不生效)proxies={'http':'','https':''}response = requests.get('https://xxx......
  • python基础函数
    1.为什么使用函数使用函数的目的是去减少代码的冗余性,简化代码的复杂度2.如何去定义一个函数以def开头去进行相关的定义在def的后面我们就去以见明知意的方式去定义一个函数的名称在函数名称后面的括号中去添加参数值,可以是多个参数,也可以是无餐的3.函数的调用无参多......
  • 不使用 + 或 - 运算符 | 添加 2 个数字Python
    我一直在尝试编写逻辑,但测试用例失败。如何改进我的代码?代码:#Giventwointegersaandb,returnthesumofthetwointegerswithoutusingtheoperators+and-.a=-1b=1min_val=min(a,b)max_val=max(a,b)ifmin_val==max_val:pr......