学习使用 Python 抓取财务数据
已发表: 2019-04-26股票市场是一个巨大的数据库,每秒钟都会更新数百万个条目。 虽然有许多公司确实提供公司的财务数据,但通常是通过 API(应用程序编程接口)。 正如您可能已经猜到的那样,这些 API 从来都不是免费的。 雅虎财经是值得信赖的股市数据来源,并拥有付费 API。 我们将逐步指导您如何使用 Python 抓取 Yahoo Finance 数据。
为什么要从雅虎财经抓取数据?
如果您需要来自可靠来源的免费、干净的财务数据,雅虎财经是您的最佳选择。 公司简介网页以统一的结构构建,使网页抓取 python 变得容易。 如果你编写一个脚本从微软的财务页面爬取数据,同样的脚本也可以用于从苹果的财务页面爬取数据。
如何使用 Python 抓取财务数据?
对于安装和入门,您可以参考这篇关于数据抓取 python 的文章中的基本步骤,其中我们讨论了如何从领先的酒店预订门户网站抓取数据。 一旦您安装了所有依赖项以及代码编辑器 Atom,让我们开始使用 Python 抓取 Yahoo Finance。
1.从Python爬取代码开始
安装和设置阶段完成后,我们可以直接进入代码并启动 Yahoo Finance Scraping。 代码在下面进一步给出,可以仅使用 Python 命令运行。

