如何通过解析包含股票行情清单的文本文件来抓取Yahoo Finance?

时间:2019-05-30 16:08:15

标签: python python-3.x python-2.7 python-requests finance

我有一个包含公司股票清单的文本文件。

我的意图是能够抓取Yahoo Finance以获得这些股票的财务数据。

我不知道如何告诉Python遍历我的文本文件中的每一行,将其分配给一个变量,然后抓取该特定Yahoo Finance页面并检索其数据并将其存储,并重复此过程以获取多少行情包含在文本文件中。

我在网上找到了一些代码,可以从Yahoo Finance抓取数据。 然后,我尝试添加一个for循环,以便将每个代码添加到一个符号变量中(请参见代码)。

def scrape_table(url):
    page = requests.get(url)
    tree = html.fromstring(page.content)
    table = tree.xpath('//table')
    assert len(table) == 1

    df = pd.read_html(lxml.etree.tostring(table[0], method='html'))[0]

    df = df.set_index(0)
    df = df.dropna()
    df = df.transpose()
    df = df.replace('-', '0')

    # The first column should be a date
    df[df.columns[0]] = pd.to_datetime(df[df.columns[0]])
    cols = list(df.columns)
    cols[0] = 'Date'
    df = df.set_axis(cols, axis='columns', inplace=False)

    numeric_columns = list(df.columns)[1::]
    df[numeric_columns] = df[numeric_columns].astype(np.float64)

    return df

symbol = []

tf = open("SMI_tickers.txt")
for line in tf.readlines():
   symbol.append(print(line))

balance_sheet_url = 'https://finance.yahoo.com/quote/' + symbol + 
'/balance-sheet?p=' + symbol

df_balance_sheet = scrape_table(balance_sheet_url)
df_balance_sheet

我收到的错误消息是

  

TypeError:只能将str(而不是“ list”)连接到str

我的最终目标是能够为每个公司导入财务数据,以便我可以对每只股票进行一些计算。

3 个答案:

答案 0 :(得分:0)

您试图传递列表而不是字符串。您需要遍历文件中的所有符号,可以按照以下步骤进行操作。这段代码会将抓取功能的结果(我尚未测试)附加到列表balance_sheets中。

balance_sheets=[]
tf = open("SMI_tickers.txt")
for line in tf.readlines():
    symbol.append(line)
    balance_sheet_url = 'https://finance.yahoo.com/quote/' + line + '/balance-sheet?p=' + line
    balance_sheets.append(scrape_table(balance_sheet_url))

答案 1 :(得分:0)

我假设您的SMI_tickers.txt有一个股票代码列表,每行一个符号。当您构建URL时,错误出现了,您尝试连接符号,它是一个列表,而不是字符串。

将您的代码更改为以下内容。

tf = open("SMI_tickers.txt")
for line in tf.readlines():
  symbol.append(line)
for symb in symbol:
    balance_sheet_url = 'https://finance.yahoo.com/quote/' + symb + 
          '/balance-sheet?p=' + symb

    df_balance_sheet = scrape_table(balance_sheet_url)
    df_balance_sheet

您实际上不需要将符号读入列表中,只需从没有列表的文件中获取符号即可使用符号。

tf = open("SMI_tickers.txt")
for line in tf.readlines():
    balance_sheet_url = 'https://finance.yahoo.com/quote/' + line+ 
          '/balance-sheet?p=' + line

    df_balance_sheet = scrape_table(balance_sheet_url)
    df_balance_sheet

在两种情况下df_balance_sheet都是您的熊猫数据框。

答案 2 :(得分:0)

有关刮除资产负债表的信息,以及其他您可能需要的信息,请查看yahoo_fin软件包http://theautomatic.net/yahoo_fin-documentation/ 使事情变得简单

import pandas as pd
from yahoo_fin.stock_info import get_balance_sheet

stock_list = ["AAPL", "IBM", "AMZN"]

all_data = {ticker: get_balance_sheet(ticker)
                 for ticker in stock_list}

aapl = pd.DataFrame(all_data['AAPL'])
aapl = aapl.set_index('Period Ending')

希望这会有所帮助