抓取财报数据

抓取财报数据,主要关注每只股票的EPS(每股收益即每股盈利)、公告日期还有报告日期

确定数据源

从东方财富的数据中心抓取年报季报中的股票数据

右击、点击检查(或直接按F12)进入开发者模式,点击NetWork导航,重新点击下页面中的报告期,便可得到数据

上述便可得到所需财报的抓取地址并进行构造:

观察数据

既然要爬取人家的数据,就要知道它们数据的格式、命名等信息,对数据有个大概的掌握
注意:这里有个问题,现在(2020年)抓取19年年级报表(type=YJBB21_YJBB)发现抓取的其中eps数据是加密的,因此暂时还是用的是(type=YJBB20_YJBB)抓取的数据(解决方案:记录东方财富网的自定义字体反爬)

抓取程序及存储数据

import json
import urllib3
from  stock_util import get_all_codes
from pymongo import UpdateOne
from database import DB_CONN
"""
抓取财报数据:主要关注EPS(每股收益即每股盈利)、公告日期、报告期
"""

def crawl_finance_report():
    #获取股票列表
    codes = get_all_codes()
    #抓取的财务地址,scode为股票代码
    url = 'http://dcfm.eastmoney.com//em_mutisvcexpandinterface/api/js/get?' \
          'type=YJBB20_YJBB&token=70f12f2f4f091e459a279469fe49eca5&st=reportdate&sr=1' \
          '&filter=(scode={0})&p={page}&ps={pageSize}&js={"pages":(tp),"data":%20(x)}'
    #创建连接池
    conn_pool = urllib3.PoolManager()

    #循环抓取所有股票的财务信息
    for code in codes:
        #替换股票代码,抓取该只股票的财务数据
        response = conn_pool.request('GET',url.replace('{0}',code))
        print(url.replace('{0}',code))
        #解析抓取结果
        result = json.loads(response.data.decode('UTF-8'))
        #取出数据
        reports = result['data']
        #更新数据库的请求列表
        update_requests = []
        #循环处理所有报告数据
        for report in reports:
            doc = {
                #报告日期
                'report_date':report['reportdate'][:10],
                #公告日期
                'annouced_date':report['latestnoticedate'][:10],
                #每股收益
                'eps':report['basiceps'],
                'code':code
            }
            #将更新请求列表添加到列表中,更新时的查询条件为code、report_date,为快速保存数据,需增加索引
            #db.finance_report.createIndex({'code':1,'report_date':1})
            update_requests.append(
                UpdateOne( 
                    {'code':code,'report_date':doc['report_date']},
                    {'$set':doc},
                    upsert=True)
            )
        #如果更新数据的请求列表不为空,则写入数据库
        if len(update_requests):
            #采用批量写入的方式,加快保存速度
            update_result = DB_CONN['finance_report'].bulk_write(update_requests,ordered=False)
            print('股票%s ,财报,更新%d条,插入:%d条'%(code,update_result.modified_count,update_result.upserted_count))
if __name__ == "__main__":
    crawl_finance_report()

查看数据

posted @ 2020-04-29 19:34  牛犁heart  阅读(892)  评论(0编辑  收藏  举报