上交所的上市公司报告搜索页面http://www.sse.com.cn/disclosure/listedinfo/announcement/

通过查看页面调用的接口可以发现:

获取上交所全部股票代码http://www.sse.com.cn/js/common/ssesuggestdata.js

获取上交所全部基金代码http://www.sse.com.cn/js/common/ssesuggestfunddata.js

获取上交所全部E债券代码http://www.sse.com.cn/js/common/ssesuggestEbonddata.js

获取上交所全部T债券代码http://www.sse.com.cn/js/common/ssesuggestTbonddata.js

随便在页面上查询一个股票的年报,调用的接口如下http://query.sse.com.cn/security/stock/queryCompanyBulletin.do?jsonCallBack=jsonpCallback47120&isPagination=true&productId=600000&keyWord=&securityType=0101%2C120100%2C020100%2C020200%2C120200&reportType2=DQBG&reportType=YEARLY&beginDate=2016-07-20&endDate=2019-07-20&pageHelp.pageSize=25&pageHelp.pageCount=50&pageHelp.pageNo=1&pageHelp.beginPage=1&pageHelp.cacheSize=1&pageHelp.endPage=5&_=1563587837130

通过多次使用不同的条件调用查询该接口可以发现该接口的一部分url参数如下:

isPagination这名字一看就应该是是否分页,为了方便爬取,我们将该参数设为false

productId股票代码

keyWord关键字

securityType证券类型

参数意义securityType

全部0101,120100,020100,020200,120200

主板0101

科创板120100,020100,020200,120200

reportType reportType2报告类型

参数意义reportTypereportType2

全部ALL

定期公告ALLDQBG

年报YEARLYDQBG

第一季度季报QUATER1DQBG

半年报QUATER2DQBG

第三季度季报QUATER3DQBG

临时公告ALLLSGG

上市公司章程SHGSZCLSGG

发行上市公告FXSSGGLSGG

公司治理GSZLLSGG

股东大会会议GDDHLSGG

IPO公司公告IPOGGLSGG

其他QTLSGG

beginDate开始日期

endDate结束日期,接口每次查询的日期间隔不超过3年

以page开头的参数应该都是和分页有关的,在设置isPagination=false后这些参数都不用填写

直接调用查询接口,返回接口error系统繁忙,需要加上请求头Referer: http://www.sse.com.cn/disclosure/listedinfo/announcement/,表示是在上交所网站页面上调用的接口。

以下是我用python写的批量下载上交所上市公司报告的代码,运行后会给每个股票建一个以股票代码命名的文件夹,存放相应的pdf文件。(温馨提示:下载全部报告需要巨大的磁盘空间)

import os

import time

import requests

from copy import deepcopy

URL_SSE = "http://www.sse.com.cn/disclosure/listedinfo/announcement/"

# 股票

URL_SSE_STOCK = "http://www.sse.com.cn/js/common/ssesuggestdata.js"

# 基金

URL_SSE_FUND = "http://www.sse.com.cn/js/common/ssesuggestfunddata.js"

# E债券

URL_SSE_EBOND = "http://www.sse.com.cn/js/common/ssesuggestEbonddata.js"

# T债券

URL_SSE_TBOND = "http://www.sse.com.cn/js/common/ssesuggestTbonddata.js"

# 查询

URL_QUERY_COMPANY = "http://query.sse.com.cn/security/stock/queryCompanyBulletin.do"

URL_PDF = "http://static.sse.com.cn"

# 报告类型

REPORT_TYPE = {

'全部': ('ALL', ''),

'定期公告': ('ALL', 'DQBG'),

'年报': ('YEARLY', 'DQBG'),

'第一季度季报': ('QUATER1', 'DQBG'),

'半年报': ('QUATER2', 'DQBG'),

'第三季度季报': ('QUATER3', 'DQBG'),

'临时公告': ('ALL', 'LSGG'),

'上市公司章程': ('SHGSZC', 'LSGG'),

'发行上市公告': ('FXSSGG', 'LSGG'),

'公司治理': ('GSZL', 'LSGG'),

'股东大会会议': ('GDDH', 'LSGG'),

'IPO公司公告': ('IPOGG', 'LSGG'),

'其他': ('QT', 'LSGG'),

}

