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文档,希望发在公众号上顺利显示。

特此感谢连享会提供的技术贴和相关资料!关于我蚊子是一名高校基层工作者,“捷思捷悟”是蚊子的自留地,记录研究和教学工作中遇到的问题、解决方案和感悟。

扫码关注公众号

你可能感兴趣的:(python怎么批量下载年报)