Loading...
墨滴

Wyl

2021/04/23  阅读:34  主题:兰青

爬虫 | 30行代码轻松爬取全部A股年报

目标

爬取2001-2019年A股全部上市公司的年度财务报告

前言

目前网络平台上已经有大量介绍如何用Python爬取公司年报的文章,例如:

《实战演练-爬取深交所年报》

《【爬虫】用Python爬取公司年报》

《Python爬取上交所年报并下载》

但是,我们知道A股上市公司的年度财务报告分别披露在 上海证券交易所深圳证券交易所、以及巨潮资讯网。上述三篇文章分别介绍了如何从上交所、深交所和巨潮资讯网爬取公司年报并下载,基本思路是:解析网站结构,获取网站内所有上市公司年报PDF的url地址,并通过访问url地址进行年报下载。具体操作步骤可参考上述文章。每个网站的结构不同,爬虫获取的年报pdf下载链接的程序也不尽相同,因此,想要爬取完整的A股公司年报费时费力。

上海证券交易所
上海证券交易所
深圳证券交易所
深圳证券交易所
巨潮资讯网
巨潮资讯网

如果有公开数据提供A股公司年报PDF下载链接,则不必重复“造轮子”,费心解析网站结构获取年报PDF访问地址了。最近,笔者了解到在文构财经文本数据平台的论文数据公开的数据中综合整理了上交所、深交所和巨潮资讯网数据,包含2001-2019年A股上市公司年报的下载链接,数据如图。在此数据基础上,则可直接利用Python循环访问PDF_link下载并保存公司年报。

数据结构
数据结构

基本思路

1.读取所有上市公司年报的下载链接rep_link

2.访问下载链接rep_link下载公司年报并保存

实现过程

导入Python第三方库:

import pandas as pd
import requests
import random
import time
import os

读取文构财经平台数据平台公开数据:

rawdata=pd.read_excel('公司竞争战略指标_2001_2019.xlsx', sheet_name = 0)

def get_data(iloc):
    rawdata['year'] = rawdata['rep_period'].dt.year
    firm = rawdata.at[iloc,'security_name'].replace("*",""# 去掉*ST的*号,文件命名不含特殊符
    code = rawdata.at[iloc,'security_code']
    year = rawdata.at[iloc,'year']
    pdf_url = rawdata.at[iloc,'rep_link']
    return firm,code,year,pdf_url

定义文件保存名称和路径:

def get_filepath(firm,year):
    file_path = 'F:\\年度财务报告\\'
    file_name = "{}-{}-{}年年度报告.pdf".format(code,firm,year)
    file_full_name = os.path.join(file_path,file_name)
    return file_full_name

下载公司年报:

def download_pdf(url,file_full_name):
    headers = {'User-Agent':''Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60''}
    res = requests.get(url,headers=headers)
    with open(file_full_name,"wb"as fp:
        for chunk in res.iter_content(chunk_size=1024):
            if chunk:
                fp.write(chunk)

代码实现

三十行代码轻松实现爬取2001-2019年A股全部上市公司的年度财务报告

import pandas as pd
import requests
import random
import time
import os

rawdata=pd.read_excel('公司竞争战略指标_2001_2019.xlsx', sheet_name = 0)

def get_data(iloc):
    rawdata['year'] = rawdata['rep_period'].dt.year
    firm = rawdata.at[iloc,'security_name'].replace("*",""# 去掉*ST的*号,文件命名不含特殊符号
    code = rawdata.at[iloc,'security_code']
    year = rawdata.at[iloc,'year']
    pdf_url = rawdata.at[iloc,'rep_link']
    return firm,code,year,pdf_url

def get_filepath(firm,year):
    file_path = 'F:\\财务报告\\'
    file_name = "{}-{}-{}年年度报告.pdf".format(code,firm,year)
    file_full_name = os.path.join(file_path,file_name)
    return file_full_name

def download_pdf(url,file_full_name):
    headers = {'User-Agent':''Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60''}
    res = requests.get(url,headers=headers)
    with open(file_full_name,"wb"as fp:
        for chunk in res.iter_content(chunk_size=1024):
            if chunk:
                fp.write(chunk)
                
for iloc in range(rawdata.shape[0]):
    firm, code, year, pdf_url = get_data(iloc)
    print("开始下载{},股票代码{}的{}年报".format(firm,code,year))
    file_full_name = get_filepath(firm,year)
    download_pdf(pdf_url,file_full_name)
    time.sleep(random.uniform(3,4))
    print("===========下载完成==========")

运行结果:

运行过程
运行过程
文件保存
文件保存

知乎与公号:乌龙PySta(ID:wylcfy2014)
不定期推送:Python+Stata | 文本分析+机器学习 | 财务+会计

参考资料

[1]http://www.wingodata.com/#/dash/public-paper

[2]https://mp.weixin.qq.com/s/u7sWCejoK_zZWsSmGwxJ-Q

[3]https://blog.csdn.net/qq_36780279/article/details/103946869

[4]https://blog.csdn.net/weixin_43636302/article/details/93202006

Wyl

2021/04/23  阅读:34  主题:兰青

作者介绍

Wyl

厦门大学