# 证券类型

SECURITY_TYPE = {

'全部': '0101,120100,020100,020200,120200',

'主板': '0101',

'科创板': '120100,020100,020200,120200',

}

HEADER = {

'Referer': URL_SSE,

'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",

}

URL_PARAM = {

# 是否分页

'isPagination': 'false',

'productId': '600000',

# 关键字

'keyWord': '',

'securityType': SECURITY_TYPE['全部'],

'reportType2': 'DQBG',

'reportType': 'YEARLY',

'beginDate': '2016-07-17',

'endDate': '2019-07-17',

}

def get_all_codes(url):

res = requests.get(url)

content = res.content.decode()

tmp = content.split('_t.push({val:"')

code, name, pinyin = [], [], []

for i in tmp[1:]:

item = i.split('"')

code.append(item[0])

name.append(item[2])

pinyin.append(item[4])

# print(code)

return code, name, pinyin

def get_pdf_url(code, begin_date, end_date, security_type='全部', report_type='年报'):

url_param = deepcopy(URL_PARAM)

url_param['productId'] = code

url_param['securityType'] = SECURITY_TYPE[security_type]

url_param['reportType2'] = REPORT_TYPE[report_type][1]

url_param['reportType'] = REPORT_TYPE[report_type][0]

url_param['beginDate'] = begin_date

url_param['endDate'] = end_date

result = requests.get(URL_QUERY_COMPANY, params=url_param, headers=HEADER).json()['result']

return [(URL_PDF + i['URL'], i['BULLETIN_TYPE'], i['BULLETIN_YEAR'], i['SSEDATE']) for i in result]

def save_pdf(code, pdf_title_urls, path='./'):

file_path = os.path.join(path, code)

if not os.path.isdir(file_path):

os.makedirs(file_path)

for url, r_type, year, date in pdf_title_urls:

date = ''.join(date.split('-'))

file_name = '_'.join([code, r_type, year, date]) + '.pdf'

file_full_name = os.path.join(file_path, file_name)

# print(file_full_name)

rs = requests.get(url, stream=True)

with open(file_full_name, "wb") as fp:

for chunk in rs.iter_content(chunk_size=10240):

if chunk:

fp.write(chunk)

def download_report(code):

month_day = time.strftime('-%m-%d', time.localtime())

year = int(time.strftime('%Y', time.localtime()))

while True:

year_3 = year - 3

begin_date = str(year_3) + month_day

end_date = str(year) + month_day

pdf_urls = get_pdf_url(code, begin_date, end_date)

# for i in title_urls:

# print(i)

if pdf_urls:

for i in range(1, 4):

try:

save_pdf(code, pdf_urls)

break

except Exception as e:

print(f'[{code}] 第{i}次尝试下载出错', e)

else:

print(f'[{code}] 下载失败')

else:

print(f'[{code}] 完毕')

break

year = year_3

if year < 1900:

break

def main():

stock_codes, _, _ = get_all_codes(URL_SSE_STOCK)

len_stock_codes = len(stock_codes)

for index, code in enumerate(stock_codes):

print(f'股票总数:{len_stock_codes}, 已完成:{index} ', end='')

download_report(code)

print('任务完成')

if __name__ == '__main__':

main()

