从WinGo下载上市公司2001-20019年财务报告


从WinGo下载上市公司2001-20019年财务报告

上市公司基本信息我们爬了不少了,用谷歌搜索“Python 爬取上市公司年报”:

谷歌搜索“Python 爬取上市公司年报”

第一篇文章号称30行代码就可以完成,我们不妨看一下它是怎么做的。

原码

这篇文章说,A股上市公司财报分别在上交所、深交所、巨潮资讯网披露,网上有许多爬这三个网站的代码,不同网站url不同,爬取方式也不相同。

WinGo文构平台为我们提供了快捷可用的数据集,包含了2001年-2019年A股上市公司财报的下载链接。我们看一下,这里提供了表格和下载链接。

下载到表格之后,只需要对表格做读取,然后访问指定url,下载pdf就可以了。

原文代码如下:

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("===========下载完成==========")

修改

直接跑上面这份代码会报一些错误,主要是作者用的是xlsx的表格,而最新的文件已经是csv格式了;而且原码里面获取年份的方式不太正确;原码获取股票编号的方式也不准确。我还把下载所有年份财报,改为下载2019年财报。最终代码如下:

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

rawdata=pd.read_csv('公司竞争战略指标_2001_2019.csv')

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

def get_filepath(firm,year):
    file_path = 'D:\\WinGo财务报告\\'
    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)
    if year == '2019':
	    print("正在下载{},股票代码{}的{}年报".format(firm,code,year))
	    file_full_name = get_filepath(firm,year)
	    download_pdf(pdf_url,file_full_name)

非常的简单粗暴,我总共下载到了3680个2019年的上市公司财报。如果需要最新的2020年的财报,就需要找别的办法啦😎😎😎


评论
  目录