Python股票分析系列——自动获取标普500股票列表.p5
该系列视频已经搬运至bilibili: 点击查看
欢迎来到Python for Finance教程系列的第5部分。在本教程和接下来的几节中,我们将着手研究如何为更多公司提供大量的定价信息,以及如何一次处理所有这些数据。
首先,我们需要一份公司名单。我可以给你一个清单,但实际上获得股票清单可能只是你可能遇到的众多挑战之一。在我们的案例中,我们需要一个标准普尔500公司的Python列表。
无论您是在寻找道琼斯公司,标准普尔500指数还是罗素3000指数,都有可能在某个地方发布了这些公司的帖子。你会想确保它是最新的,但它可能还不是完美的格式。在我们的例子中,我们将从维基百科获取列表:http://en.wikipedia.org/wiki/List_of_S%26P_500_companies。
维基百科中的代号/符号组织在一张桌子上。为了解决这个问题,我们将使用HTML解析库,Beautiful Soup。
首先,我们从一些库开始:
import bs4 as bs import pickle import requests
bs4是beautifulsoup,pickle让我们可以很容易地保存这些公司名单,而不是每次运行时都敲击维基百科(尽管记住,及时更新这个清单!),我们将使用requests从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对象。
有一次维基百科试图拒绝对Python的访问。目前,在我写这篇文章的时候,代码的工作原理没有改变头文件。如果您发现原始源代码(resp.text)似乎不像您在家用计算机上看到的那样返回相同页面,请添加以下内容并更改resp var code:
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,我们可以通过简单地搜索 wikitable sortable
classes。我知道指定此表的唯一原因是因为我首先在浏览器中查看了源代码。可能会有一段时间,你想解析一个不同的网站的股票列表,也许它是在一个表中,或者它可能是一个列表,也可能是一些div标签。这只是一个非常具体的解决方案。从这里开始,我们只是遍历表格:
tickers = [] for row in table.findAll('tr')[1:]: ticker = row.findAll('td')[0].text tickers.append(ticker)
对于每一行,在标题行之后(这就是为什么我们要从[1:]开始),我们说的是股票行情是“table data”(td),我们抓住它的.text,我们将此代码添加到我们的列表中。
现在,如果我们可以保存这份清单,那就太好了。我们将为此使用pickle模块,它为我们序列化Python对象。
with open("sp500tickers.pickle","wb") as f: pickle.dump(tickers,f) return tickers
我们希望继续并保存这些内容,这样我们就不用每天多次请求维基百科。在任何时候,我们都可以更新这个列表,或者我们可以编程它每月检查一次......等等。
完整的代码到目前为止:
import bs4 as bs import pickle import requests 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'}) 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 tickers save_sp500_tickers()
现在我们知道了代号,我们准备好将所有信息都提取出来,这是我们将在下一个教程中做的事情。