python上市公司_Python批量下载上交所上市公司报告相关推荐

  1. python批量下载上交所上市公司报告

    上交所的上市公司报告搜索页面http://www.sse.com.cn/disclosure/listedinfo/announcement/ 通过查看页面调用的接口可以发现: 获取上交所全部股票代码 ...

  2. python爬虫实现批量下载百度图片

    今天和小伙伴们合作一个小项目,需要用到景点图片作为数据源,在百度上搜索了一些图片,感觉一个一个手动保存太过麻烦,于是想到用爬虫来下载图片. 本次代码用到了下列一些python模块,需要预先安装Beau ...

  3. 利用Python编写脚本批量下载公众号中的音频

    欢迎大家光临我的博客,大家一起交流学习哦 陈京九的博客 首先声明我只是一个小菜鸡,把自己琢磨一些功能的过程发到了这里当做记录,希望大神们轻喷,能给我一些指导就更好啦~ 上一篇博客教大家下载了公众号中的 ...

  4. Python实现壁纸批量下载

    Python实现壁纸批量下载 最近想要一些新的壁纸,但是从网站上面找一张一张下载太慢了,所以写了个爬虫批量下载壁纸. 先看看实现的效果 需要的包: requests.bs4 .os.re 源码: # ...

  5. python爬虫+ffmpeg批量下载ts文件,解密合并成mp4

    标题 python爬虫+ffmpeg批量下载ts文件,解密合并成mp4 文章目录 标题 前言 一.分析目标 二.寻找url规律 三.写代码 总结 前言 (第一次写博客,写的不好请见谅哈~~) 目标是大 ...

  6. ChatGPT炒股:批量下载北交所上市公司的招股说明书

    打开北京证券交易所官网,点击发行上市,然后点击公开发行信息披露,然后在查询框里面输入关键词:在北京证券交易所上市招股说明书,然后选择时间,点击查询,就可以看到所有北交所上市公司的招股说明书了,一共4页 ...

  7. python自动下载邮件附件_Python批量下载电子邮件附件并汇总合并Excel文件

    原标题:Python批量下载电子邮件附件并汇总合并Excel文件 前几天在公众号搞了一波送书活动,详见福利:免费赠送240本Python教材,该文推送之后,立刻收到了大量的样书申请表,那么接下来的工作 ...

  8. python批量下载b站_python 批量下载bilibili视频的gui程序

    运行效果: 完整代码: # !/usr/bin/python # -*- coding:utf-8 -*- # time: 2019/07/02--08:12 __author__ = 'Henry' ...

  9. python 批量下载 代码_python 批量下载文件

    有时候看到好看的视频就想保存到本地,但是有的网站视频都是分段的,先去请求一个文件列表,再按照列表去拼接请求分段视频. 就类似这样:(这是开讲了某期的视频请求列表 http://hls.cntv.mya ...

最新文章

  1. Linux排序命令sort笔记
  2. jrockit_JRockit – JRCMD有用的命令
  3. Spark Structured : HIve jdbc方式访问待下划线的表,找不到表的错误
  4. GNS3全面详解系列-GNS3的前世今生
  5. #ifdef __cplusplus extern C { #endif”的定义
  6. JSP/Servlet-----charset 、pageEncoding差别
  7. 你不知道的JS(原型)
  8. 编译生成动态链接库pdfium.dll
  9. 数学建模学习(24): 排队论模型完整详细讲解,数学与案例结合,lingo软件搭配,数学不好也能学会!
  10. AutoCAD 2020安装失败(错误代码:1603)的解决方法/对于Autodesk系列产品都有效
  11. Android消息提醒
  12. 名人投资加密货币:推动行业发展的重要力量(连载:四)
  13. 中英互译软件工程设计
  14. IT服务模式变迁影射新旧商业时代交替
  15. Docker 搭建「个人网盘」,放弃 Pandownload!
  16. 傅园慧为何一夜走红?互联网体育和网红经济爆发
  17. android 友盟服务端推送给客户端,Android 友盟推送 厂商通道 接入Notes
  18. Android获取当前屏幕截图,简单粗暴!
  19. 产品经理的职业生涯规划是怎样的
  20. java多媒体龟兔赛跑_Java多线程——模拟龟兔赛跑的场景

热门文章

  1. 叠加原理--戴维南等效电路--第四篇
  2. html导航栏点击之后变色,鼠标滑过字体加粗、背景变色的CSS导航栏
  3. linux设置用户的执行权限,Linux下ACL权限控制以及用sudo设置用户对命令的执行权限...
  4. 远程计算机IP地址如何获取,获取远程主机的IP地址
  5. DNS服务器IP地址大全
  6. P2P终结者---控制整个局域网网络的管理软件
  7. 多标签文本分类研究进展概述
  8. 营销思维篇:透漏22个我赚钱的小秘密
  9. dnf吸怪源码c语言,发DNF源码了
  10. 争对让望对思野葛对山栀注解_《笠翁对韵》上卷四支详解