精华内容
下载资源
问答
  • 6小时爬完上交所和深交所的年报问询函

    千次阅读 多人点赞 2019-05-15 23:34:53
    昨天开组会的时候导师说想搞年报问询函的研究,但是买数据库太贵了。我说老板,放着我来( ‵▽′)ψ。 任务描述 -分别从上交所和深交所的官网上爬取年报问询函的记录 解决思路 解析网页获取全部的年报问询函列表...

    “没有枪没有炮我们给自己造。”

    —— 周书人

    昨天开组会的时候导师说想搞年报问询函的研究,但是买数据库太贵了。我说放着我来 ( ‵▽′)ψ。

    一、任务描述

    • 分别从上交所和深交所的官网上爬取年报问询函的记录

    二、解决思路

    • 解析网页获取全部的年报问询函列表及相应的文件链接
    • 打开第一步获取的文件链接,读取 PDF 数据,并直接转成 TXT 格式的文字

    三、网页分析

    以上交所网站为例:

    1. 数据包位置

    深交所网页

    上交所的年报问询列表存储在响应的一个 JSON 文件里,只要用 Python3 发送请求并截取这个 JSON 包就可以直接获取该页的列表啦。

    2. 翻页

    由于网站结构简单,所以翻页也很好实现。对比第一页的参数和第二页的参数可以发现:翻页的关键在于 pageHelp.pageNopageHelp.beginPage 这两个参数上,所以虽然一共有 88 页的问询函,只要每次 post 不同的页数就可以得到相应的页面。
    第一页参数第二页参数

    3. 下载PDF

    通过前两步的分析我们已经拿到了上交所问询函的所有列表:
    上交所列表
    显然上交所网站里已经直接给出了每个问询函 PDF 的下载链接(即表格最后一列),直接打开这个链接就可以读取保存相应的问询函。

    4. 深交所网页和上交所网页的区别

    深交所网站比较好的是直接给出了问询函列表并且同时给出了函件内容和公司回复文档的文件编码:
    深交所问询函列表
    举个栗子:加入函件内容的文件编码是 CDD00080753986.pdf ,那么给这个编码套上外衣就是可以打开的 PDF 地址了:
    http://reportdocs.static.szse.cn/UpFiles/fxklwxhj/ + 文件编码+ ?random=0.42680171432249325
    最后得到的URL地址为:http://reportdocs.static.szse.cn/UpFiles/fxklwxhj/CDD00080753986.pdf?random=0.42680171432249325
    小伙伴们可以试试打开是不是正确的问询函件。

    四、PDF转TXT

    Python3 里用经典的 Pdfminer3k 包即可解决,这里直接改了大佬的代码ᕕ( ᐛ )ᕗ:Pythonscrapy的简书:python3 在线读取pdf

    五、核心代码

    1. 获取上交所问询函列表

    本来应该规规矩矩地用 Requests 包的 post 方法上传参数的,但是我太懒了啊哈哈哈就直接迭代了丑丑的 URL。

    import requests
    
    def downlourl(currentpage):
        url = "http://query.sse.com.cn/commonSoaQuery.do?siteId=28&sqlId=BS_GGLL&extGGLX=&stockcode=&channelId=10743%2C10744%2C10012&extGGDL=&order=createTime%7Cdesc%2Cstockcode%7Casc&isPagination=true&pageHelp.pageSize=15&pageHelp.pageNo=" + repr(currentpage) + "&pageHelp.beginPage=" + repr(currentpage) +"&pageHelp.cacheSize=1"
        return(url)
    
    headers = {
        'Referer':'http://www.sse.com.cn/disclosure/credibility/supervision/inquiries/',
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    }
    
    with open('上交所列表.txt',"a") as f:
        for page in range(89):
            r = requests.get(downlourl(page), headers=headers)
            for i in r.json()['result']:
                f.write('\t''.join([i['cmsOpDate'],i['docTitle'],i['stockcode'],i['extWTFL'],i['extGSJC'],i['docType'],i['createTime'],i['docURL']])+'\n')
            print('完成爬取第%d页'%page)  
    

    2. 爬取PDF并直接转为TXT

    import pandas as pd
    import time
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.request import quote
    import requests
    from pdfminer.converter import PDFPageAggregator
    from pdfminer.layout import LTTextBoxHorizontal, LAParams
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
    from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
    from pdfminer.pdfparser import PDFParser, PDFDocument
    
    
    data = pd.read_table('/Users/mengjiexu/深交所回复列表.txt',header=None,encoding='utf8',delim_whitespace=True)
    data.columns=['函件编码','函件类型']
    
    
    函件编码 = data.loc[:,'函件编码']
    函件类型 = data.loc[:,'函件类型']
    
    headers = {'content-type': 'application/json',
               'Accept-Encoding': 'gzip, deflate',
               'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'}
    
    baseurl = "http://reportdocs.static.szse.cn/UpFiles/fxklwxhj/"
    
    def parse(docucode):
        # 打开在线PDF文档
        _path = baseurl + quote(docucode) +"?random=0.3006649122149502"
        request = Request(url=_path, headers=headers)  # 随机从user_agent列表中抽取一个元素
        fp = urlopen(request)
        # 读取本地文件
        # path = './2015.pdf'
        # fp = open(path, 'rb')
        # 用文件对象来创建一个pdf文档分析器
        praser_pdf = PDFParser(fp)
        # 创建一个PDF文档
        doc = PDFDocument()
        # 连接分析器 与文档对象
        praser_pdf.set_document(doc)
        doc.set_parser(praser_pdf)
        # 提供初始化密码doc.initialize("123456")
        # 如果没有密码 就创建一个空的字符串
        doc.initialize()
        # 检测文档是否提供txt转换,不提供就忽略
        if not doc.is_extractable:
            raise PDFTextExtractionNotAllowed
        else:
            # 创建PDf资源管理器 来管理共享资源
            rsrcmgr = PDFResourceManager()
            # 创建一个PDF参数分析器
            laparams = LAParams()
            # 创建聚合器
            device = PDFPageAggregator(rsrcmgr, laparams=laparams)
            # 创建一个PDF页面解释器对象
            interpreter = PDFPageInterpreter(rsrcmgr, device)
            # 循环遍历列表,每次处理一页的内容
            # doc.get_pages() 获取page列表
            for page in doc.get_pages():
                # 使用页面解释器来读取
                interpreter.process_page(page)
                # 使用聚合器获取内容
                layout = device.get_result()
                # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性,
                for out in layout:
                    # 判断是否含有get_text()方法,图片之类的就没有
                    # if ``hasattr(out,"get_text"):
                    docname = "/Users/mengjiexu/罗党论/年报问询函/深交所回复/"+str(docucode).split('.')[0]+'.txt'
                    with open(docname,'a') as f:
                        if isinstance(out, LTTextBoxHorizontal):
                            results = out.get_text()
                            print(results)
                            f.write(results)
    
    
    for i in range(len(函件编码)):
        函件名称 = (函件编码[i] + '.' + 函件类型[i])
        print(函件名称)
        开始爬取时间 = "这是第%d个公告"%i
        print(开始爬取时间)
        print(time.strftime('%Y.%m.%d.%H:%M:%S',time.localtime(time.time())))
        if 函件类型[i]=="pdf":
            parse(函件名称)
            print(函件名称 + "爬取成功")
        else:
            with open("/Users/mengjiexu/深交所回复/%s"%函件名称,'wb') as f:
                _path = baseurl + quote(函件名称) +"?random=0.3006649122149502"
                request = requests.get(url=_path, headers=headers)  # 随机从user_agent列表中抽取一个元素
                f.write(request.content)
        结束爬取时间 = time.strftime('%Y.%m.%d.%H:%M:%S', time.localtime(time.time()))
        print(结束爬取时间)
        print("第%d个公告爬取完成" % i)
    

    3. 遍历文件夹中所有TXT和DOC文件并生成列表

    参考了 Lynn大神的博客 |・ω・`)

    import os
    import docx2txt
    from openpyxl import Workbook
    
    content_list = []
    
    wb = Workbook()
    sheet = wb.active
    sheet['A1'].value = '公告编码'
    sheet['A2'].value = '公告内容'
    
    def readdocx(filepath):
        content = docx2txt.process(filepath)  #打开传进来的路径
        docucode = filepath.split('/')[-1]
        content_list.append([docucode.split('.')[0],content])
        content_list.append([docucode.split('.')[0],content])
    
    def readtxt(filepath):
        content = open(filepath, "r").read()     #打开传进来的路径
        docucode = filepath.split('/')[-1]
        content_list.append([docucode.split('.')[0],content])
    
    def eachFile(filepath):
        pathDir = os.listdir(filepath) #获取当前路径下的文件名,返回List
        for s in pathDir:
            newDir=os.path.join(filepath,s)#将文件命加入到当前文件路径后面
            if os.path.isfile(newDir) :         #如果是文件
                doctype = os.path.splitext(newDir)[1]
                if doctype == ".txt":  #判断是否是txt
                    readtxt(newDir)
                elif doctype == ".docx":
                    readdocx(newDir)
                else:
                    pass
            else:
                eachFile(newDir) #如果不是文件,递归这个文件夹的路径
    
    
    eachFile("/Users/上交所txt/")
    a = 1
    for doc in content_list:
        sheet['A%d'%a].value = doc[0]
        print(doc[0])
        sheet['B%d'%a].value = doc[1]
        a += 1
    wb.save('上交所问询函.xlsx')
    

    六、最终爬取结果

    最终爬取列表

    主要参考链接

    1. https://www.cnblogs.com/SeekHit/p/6245283.html
    2. http://www.imooc.com/wenda/detail/432379
    3. https://www.jianshu.com/p/42caf169764b
    展开全文
  • pdfminer不能解析上交所问询函,使用解析功能更为强大的pdfplumber可以解析,但是内容上可能会出现个别字重复的现象; pdfminer3k、pdfplumber可能存在不兼容问题导致程序无法运行,解析上交所年报用到pdfplumber,...

    注意事项

    需要安装一些包,如pdfminer、pdfminer3k、pdfplumber等;
    pdfminer不能解析上交所问询函,使用解析功能更为强大的pdfplumber可以解析,但是内容上可能会出现个别字重复的现象;
    pdfminer3k、pdfplumber可能存在不兼容问题导致程序无法运行,解析上交所年报用到pdfplumber,如果不能运行,根据提示看是否安装了pdfminer,或者尝试卸载pdfminer3k重新安装pdfplumber;
    解析深交所年报用到pdfminer3k,如果安装了仍然不能运行,可尝试卸载pdfplumber,重新安装pdfminer3k;
    如果要爬取所有问询函,需要根据实际页数更改代码中的循环参数。

    上交所

    第一步,爬取上交所问询函链接

    # -*- coding: utf-8 -*-
    # @Time    : 2020/8/6 18:16
    # @Author  : 马拉小龙虾
    # @FileName: 上交所一条龙.py
    # @Software: PyCharm Community Edition
    # @Blog    :https://blog.csdn.net/weixin_43636302
    
    
    
    import requests
    import csv
    import re
    
    def downlourl(currentpage):
        url = "http://query.sse.com.cn/commonSoaQuery.do?siteId=28&sqlId=BS_GGLL&extGGLX=&stockcode=&channelId=10743%2C10744%2C10012&extGGDL=&order=createTime%7Cdesc%2Cstockcode%7Casc&isPagination=true&pageHelp.pageSize=15&pageHelp.pageNo=" + repr(currentpage) + "&pageHelp.beginPage=" + repr(currentpage) +"&pageHelp.cacheSize=1"
        return(url)
    
    headers = {
        'Referer':'http://www.sse.com.cn/disclosure/credibility/supervision/inquiries/',
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    }
    
    with open('sh.csv',"w",newline='') as f:
        writer = csv.writer(f, delimiter=',')
        title=['时间2','标题','公司代码','函件类别','公司简称','函件类型','时间1','网址','函件编码']
        writer.writerow(title)
        for page in range(1,101):
            r = requests.get(downlourl(page), headers=headers)
            for i in r.json()['result']:
                result=re.search('c/(\d+).pdf',i['docURL'])
                print(result.group(1))
                # print(i['docURL'][-20:-4])
                writer.writerow([i['cmsOpDate'],i['docTitle'],i['stockcode'],i['extWTFL'],i['extGSJC'],i['docType'],i['createTime'],i['docURL'],re.search('c/(\d+).pdf',i['docURL']).group(1)])
            print('完成爬取第%d页'%page)
    

    第二步,下载问询函并解析,保存到单个txt文件中

    import pandas as pd
    import time
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.request import quote
    import requests
    import pdfplumber
    import re
    
    data = pd.read_csv("sh.csv",encoding='GBK')
    
    
    函件编码 = data.loc[:,'函件编码']
    网址 = data.loc[:,'网址']
    函件类型 = data.loc[:,'函件类型']
    
    headers = {'content-type': 'application/json',
               'Accept-Encoding': 'gzip, deflate',
               'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'}
    
    baseurl = "http://reportdocs.static.szse.cn/UpFiles/fxklwxhj/"
    
    def parse(docucode):
    
        _path = "http://" + quote(docucode)
        print(_path)
    
        resource = requests.get(_path, stream=True)
        with open('E:\\py_shiyan\\Pycharm备份\\询证函\\上交所/'+re.search('c/(\d+.pdf)', docucode).group(1),'wb') as fd:
            for y in resource.iter_content(102400):
                fd.write(y)
            print(re.search('c/(\d+.pdf)', docucode).group(1), '完成下载')
        # 读取本地文件
        path = 'E:\py_shiyan\Pycharm备份\询证函\上交所/'+ re.search('c/(\d+.pdf)', docucode).group(1)
        pdf = pdfplumber.open(path)
        f = open("E:\py_shiyan\Pycharm备份\询证函\上交所/" + re.search('c/(\d+).pdf', docucode).group(1) + '.txt', 'w')
        f2 = open("E:\py_shiyan\Pycharm备份\询证函\上交所/" +  '异常记录.txt', 'a')
        n=1
        for page in pdf.pages:
            n+=1
            print(page.extract_text())
            try:
                f.writelines(page.extract_text())
            except:
                print(f'========={docucode}第{n}页解码异常==========')
                f2.write(f'\n ========={docucode}第{n}页解码异常==========')
    
    
    for i in range(len(网址)):
        函件名称 =re.search('c/(\d+.pdf)', 网址[i]).group(1)
        # 函件名称 = 网址[i][-20:]
        # 标题=标题[i]
        print(函件名称)
        开始爬取时间 = "这是第%d个公告"%i
        print(开始爬取时间)
        print(time.strftime('%Y.%m.%d.%H:%M:%S',time.localtime(time.time())))
        try:
            if 函件类型[i]=="pdf":
                parse(网址[i])
                print(函件名称 + "爬取成功")
            else:
                with open("E:\py_shiyan\Pycharm备份\询证函\上交所\%s"%函件名称,'wb') as f:
                    _path = baseurl + quote(函件名称) +"?random=0.3006649122149502"
                    request = requests.get(url=_path, headers=headers)  # 随机从user_agent列表中抽取一个元素
                    f.write(request.content)
            结束爬取时间 = time.strftime('%Y.%m.%d.%H:%M:%S', time.localtime(time.time()))
            print(结束爬取时间)
            print("第%d个公告爬取完成" % i)
        except:
            time.sleep(5)
            try:
                if 函件类型[i]=="pdf":
                    parse(网址[i])
                    print(函件名称 + "爬取成功")
                else:
                    with open("E:\py_shiyan\Pycharm备份\询证函\上交所\%s"%函件名称,'wb') as f:
                        _path = baseurl + quote(函件名称) +"?random=0.3006649122149502"
                        request = requests.get(url=_path, headers=headers)  # 随机从user_agent列表中抽取一个元素
                        f.write(request.content)
                结束爬取时间 = time.strftime('%Y.%m.%d.%H:%M:%S', time.localtime(time.time()))
                print(结束爬取时间)
                print("第%d个公告爬取完成" % i)
            except:
                f2 = open("E:\py_shiyan\Pycharm备份\询证函\上交所/" + '异常记录.txt', 'a')
                f2.write(f'\n ========={函件名称}爬取时网络异常==========')
    

    第三步,将所有单个txt文件中的内容放到一个excel中

    import os
    import docx2txt
    from openpyxl import Workbook
    
    content_list = []
    
    wb = Workbook()
    sheet = wb.active
    sheet['A1'].value = '公告编码'
    sheet['A2'].value = '公告内容'
    
    def readdocx(filepath):
        content = docx2txt.process(filepath)  #打开传进来的路径
        docucode = filepath.split('/')[-1]
        content_list.append([docucode.split('.')[0],content])
        content_list.append([docucode.split('.')[0],content])
    
    def readtxt(filepath):
        content = open(filepath, "r").read()
        docucode = filepath.split('/')[-1]
        content_list.append([docucode.split('.')[0],content])
    
    def eachFile(filepath):
        pathDir = os.listdir(filepath) #获取当前路径下的文件名,返回List
        for s in pathDir:
            newDir=os.path.join(filepath,s)#将文件命加入到当前文件路径后面
            if os.path.isfile(newDir) :         #如果是文件
                doctype = os.path.splitext(newDir)[1]
                if doctype == ".txt":  #判断是否是txt
                    readtxt(newDir)
                elif doctype == ".docx":
                    readdocx(newDir)
                else:
                    pass
            else:
                eachFile(newDir) #如果不是文件,递归这个文件夹的路径
    
    filepath="E:\py_shiyan\Pycharm备份\询证函\上交所"
    eachFile("E:\py_shiyan\Pycharm备份\询证函\上交所/")
    a = 1
    for doc in content_list:
        sheet['A%d'%a].value = doc[0]
        print(doc[0])
        sheet['B%d'%a].value = doc[1]
        a += 1
    wb.save('上交所.xlsx')
    

    深交所问询函

    第一步,下载深交所问询函信息。

    import requests
    import csv
    import re
    
    def downlourl(currentpage):
        # url = "http://www.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=main_wxhj&loading=first&random=0.8973760391132892"
        url="http://www.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=main_wxhj&TABKEY=tab1&PAGENO="+ str(currentpage)+"&random=0.7562589043142469"
        return(url)
    
    headers = {
        'Referer':'http://www.szse.cn/disclosure/supervision/inquire/index.html',
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    }
    
    with open('sz.csv',"w",newline='') as f:
        title=['公司代码','公司简称','发函日期','函件类别','函件编码','公司回复','函件类型']
        # title=['函件编码','函件类型']
        writer = csv.writer(f, delimiter=',')
        writer.writerow(title)
        for page in range(1,2):
            r = requests.get(downlourl(page), headers=headers)
            # print(r.json()[0])
            for i in r.json()[0]['data']:
                # print(i)
                ck=re.search("encode-open=(.*?)>",i['ck'])
                hfck=re.search(">(.*?)<",i['hfck'])
                # print((ck.group(1)).split(".")[1][:-1])
                lx=(ck.group(1)).split(".")[1][:-1]
                if hfck:
                    # print(hfck.group(1))
                    hfck=hfck.group(1)
                try:
                    writer.writerow([i['gsdm'],i['gsjc'],i['fhrq'],i['hjlb'],(ck.group(1))[19:-5],hfck,lx])
                except:
                    f2 = open("E:\py_shiyan\Pycharm备份\询证函\深交所/" + '异常记录.txt', 'a')
                    f2.write(f'\n ========={(ck.group(1))[19:-5]}解码异常==========')
                # writer.writerow([(ck.group(1))[19:-5],lx])
            print('完成爬取第%d页'%page)
    

    第二步,根据基本信息拼接出问询函链接,在线解析PDF到单个txt文件。

    import pandas as pd
    import time
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.request import quote
    import requests
    from pdfminer.converter import PDFPageAggregator
    from pdfminer.layout import LTTextBoxHorizontal, LAParams
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
    from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
    from pdfminer.pdfparser import PDFParser, PDFDocument
    
    
    data = pd.read_csv("sz.csv",encoding='GBK')
    # data = pd.read_csv("sz.csv",encoding='GBK')
    # print(data)
    # data.columns=['函件编码','函件类型']
    
    
    函件编码 = data.loc[:,'函件编码']
    函件类型 = data.loc[:,'函件类型']
    
    headers = {'content-type': 'application/json',
               'Accept-Encoding': 'gzip, deflate',
               'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'}
    
    baseurl = "http://reportdocs.static.szse.cn/UpFiles/fxklwxhj/"
    
    def parse(docucode):
        # 打开在线PDF文档
        _path = baseurl + quote(docucode) +"?random=0.3006649122149502"
        request = Request(url=_path, headers=headers)  # 随机从user_agent列表中抽取一个元素
        fp = urlopen(request)
        # 读取本地文件
        # path = './2015.pdf'
        # fp = open(path, 'rb')
        # 用文件对象来创建一个pdf文档分析器
        praser_pdf = PDFParser(fp)
        # 创建一个PDF文档
        doc = PDFDocument()
        # 连接分析器 与文档对象
        praser_pdf.set_document(doc)
        doc.set_parser(praser_pdf)
        # 提供初始化密码doc.initialize("123456")
        # 如果没有密码 就创建一个空的字符串
        doc.initialize()
        # 检测文档是否提供txt转换,不提供就忽略
        if not doc.is_extractable:
            raise PDFTextExtractionNotAllowed
        else:
            # 创建PDf资源管理器 来管理共享资源
            rsrcmgr = PDFResourceManager()
            # 创建一个PDF参数分析器
            laparams = LAParams()
            # 创建聚合器
            device = PDFPageAggregator(rsrcmgr, laparams=laparams)
            # 创建一个PDF页面解释器对象
            interpreter = PDFPageInterpreter(rsrcmgr, device)
            # 循环遍历列表,每次处理一页的内容
            # doc.get_pages() 获取page列表
            for page in doc.get_pages():
                # 使用页面解释器来读取
                interpreter.process_page(page)
                # 使用聚合器获取内容
                layout = device.get_result()
                # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性,
                for out in layout:
                    # 判断是否含有get_text()方法,图片之类的就没有
                    # if ``hasattr(out,"get_text"):
                    docname = "E:\py_shiyan\Pycharm备份\询证函\深交所/"+str(docucode).split('.')[0]+'.txt'
                    with open(docname,'a') as f:
                        if isinstance(out, LTTextBoxHorizontal):
                            results = out.get_text()
                            print(results)
                            try:
    						    f.write(results)
    						except:
    						    print(f'========={docucode}解码异常==========')
    						    f3 = open("E:\py_shiyan\Pycharm备份\询证函\深交所/" + '异常记录.txt', 'a')
    						    f3.write(f'\n ========={docucode}页解码异常==========')
    
    
    for i in range(len(函件编码)):
        函件名称 = (函件编码[i] + '.' + 函件类型[i])
        print(函件名称)
        开始爬取时间 = "这是第%d个公告"%i
        print(开始爬取时间)
        print(time.strftime('%Y.%m.%d.%H:%M:%S',time.localtime(time.time())))
        if 函件类型[i]=="pdf":
            parse(函件名称)
            print(函件名称 + "爬取成功")
        else:
            with open("E:\py_shiyan\Pycharm备份\询证函\深交所\%s"%函件名称,'wb') as f:
                _path = baseurl + quote(函件名称) +"?random=0.3006649122149502"
                request = requests.get(url=_path, headers=headers)  # 随机从user_agent列表中抽取一个元素
                f.write(request.content)
        结束爬取时间 = time.strftime('%Y.%m.%d.%H:%M:%S', time.localtime(time.time()))
        print(结束爬取时间)
        print("第%d个公告爬取完成" % i)
    

    第三步,将所有txt文件中的信息汇总到一个excel中。

    import os
    import docx2txt
    from openpyxl import Workbook
    
    content_list = []
    
    wb = Workbook()
    sheet = wb.active
    sheet['A1'].value = '公告编码'
    sheet['A2'].value = '公告内容'
    
    def readdocx(filepath):
        content = docx2txt.process(filepath)  #打开传进来的路径
        docucode = filepath.split('/')[-1]
        content_list.append([docucode.split('.')[0],content])
        content_list.append([docucode.split('.')[0],content])
    
    def readtxt(filepath):
        content = open(filepath, "r").read()     #打开传进来的路径
        docucode = filepath.split('/')[-1]
        content_list.append([docucode.split('.')[0],content])
    
    def eachFile(filepath):
        pathDir = os.listdir(filepath) #获取当前路径下的文件名,返回List
        for s in pathDir:
            newDir=os.path.join(filepath,s)#将文件命加入到当前文件路径后面
            if os.path.isfile(newDir) :         #如果是文件
                doctype = os.path.splitext(newDir)[1]
                if doctype == ".txt":  #判断是否是txt
                    readtxt(newDir)
                elif doctype == ".docx":
                    readdocx(newDir)
                else:
                    pass
            else:
                eachFile(newDir) #如果不是文件,递归这个文件夹的路径
    
    
    filepath="E:\py_shiyan\Pycharm备份\询证函\深交所"
    eachFile("E:\py_shiyan\Pycharm备份\询证函\深交所/")
    a = 1
    for doc in content_list:
        sheet['A%d'%a].value = doc[0]
        print(doc[0])
        sheet['B%d'%a].value = doc[1]
        a += 1
    wb.save('深交所.xlsx')
    

    PS:想要提高速度,还可以使用多线程。

    展开全文
  • 目录 一、任务描述 ... 获取上交所问询函列表 2. 爬取PDF并直接转为TXT 3. 遍历文件夹中所有TXT和DOC文件并生成列表 六、最终爬取结果 主要参考链接 昨天开组会的时候导师说想搞..

    原文链接:https://www.lianxh.cn/news/0e57c635cd225.html

    目录

     

     


    昨天开组会的时候导师说想搞年报问询函的研究,但是买数据库太贵了。我说放着我来 ( ′)ψ。

    一、任务描述

    • 分别从上交所和深交所的官网上爬取年报问询函的记录

    二、解决思路

    • 解析网页获取全部的年报问询函列表及相应的文件链接
    • 打开第一步获取的文件链接,读取 PDF 数据,并直接转成 TXT 格式的文字

    主要参考链接

    温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」

    1. Python文件处理:递归批处理文件夹子目录内所有 txt 数据
    2. Python 爬虫怎么处理 json 内容
    3. Python3 在线读取 PDF
    展开全文
  • 会针对财务报告、并购重组、关联交易、股票异常波动和媒体报道的社会热点等事件发出问询函,详细列出相关监管规则的具体条款,并要求上市公司结合所列条款和自身的行为在规定时间内进行解释说明、补充披露和错误更正...

    点击蓝字,关注我们

    一、数据简介

    问询函是指,上海证券交易所和深圳证券交易所在审核上市公司相关公告过程中如果发现未达到“直接监管标准”(一般表现为信息披露不准确或内容不全)的问题时,会针对财务报告、并购重组、关联交易、股票异常波动和媒体报道的社会热点等事件发出问询函,详细列出相关监管规则的具体条款,并要求上市公司结合所列条款和自身的行为在规定时间内进行解释说明、补充披露和错误更正,或要求上市公司的法律顾问和财务顾问有针对性地发表意见。无论是发函还是回函,交易所都要求上市公司及时公开披露,倘若上市公司仍存在信息披露不准确或不全的问题,交易所还会出具二次问询函甚至三次问询函。以问询函为载体的监管形式是我国证券交易所对上市公司进行日常监管的重要手段。

    问询函制度的广泛采用源于2013年的信息披露直通车改革,改革之后,交易所对上市公司财务报告的监管重心由事前转移到事后监管,问询函便是事后监管的主要途径之一。 显然,问询函是增加信息披露的一种重要方式,其及时、专业的特性使得我们既能了解到交易所对上市公司的监管内容和监管力度,也能分析评估相关上市公司的公司治理能力、潜在风险,还会对利益相关者的决策产生影响。  


      CnOpenData平台的证券交易所问询函数据库涵盖了上交所的问询函件,以及深交所的问询函件及回复,为案例分析、大样本实证研究提供了数据基础。

    二、时间区间

    2020年1月1日之前所有数据

    三、字段展示

    在这里插入图片描述

    四、样本数据

    在这里插入图片描述
    在这里插入图片描述

    五、相关文献

    • 陈运森、邓祎璐、李哲,2018:《非处罚性监管具有信息含量吗?——基于问询函的证据》,《金融研究》第4期。
    • 陈运森、邓祎璐、李哲,2019:《证券交易所一线监管的有效性研究:基于财务报告问询函的证据》,《管理世界》第3期。
    • 李晓溪、杨国超、饶品贵,2019:《交易所问询函有监管作用吗?——基于并购重组报告书的文本分析》,《经济研究》第5期。
    • 张俊生、汤晓建、李广众,2018:《预防性监管能够抑制股价崩盘风险吗?——基于交易所年报问询函的研究》,《管理科学学报》第10期。

    六、数据更新频率

    年度更新

    展开全文
  • 目录前言准备工作json包的抓取获取其他页数的数据查询股价接口代码编写遍历爬取所有问询函查询被发函公司发函日(第T日)后3天的股价导出与导入导出导入 前言 最近实习需要做一些关于问询函的研究,但手工整理相关信息...
  • 雷帝网 乐天 11月10日报道中小板公司管理部日前向巨人网络下发监管,称巨人网络存在违规事项。巨人网络在2016年重组上市过程中募集配套...中小板公司管理部称,巨人网络在2016年、2017年的年度报告与年度募集资金...
  • Python爬取上交所年报下载并转TXT

    千次阅读 2020-01-15 23:08:54
    6小时爬完上交所和深交所的年报问询函 Python爬取上交所年报并下载 一、任务描述 从上交所官网上爬取年报并转成TXT 二、解决思路 1、解析网页,结合日期获取全部的年报链接,下载PDF 2、读取第一步获取的PDF,...
  • Python爬取上交所年报下载并转成TXT

    千次阅读 2020-01-15 23:32:10
    6小时爬完上交所和深交所的年报问询函 Python爬取上交所年报并下载 一、任务描述 从上交所的官网上爬取年报PDF文档,并且转成TXT。 二、解决思路 1、解析网页获取年报的文件链接,并下载PDF 2、读取第一步的...
  • 5月31日,根据深交所网站相关公告,深交所创业板公司管理部就在年报事后审查中关注到的情况,对天龙光电发出了问询函。 值得注意的是,据记者整理,问询函涉及的内容除坏账计提、预收账款、预付账款、待摊费用、管理...
  • 还是年报问询函的研究,需要从问询函文本中提取交易所要求回复的日期,同时还需要从公司回复的文本中提取公司实际上回复的日期。因此需要对两类文本分别进行分析。 解决思路 通过观察,发现问询函中含有交易所要求...
  • 而在进一步核对交易所发出的监管问询函时,不难发现,监管部门问询函主要聚焦三大主题: ■ 要求上市公司披露区块链业务的具体模式,包括应用场景、盈利模式等; ■ 要求上市公司详细说明公司业务进展,包括人才、...
  • 作者:Ivans出品:陀螺财经编者按:区块链营收,向来是业内十分关注的问题,然而,大部分上市企业对此披露甚少。2月5日,深交所向智度股份发出关注。智度股份2021年1月3日晚披露的《...
  •  参考资料: 【1】智度股份:2020年半年度报告 【2】智度股份:股票交易异常波动公告 【3】智度股份:2020年度业绩预告 【4】智度股份:关于深圳证券交易所关注回复的公告 推荐阅读: 2021年,这些波卡生态项目...
  • ST慧球5月19日晚公告,收到了上海证券交易所的问询函,就公司2016年年度报告相关事项提出问询。 年报披露,公司主营业务为智慧城市业务和物业管理业务。公司本期智慧城市业务收入仅为116万元,占公司总收入的2.4%,...
  • 一次定增引来深交所两个问询函,一个多月后,向日葵在11月19日终于对发布了对交易所问询函的回复。 据了解,此前向日葵宣布拟以5.2亿元总价收购收购奥能电源,具体方式为发行股份加现金收购,标的增值率达到1019.91%...
  • 交易所年报问询函要求力帆股份补充披露报告期末汽车业务相关资产的具体情况;公司汽车生产线和产品是否已完成针对国六标准的升级工作,是否已充分计提相应的资产减值准备。 此外,力帆股份2019年内计提存货跌价损失2...
  • 正如此前蚂蚁 集团回复上市首轮问询函称,其年度活跃用户超过 10 亿,而阿里巴巴集团中国零售 市场年度活跃用户已超过 7.4 亿,双方均覆盖了中国绝大多数互联网用户,客户基础 天然重合,在客户基础方面公司不存在对...
  • 原标题 | 拉卡拉欲收购上市前剥离的小贷公司 深交所下发关注:是否进行大股东利益输送? 4月10日,深交所下发关注,要求拉卡拉支付股份有限公司(下称"拉卡拉")解释其在上市不到1年内即重新收购剥离公司的合理...
  • 深交所迅速下发关注函以及年报问询函,要求拉卡拉披露小贷公司详细情况、回购原因、是否存在套利行为、是否为P2P 平台提供引流以及年报数据下滑的原因等情况。 昨日晚间,拉卡拉公开披露了对深交所年报问询函的回复...
  • 据北信源2020年5月发布的《关于深圳证券交易所创业板年报问询函的回复》显示,信任度2017-2019年的净利润分别是-415.99万元、-190.77万元、-662.66万元。 可以看到,以上区块链企业大部分连年亏损,部分企业去年开始...
  • 近日,A股上市公司拉卡拉就日前收到的深交所年报问询函进行回复。 据了解,深交所这次问询函中,涉及问题包括支付业务收入同比下降的合理性、金融科技业务的具体合作方,还有剥离金融业务情况下为从事这类业务原因...
  • 2015年4月23日,暴风发布亏损的2015年度一季报。此前暴风曾宣布对旗下的“魔镜”项目增资扩股6000万元,一季度整体亏损正因“魔镜”等虚拟现实业务处于早期大规模投入阶段。 那一年,中国A股迎来高光时刻。中国...
  • 再过几天,同洲电子将公布2016年年报,如果没有“惊天大逆转”的话,这家公司将被贴上“巨亏”的标签。在2月28日,同洲电子发布了业绩快报,该公司去年营收只有5.5亿元,归属于上市公司股东的净利润为亏损4.9亿元。 ...
  • 如何拯救嘉陵摩托,保护品牌文化,中国嘉陵在对年报问询函的回复中称:“公司将战略性发展特种车、零部件等成长业务,推进摩托车业务调整转型。”对于摩托车这个昔日的业绩“功臣”,公司已经有了降低其业务占比的...
  • 该文章将深圳证券交易所的常规询问内容篡改为“指出长期停牌问题、2015年报的重重疑点”,有意引导读者片面解读年报问询函内容,故意歪曲、虚构事实,并且在毫无证据支持的情况下捕风捉影、牵强附会,诋毁美年健康和...
  • 近日,湖南发展集团股份有限公司(以下简称“公司”)收到深圳证券交易所公司部发来的《关于对湖南发展集团股份有限公司的年报问询函》(公司部年报问询函[2016]第 281 号),公司就问询函所提问题进行了认真核查,...
  • 5月11日晚间,亿晶光电再次延期了对上交所问询函的第三次回复,申请延期至5月16日,此前公司就说延期到5月11日完成回复。监管层关注的事情主要内容为亿晶光电实际控制人荀建华转让股份、质押股份同时辞去董事长和总...

空空如也

空空如也

1 2 3 4 5 6
收藏数 107
精华内容 42
关键字:

年报问询函