您可以按照上面显示的方式运行代码。 出现提示时,只需输入您要查看其财务摘要的公司的 URL。 我们使用了 Microsoft 的链接。
[代码语言=“python”]
#!/usr/bin/python
# -*- 编码:utf-8 -*-
导入 urllib.request
导入 urllib.parse
导入 urllib.error
从 bs4 导入 BeautifulSoup
导入 ssl
导入json
导入 ast
导入操作系统
from urllib.request 导入请求,urlopen
# 用于忽略 SSL 证书错误
ctx = ssl.create_default_context()
ctx.check_hostname = 假
ctx.verify_mode = ssl.CERT_NONE
# 用户输入
url = input('输入雅虎金融公司网址-')
# 让网站相信您正在使用 Mozilla 浏览器访问它
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
网页 = urlopen(req).read()
# 创建 HTML 页面的 BeautifulSoup 对象,以便于提取数据。
汤= BeautifulSoup(网页,'html.parser')
html = soup.prettify('utf-8')
company_json = {}
其他详细信息 = {}
对于汤中的跨度.findAll('span',
attrs={'class': 'Trsdu(0.3s) Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(b)'
}):
company_json['PRESENT_VALUE'] = span.text.strip()
对于soup.findAll('div',attrs = {'class':'D(ib)Va(t)'})中的div:
对于 div.findAll('span', recursive=False) 中的跨度:
company_json['PRESENT_GROWTH'] = span.text.strip()
对于汤中的 td.findAll('td', attrs={'data-test': 'PREV_CLOSE-value'}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['PREV_CLOSE'] = span.text.strip()
对于汤中的 td.findAll('td', attrs={'data-test': 'OPEN-value'}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['OPEN'] = span.text.strip()
对于汤中的 td.findAll('td', attrs={'data-test': 'BID-value'}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['BID'] = span.text.strip()
对于汤中的 td.findAll('td', attrs={'data-test': 'ASK-value'}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['ASK'] = span.text.strip()
对于汤中的 td.findAll('td', attrs={'data-test': 'DAYS_RANGE-value'}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['DAYS_RANGE'] = span.text.strip()
对于汤中的 td.findAll('td',
attrs={'data-test': 'FIFTY_TWO_WK_RANGE-value'}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['FIFTY_TWO_WK_RANGE'] = span.text.strip()
对于汤中的 td.findAll('td', attrs={'data-test': 'TD_VOLUME-value'}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['TD_VOLUME'] = span.text.strip()
对于汤中的 td.findAll('td',
attrs={'data-test': 'AVERAGE_VOLUME_3MONTH-value'
}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['AVERAGE_VOLUME_3MONTH'] = span.text.strip()
对于汤中的 td.findAll('td', attrs={'data-test': 'MARKET_CAP-value'}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['MARKET_CAP'] = span.text.strip()
对于汤中的 td.findAll('td', attrs={'data-test': 'BETA_3Y-value'}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['BETA_3Y'] = span.text.strip()
对于汤中的 td.findAll('td', attrs={'data-test': 'PE_RATIO-value'}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['PE_RATIO'] = span.text.strip()
对于 soup.findAll('td', attrs={'data-test': 'EPS_RATIO-value'}) 中的 td:
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['EPS_RATIO'] = span.text.strip()
for td in soup.findAll('td', attrs={'data-test': 'EARNINGS_DATE-value'
}):
other_details['EARNINGS_DATE'] = []
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['EARNINGS_DATE'].append(span.text.strip())
对于汤中的 td.findAll('td',
attrs={'data-test': 'DIVIDEND_AND_YIELD-value'}):
other_details['DIVIDEND_AND_YIELD'] = td.text.strip()
对于汤中的 td.findAll('td',
attrs={'data-test': 'EX_DIVIDEND_DATE-value'}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['EX_DIVIDEND_DATE'] = span.text.strip()
对于汤中的 td.findAll('td',
attrs={'data-test': 'ONE_YEAR_TARGET_PRICE-value'
}):
对于 td.findAll('span', recursive=False) 中的跨度:
other_details['ONE_YEAR_TARGET_PRICE'] = span.text.strip()
company_json['OTHER_DETAILS'] = other_details
使用 open('data.json', 'w') 作为输出文件:
json.dump(company_json, outfile, indent=4)
打印公司_json
使用 open('output_file.html', 'wb') 作为文件:
文件.write(html)
print '-----数据提取完成。 检查json文件。——-'

[/代码]
运行代码并输入公司 URL 后,您将在终端上看到打印的 json。 此 json 也将保存到文件夹中名为“data.json”的文件中。 对于 Microsoft,我们获得了以下 JSON。
[代码语言=“python”]
{
“PRESENT_GROWTH”:“+1.31 (+0.67%)”,
“PRESENT_VALUE”:“197.00”,
“PREV_CLOSE”:“195.69”,
“打开”:“196.45”,
“出价”:“196.89 x 900”,
“问”:“197.00 x 1400”,
“TD_VOLUME”:“18,526,644”,
“AVERAGE_VOLUME_3MONTH”:“29,962,082”,
“MARKET_CAP”:“928.91B”,
“BETA_3Y”:“0.91”,
“PE_RATIO”:“16.25”,
“EPS_RATIO”:“12.12”,
“EARNINGS_DATE”:[
“2019 年 4 月 30 日”
],
“DIVIDEND_AND_YIELD”:“2.92 (1.50%)”,
“EX_DIVIDEND_DATE”:“2019-02-08”,
“ONE_YEAR_TARGET_PRICE”:“190.94”
}
[/代码]
对于最近多次亏损的苹果来说,JSON 看起来是这样的。
[代码语言=“python”]
{
“PRESENT_VALUE”:“198.87”,
“PRESENT_GROWTH”:“-0.08 (-0.04%)”,
“其他详情”: {
“PREV_CLOSE”:“198.95”,
“打开”:“199.20”,
“出价”:“198.91 x 800”,
“问”:“198.99 x 1000”,
“TD_VOLUME”:“27,760,668”,
“AVERAGE_VOLUME_3MONTH”:“28,641,896”,
“MARKET_CAP”:“937.728B”,
“BETA_3Y”:“0.91”,
“PE_RATIO”:“16.41”,
“EPS_RATIO”:“12.12”,
“EARNINGS_DATE”:[
“2019 年 4 月 30 日”
],
“DIVIDEND_AND_YIELD”:“2.92 (1.50%)”,
“EX_DIVIDEND_DATE”:“2019-02-08”,
“ONE_YEAR_TARGET_PRICE”:“193.12”
}
}
[/代码]
您可以对任意数量的公司执行相同的操作,并且尽可能频繁地保持更新。
2.爬虫代码解释
和之前的网页抓取代码一样,在这一次中,我们首先获取了整个 HTML 文件。 由此,我们确定了具有我们需要的数据的特定标签(具有特定类)。 此步骤是针对单个公司详细信息页面手动完成的。 一旦确定了特定的标签及其各自的类,我们就使用我们的代码使用漂亮的汤来取出这些标签。
然后从这些标签中的每一个,我们将必要的数据复制到一个名为 company_json 的变量中。 这是我们最终写入名为 data.json 的 JSON 类型文件中的 json。 您可以看到我们还将抓取的 HTML 保存到本地内存中名为 output_file.html 的文件中。 这样做是为了让您可以自己分析 HTML 页面并提出其他数据抓取 python 技术来抓取更多数据。
3. 我们捕获的一些重要数据点
- PREV_CLOSE:指股票上一交易日的收盘价。 股票的前一日价值仅指股票市场开市(非节假日)当天的最后收盘价。
- OPEN:开盘价也简称Open,是股票在一个交易日的起始价。 例如,纽约证券交易所 (NYSE) 任何股票市场的开盘价都是东部时间上午 9:30 的价格。
- BID & ASK:这两个价格都是单一股票的报价。 出价是指买家愿意支付的价格,而要价是卖家愿意出售的价格。 乘数是指以各自价格挂牌交易的股票数量。
- TD_VOLUME:这只是一天中易手的股票数量。
- PE_RATIO:可能是投资者关注的最重要的单一因素,它是通过将公司股票的当前市场价格除以公司每股收益来计算的。 简而言之,它是一个人准备为公司收益的每一卢比价值支付的金额。
我们解释一些重要数据点的原因是,我们希望您知道您可以深入了解一家公司的财务状况,只需从其雅虎财务页面上抓取数据即可。
您可以从雅虎财经抓取哪些数据?
您将能够使用此 Python 抓取工具抓取不同的数据点。 现值和目前的增长或下降百分比是最重要的。 其他数据点一起查看时,可以呈现更好的画面,并帮助人们决定投资一家公司的股票是否是一个好主意。 不过,查看数据快照可能不会太有效。 从长远来看,定期抓取数据并使用大数据集来预测股票的未来价格可能会更有用。
您可以抓取哪些其他财务数据?
我们抓取的财务数据来自雅虎财经中一家公司的摘要页面。 每家公司还有一个图表页面,您可以在其中查看长达五年的股票数据。 虽然数据不是很结构化,但能够抓取它可能会让您很好地了解公司股票的历史表现。
统计页面为您提供了 30 多个不同的数据点,超过了我们捕获的数据点。 这些是结构化格式,可以使用类似于我们提供的代码进行抓取。
历史数据包含来自图表页面的数据,但格式类似于 CSV——您可以轻松提取数据并将其存储在 CSV 中。 其他页面,如简介、财务、分析、期权、持有人和可持续性,可能会让您很好地估计公司股票与竞争对手相比的表现。
雅虎财经数据使用案例
您可以使用历史数据来预测股票价格,或者您可以创建一个应用程序,使用来自您的抓取引擎的定期更新数据为用户提供更新。 您可以推荐什么时候应该卖出他们的股票,或者什么时候应该买入更多——可能性是无穷无尽的!
如果您有一个小团队并且无法决定如何开始进行网络抓取,您可以寻求像 PromptCloud 这样有责任心且经验丰富的网络抓取团队的帮助。 我们的网络抓取需求收集仪表板使提交需求、获取报价以及最终以即插即用格式获取数据成为一个简单而直接的过程。
在提取网络数据方面需要帮助?
通过我们的网络抓取服务,从用于业务应用程序的网站获取干净且随时可用的数据。
哎呀! 我们找不到您的表格。
免责声明:本教程中提供的代码仅用于学习目的。 我们不对它的使用方式负责,也不对源代码的任何有害使用承担任何责任。
