Python在Finance上的应用5 :自动获取是S&P 500的成分股
- 2020 年 2 月 10 日
- 筆記
欢迎来到Python for Finance教程系列的第5讲。 在本教程和接下来的几篇文章中,我们将着手研究如何为更多公司提供大量的定价信息,以及我们如何一次处理所有这些数据。
首先,我们需要一份公司名单。 我可以给你一个清单,但实际上获得股票清单可能只是你可能遇到的众多挑战之一。 在我们的案例中,我们需要一个标普500公司的Python列表。
无论您是在寻找道琼斯指数,标普500指数还是罗素3000指数,都有可能在某个地方发布了这些公司的帖子。 你会想确保它是最新的,但它可能还不是完美的格式。 在我们的例子中,我们将从维基百科获取列表http://en.wikipedia.org/wiki/List_of_S%26P_500_companies.
维基百科中的代号/符号被组织在table。 为了解决这个问题,我们将使用HTML解析库 Beautiful Soup ,如果你想了解更多关于这个库的,请关注web scraping with Beautiful Soup(https://pythonprogramming.net/introduction-scraping-parsing-beautiful-soup-tutorial/)
首先让我们导入这些库:
import bs4 as bs import pickle import requests
bs4是Beautiful Soup,pickle是可以让我们很容易地保存这些公司名单,而不是每次运行时都敲击维基百科(记住及时更新这个清单!),我们将使用 请求从Wikipedia的页面获取源代码。
定义函数:
def save_sp500_tickers(): resp = requests.get('http://en.wikipedia.org/wiki/List_of_S%26P_500_companies') soup = bs.BeautifulSoup(resp.text, 'lxml') table = soup.find('table', {'class': 'wikitable sortable'})
首先,访问维基百科页面,并做出响应,其中包含我们的源代码。 为了得到想要的源代码,我们希望访问.text属性,并使用BeautifulSoup转为soup。 BeautifulSoup所做的工作基本上可理解为将源代码转换为BeautifulSoup对象,我们可以将其视为典型的Python Object。
有时会出现维基百科试图拒绝Python的访问。 目前,在我写这篇文章的时候,代码工作时没有改变头文件。 如果您发现原始源代码(resp.text)似乎不像在家用计算机上看到的那样返回相同页面,请添加以下内容并更改resp var代码:
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17'} resp = requests.get('http://en.wikipedia.org/wiki/List_of_S%26P_500_companies', headers=headers)
一旦有了soup,我们就可以通过简单地搜索可维护的可排序类来查找库存数据表。 我知道指定此表的唯一原因是因为我首先在浏览器中查看了源代码。 可能会有一段时间,你想解析一个不同的网站的股票列表,也许它是在一个table,或者它可能是一个list,也可能是一些div tags。 这只是一个非常具体的解决方案。 本文只是遍历表格:
tickers = [] for row in table.findAll('tr')[1:]: ticker = row.findAll('td')[0].text tickers.append(ticker)
对于每一行,在标题行之后(这就是为什么要写[1:]),说的是股票行情是“表格数据”(td),通过抓住它的.text,将此代码添加到列表 tickers。
现在,如果可以保存这份清单,那就太好了。 这里为此将使用pickle模块,它为我们序列化Python对象。
with open("sp500tickers.pickle","wb") as f: pickle.dump(tickers,f) return tickers
我们希望继续并保存这些内容,这样就不用每天多次请求维基百科。 在任何时候都可以更新这个清单,或者可以将它编程为每月检查一次……等等。
完整的代码到目前为止:
import bs4 as bs import pickle import requestsdef save_sp500_tickers(): resp = requests.get('http://en.wikipedia.org/wiki/List_of_S%26P_500_companies') soup = bs.BeautifulSoup(resp.text, 'lxml') table = soup.find('table', {'class': 'wikitable sortable'}) tickers = [] for row in table.findAll('tr')[1:]: ticker = row.findAll('td')[0].text tickers.append(ticker) with open("sp500tickers.pickle","wb") as f: pickle.dump(tickers,f) return tickerssave_sp500_tickers()# 获取S&P500 里面的内容 zhujin 注 with open('sp500tickers.pickle', 'rb') as f: # The protocol version used is detected automatically, so we do not # have to specify it. data = pickle.load(f) print('Top 100 list of S&P500 %s' %data[:100])

现在知道了S&P列表,我们将在下一个教程中准备把所有信息都提取出来
英文版请戳: https://pythonprogramming.net/sp500-company-list-python-programming-for-finance/