python 批量下载财务数据_Python+Wind 批量下载上市公司年报 - Part 1/2
Python+Wind 批量下载上市公司年报 - Part 1/2作者:张捷
目录1.背景介绍
2.安装Python
3.爬取万得上市公司年报3.1Wind下载公告信息
3.2获得年报地址
4.使用Python抓取PDF年报
5.总结
关于我
1. 背景介绍
蚊子正在进行的研究项目涉及到一个数据无法直接从数据库下载,只能手动从公司年报收集。
经过一番查找,蚊子获知目前能获取上市公司年报的网站或数据库有巨潮资讯网、上交所、深交所、Wind万得等。但是他们均不提供年报批量下载。
听说Python可以爬虫下载年报,蚊子做好了花两三周的时间学习Python的准备。没想到不经意间发现了连享会的公众号文章“Python:爬取上市公司公告-Wind-CSMAR”,大大缩短了蚊子的学习时间,半天就能上手了。
以下是实施步骤:
安装Python
Wind下载公告信息
获得年报地址
使用Python抓取PDF年报
2. 安装Python
蚊子安装的是ANACONDA。安装过程中能打钩的都打钩。运行Jupyter Notebook即可运行Python。
3.爬取Wind上市公司年报
3.1 Wind下载公告信息登录Wind
上方菜单点击“新闻”->“公司公告”->“沪深股票”
点击“高级搜索”标题不包含“摘要”,如果不要ST股,也可以加入关键词“ST”
公司类型选择“年度报告”
所属市场选择“全部A股”
公告日期根据自己的研究需求选择
点击“导出列表”,“公告条数”最多输入9999。蚊子需要下载多年年报,所以在“高级搜索”中自定义日期范围分批导出列表。
3.2 获得年报地址
打开下载好的Excel表格,如下图所示,公告标题这一栏针对每个公告都有相对应的链接。
下一步是提取链接地址。Office 2013年之后的版本可以使用Excel里的FORMULATEXT()公式提取“公告标题”一栏单元格内的链接地址。以第一条为例,显示=HYPERLINK("http://news.windin.com/ns/bulletin.php?code=CED3F4D18ADE&id=114447776&type=1", "ST中新:新2019年年度报告(修正版)")。显然逗号左边双引号内是链接网址。
打开该链接,网页上既有年报内容也有年报PDF超链接可下载。
4. 使用Python抓取PDF年报
(以下代码来自连享会)
导入相应的包:
import os
import pandas as pd
import requests
import re
from lxml import etree #解析网页
from urllib.request import urlretrieve #下载网络文件到本地
import time
设置路径
os.chdir(r"C:\Users\Jie\Desktop\WindAR")
data.head()
读入Excel数据,并删除最后一行空值
data = pd.read_excel("公司公告2019.xlsx")[:-1]
data.head()
定义提取公告地址函数
def address(str):
return str.split('"')[1]
data["公告地址"] = data["公告地址"].apply(address)
利用Xpath提取年报PDF链接
def pdf_url(url):
html = requests.get(url).text
tree = etree.HTML(html) #解析网页
url = tree.xpath("//div[2]/a/@href") #获取PDF链接
return "http://news.windin.com/ns/" + url[0]
data["PDF地址"] = data["公告地址"].apply(pdf_url)
下载PDF年报并在PDF文件夹里
for index, row in data.iterrows(): #下载前10个年报
name = row["证券代码"][:6] + "_" + row["公告日期"] + ".pdf" #文件名称
url = row["PDF地址"] #pdf地址
times = 1 #失败后,重新获取次数
while times <= 3: #3次都失败后跳出循环
try:
urlretrieve(url, filename = r"./PDF/" + name)
print(f"成功下载{name}!")
break
except:
times += 1
print(f"休息5秒!再试第{times}次!")
time.sleep(5)
print("成功下载所有PDF文件!")
总结用新的编程语言完成工作不要怕,先在网上找对应的工作是否有现成的代码,如果有的话只用在人家现有的基础上修修改改就行了,不需要从头开始学习这门语言。
2013之前的Office版本没法用Formulatext函数(为这Office版本蚊子还折腾了半天时间)。
Jupyter Notebook 显示Ln[*]的话,要么是Python没连接上,要么是在忙。“利用Xpath提取年报PDF链接”那段代码运行了挺长时间的,蚊子好几次以为程序出错,不断关了重开,结果发现就是任务有些复杂,需要更多时间而已。
下载数千个PDF年报的话,建议睡前运行以上Python代码,醒来之后便能备份开始工作,免得心急等待。
蚊子准备全部下载完之后再检查年报是否齐全,到时写一篇续集。
这是蚊子第一个Markdown文档,希望发在公众号上顺利显示。
特此感谢连享会提供的技术贴和相关资料!关于我蚊子是一名高校基层工作者,“捷思捷悟”是蚊子的自留地,记录研究和教学工作中遇到的问题、解决方案和感悟。
扫码关注公众号