- 在搜索引擎中搜索“贵州茅台 新浪财经”,进入新浪财经中“贵州茅台”的(https://finance.sina.com.cn/realstock/company/sh600519/nc.shtml),单击“公司研究”栏目下的“更多”链接,如下图所示。
- 在弹出的页面中可查看资产负债表、利润表、现金流量表等财务报表,下面来爬取资产负债表,单击“资产负债表”链接,显示的内容如下图所示。该页面的网址为https://vip.stock.finance.sina.com.cn/corp/go.php/vFD_BalanceSheet/stockid/600519/ctrl/part/displaytype/4.phtml
技巧:如果想爬取利润表或现金流量表,可用开发者工具获取相应链接的XPath表达式,再用Selenium库模拟单击链接来切换界面。
- 这个页面中的数据以表格形式呈现,但是该页面是动态渲染出来的,不能用read_html()函数以访问网址的方式爬取数据。而是需要先用Selenium库获取网页源代码,再用read_html()函数解析网页源代码,提取表格数据。
- 先导入Selenium库,然后访问网址,获取网页源代码,代码如下:
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://vip.stock.finance.sina.com.cn/corp/go.php/vFD_BalanceSheet/stockid/600519/ctrl/part/displaytype/4.phtml'
browser.get(url)
data = browser.page_source
- 然后导入pandas库,用read_html()函数解析网页源代码,提取表格数据,代码如下:
import pandas as pd
table = pd.read_html(data)
- 网页中表格众多,需要确定资产负债表在第几个表格。通过for循环语句遍历列表table,然后依次打印输出各个表格的序号和内容,代码如下:
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://vip.stock.finance.sina.com.cn/corp/go.php/vFD_BalanceSheet/stockid/600519/ctrl/part/displaytype/4.phtml'
browser.get(url)
data = browser.page_source
import pandas as pd
table = pd.read_html(data)
for i in range(len(table)):
print(i)
print(table[i])
- 打印输出结果如下图所示,可以看到序号为14的表格(即第15张表格)是我们需要的资产负债表。
- 因此,通过table[14]即可提取所需数据,代码如下:
df = table[14]
df
- 打印输出结果如下图所示。可以看到列索引(表头)有点问题,这是因为原表格的表头中合并单元格。
- 这里我们希望把上图中的第1行数据设置为列索引,然后从第2行开始选取表格数据,并且删除含有空值的行,代码如下:
df.columns = df.iloc[0]
df = df[1:]
df = df.dropna()
df
- 打印结果如下图所示。
- 最后将数据导出为Excel工作簿,代码如下:
df.to_excel('贵州茅台-资产负债表.xlsx',index=False)
补充知识点:用Tushare Pro获取财务报表(暂时不会)
- 用4.2.3 节的补充知识点介绍的Tushare Pro也能获取财务报表,演示代码如下:
|