第2章 爬虫系列-爬取交易数据
系列文章目录
待补充
目录
系列文章目录
前言
一、基础类实现
二、实现日交易数据爬取
1.实现日交易数据爬取
2.东财日交易数据数据库脚本
3.调用
总结
前言
量化交易系统过程中,我们需要先获取交易数据,我们来实现一个日交易数据的爬取。首先实现一个交易说句获取的基础类;其次,基于基础类实现东财交易数据的获取
提示:以下是本篇文章正文内容,下面案例可供参考
一、基础类实现
TradeDaily的基础类
import jsonclass TradeDaily():def tradeDailyData(self, tradeDay, repoistory, repoistoryParam: dict, crawlerParam: dict):passdef get_data(self,response):content = response.textdata = json.loads(content)# data = json.dumps(data)return data
二、实现日交易数据爬取
1.实现日交易数据爬取
import requests
import jsonpath
import pandas as pd
import math
from crawler.base.tradeDaily import TradeDaily'''
https://data.eastmoney.com/bbsj/lrb.html #利润表
https://data.eastmoney.com/stockcomment/ #千股千评'''
class EmPcTradeDaily(TradeDaily):def __init__(self,repoistoryOb,reParam:dict,crParam:dict):self.repoistoryObject=repoistoryObself.repoistoryParam=reParamself.crawlerParam=crParam'''f2:最新价 f3:涨跌幅 f4:涨跌额 f5:成交量 f6:成交额 f7:振幅 f8:换手率 f9:市盈率(动态) f10:量比f12:股票账号 f13:市场(90、) f14:股票名称 f15:最高价 f16:最低价 f17:今天开盘价格 f18:昨日收盘价无f19 f20:总市值 f21:流通市指 f23:市净率 f62:主力净流出'''def get_detail_response(self, page_num):response = requests.get('http://29.push2.eastmoney.com/api/qt/clist/get?pn=' + str(page_num) + '&pz=200&po=0&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f12&fs=m%3A0+t%3A6%2Cm%3A0+t%3A80%2Cm%3A1+t%3A2%2Cm%3A1+t%3A23%2Cm%3A0+t%3A81+s%3A2048&stat=1%5E&fields=f1%2Cf2%2Cf3%2Cf4%2Cf5%2Cf6%2Cf7%2Cf8%2Cf9%2Cf10%2Cf12%2Cf13%2Cf14%2Cf15%2Cf16%2Cf17%2Cf18%2Cf20%2Cf21%2Cf23%2Cf24%2Cf25%2Cf22%2Cf11%2Cf62%2Cf128%2Cf136%2Cf115%2Cf152&_=1649293499568')return response'''"SECURITY_CODE":"600532","SECUCODE":"600532.SH","SECURITY_NAME_ABBR":"未来股份","ORG_CODE":"10002612","TRADE_MARKET":"069001001001","BOARD_CODE":"016011","BOARD_NAME":"煤炭行业","ORIG_BOARD_CODE":"437","TOTAL_MARKET_CAP":7586166084,"NOTLIMITED_MARKETCAP_A":7586166084,"CLOSE_PRICE":14.7,"CHANGE_RATE":0,"TOTAL_SHARES":516065720,"FREE_SHARES_A":516065720,"PE_TTM":-8374.35511122,"PE_LAR":346.36570245,"PB_MRQ":4.06484132,"PCF_OCF_LAR":11.16401607,"PCF_OCF_TTM":7.8371549,"PS_TTM":3.64534103,"PEG_CAR":1899.40065664655,"TRADE_DATE":"2022-05-27 00:00:00"'''def get_industry_response(self, date_str):response = requests.get('https://datacenter-web.eastmoney.com/api/data/v1/get?reportName=RPT_VALUEANALYSIS_DET&columns=ALL"eColumns=&source=WEB&client=WEB&sortColumns=PE_TTM&sortTypes=1&filter=(TRADE_DATE%3D%27'+date_str+'%27)&_=1653800608054')print('请求URL='+response.url)# print('返回结果='+response.text)return responsedef get_stock_info_detail(self) -> pd.DataFrame:page_num, page_size = 1, 1stock_detail_info = Nonerename_columns={'f12':'stock_code','f14':'stock_name','f2':'close','f3':'pct_chg','f4':'change','f5':'volume','f6':'amount','f15':'high','f16':'low','f17':'open','f18':'pre_close','f8':'turnover_rate','f9':'stock_pe_ttm','f23':'stock_pb_mrq','f10':'quantity_ratio'}filter_columns=['stock_code', 'stock_name', 'close','pct_chg','change','volume','amount','high','low','open','pre_close','turnover_rate','quantity_ratio']while page_num <= page_size:response= self.get_detail_response(page_num)data = self.get_data(response)page_size = math.ceil(data['data']['total'] / 200)data_list = data['data']['diff']df = pd.DataFrame(data_list)df.rename(columns=rename_columns,inplace=True)df = df.loc[:, filter_columns]if stock_detail_info is None:stock_detail_info = dfelse:stock_detail_info = pd.concat([stock_detail_info,df])page_num = page_num + 1# 过滤停牌和下市的数据stock_detail_info = stock_detail_info.replace('-', 0)print('股票明细数量:', len(stock_detail_info))# stock_detail_info.to_csv("D:\sstock_detail_info.csv")stock_detail_info.drop_duplicates(inplace=True)print('股票明细数量:', len(stock_detail_info))return stock_detail_info'''"SECURITY_CODE":"600532","SECUCODE":"600532.SH","SECURITY_NAME_ABBR":"未来股份","ORG_CODE":"10002612","TRADE_MARKET":"069001001001","BOARD_CODE":"016011","BOARD_NAME":"煤炭行业","ORIG_BOARD_CODE":"437","TOTAL_MARKET_CAP":7586166084,"NOTLIMITED_MARKETCAP_A":7586166084,"CLOSE_PRICE":14.7,"CHANGE_RATE":0,"TOTAL_SHARES":516065720,"FREE_SHARES_A":516065720,"PE_TTM":-8374.35511122,"PE_LAR":346.36570245,"PB_MRQ":4.06484132,"PCF_OCF_LAR":11.16401607,"PCF_OCF_TTM":7.8371549,"PS_TTM":3.64534103,"PEG_CAR":1899.40065664655,"TRADE_DATE":"2022-05-27 00:00:00"'''def save_industry_Info(self,tradeDay) -> pd.DataFrame:page_num, page_size = 1, 1rename_cols={'SECURITY_CODE':'stock_code','BOARD_CODE':'board_code','PE_TTM':'stock_pe_ttm'}print('查询行业开始处理{0}日,第{1}页处理数据'.format(tradeDay,page_num))response = self.get_industry_response(tradeDay)data = self.get_data(response)data_list = data['result']['data']industry_info = pd.DataFrame(data_list)industry_info.rename(columns=rename_cols,inplace=True)industry_info['market_code'] = industry_info['SECUCODE'].str[7:9]industry_info = industry_info.loc[:, [ 'board_code','stock_code','market_code','stock_pe_ttm']]industry_info.drop_duplicates(inplace=True)print('行业数量:', len(industry_info))return industry_infodef get_stock_median(self,stock_info:pd.DataFrame) -> pd.DataFrame:stock_info=stock_info[stock_info['stock_pe_ttm']>0]board_code_info = stock_info.groupby(['board_code'])new_rows = []for name, itemgroup in board_code_info:new_row = list()new_row.extend([name,round(itemgroup['stock_pe_ttm'].median(), 2),round(itemgroup['stock_pe_ttm'].mean(),2)])new_rows.append(new_row)median_info = pd.DataFrame(data=new_rows,columns=['board_code', 'median_pe','average_pe'])print('行业中位市盈率数量:', len(median_info))median_info.drop_duplicates(inplace=True)print('行业中位市盈率数量:', len(median_info))return median_infodef tradeDailyData(self, tradeDay):stock_detail_info=self.get_stock_info_detail()stock_detail_info = stock_detail_info.assign(trade_date=tradeDay)industry_info = self.save_industry_Info(tradeDay)median_info = self.get_stock_median(industry_info)industry_median_info = pd.merge(industry_info, median_info, how='left', left_on='board_code', right_on='board_code')info = pd.merge(stock_detail_info, industry_median_info, how='left', left_on='stock_code', right_on='stock_code')# info.to_csv("E:\quant_data\\em_trade_daily_industry" + tradeDay + ".csv")print('开始插入数据库')self.repoistoryObject.saveData(info, repoistoryParam=self.repoistoryParam)
2.东财日交易数据数据库脚本
-- quantdata.trade_daily_empc definitionCREATE TABLE `trade_daily_empc` (`stock_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '股票名称',`stock_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '股票指数代码',`trade_date` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '交易日',`open` float(10,2) DEFAULT NULL COMMENT '开盘点位',`high` float(10,2) DEFAULT NULL COMMENT '最高点位',`low` float(10,2) DEFAULT NULL COMMENT '最低点位',`close` float(10,2) DEFAULT NULL COMMENT '收盘点位',`pre_close` float(10,2) DEFAULT NULL COMMENT '昨日收盘点',`change` float(10,2) DEFAULT NULL COMMENT '涨跌点',`pct_chg` float(10,2) DEFAULT NULL COMMENT '涨跌幅(%)',`volume` float(20,2) DEFAULT NULL COMMENT '成交量(手)',`amount` float(20,2) DEFAULT NULL COMMENT '成交额(千)',`quantity_ratio` float(50,2) DEFAULT NULL COMMENT '量比',`turnover_rate` float(10,2) DEFAULT NULL COMMENT '换手率',`industry_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '行业名称',`stock_pe_ttm` float(20,2) DEFAULT NULL COMMENT '市盈率TTM',`stock_pb_mrq` float(20,2) DEFAULT NULL COMMENT '市净率',`stock_pe_percentile` float(10,4) DEFAULT NULL COMMENT '市盈率百分位',`stock_pb_percentile` float(10,4) DEFAULT NULL COMMENT '市净率百分位',`board_code` varchar(20) DEFAULT NULL COMMENT '行业编号',`market_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '市场',`average_pe` float(10,4) DEFAULT NULL COMMENT '行业平均市盈率',`average_pb` float(10,4) DEFAULT NULL COMMENT '平均市净率',`pe_percentile` float(10,4) DEFAULT NULL COMMENT '行业市盈率百分比',`pb_percentile` float(10,4) DEFAULT NULL COMMENT '行业平均市净率',`current_year_percent` float(10,4) DEFAULT NULL COMMENT '年初至今涨幅',`market_capital` float(20,4) DEFAULT NULL COMMENT '市值',`dividend_yield` float(10,4) DEFAULT NULL COMMENT '股息率',`stock_ps_percentile` float(10,4) DEFAULT NULL COMMENT '市销率',`median_pe` float(10,4) DEFAULT NULL COMMENT '市盈率中位数',PRIMARY KEY (`stock_code`,`trade_date`),KEY `inx_tdn_trade_date` (`trade_date`) USING BTREE COMMENT '按日期查询'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='股票日交易PC';
3.调用
代码如下,调用时传入日期可实现获取交易数据,并落入mysql库中
def empctradeDaily(self,tradeDay):reParam = {'table_name': 'trade_daily_empc'}#网络爬虫处理,mysql存储tradedaily = EmPcTradeDaily(MysqlRepoistory(),reParam,None)tradedaily.tradeDailyData(tradeDay=tradeDay)
总结
以上就是今天要讲的内容,本文主要介绍了爬取交易数据,下章介绍获取其他交易数据
第2章 爬虫系列-爬取交易数据相关推荐
- 初识Python爬虫----如何爬取网络数据
一.什么是网络爬虫 即爬取网络数据的虫子,也就是Python程序. 二.爬虫的实质是什么? 模拟浏览器的工作原理,向服务器发送请求数据. 三.浏览器的工作原理是什么? 浏览器还可以起到翻译数据的作用. ...
- boss直聘账号异常登不上_python爬虫Scrapy:爬取boss数据
一.概述 学习python有一段时间了,最近了解了下Python的入门爬虫框架Scrapy,参考了文章Python爬虫框架Scrapy入门.本篇文章属于初学经验记录,比较简单,适合刚学习爬虫的小伙伴. ...
- 爬虫 spider09——爬取指定数据,去重复,并存储到mysql
爬取指定数据,去重复,并存储到mysql. 技术栈:Springboot+ssm+定时(定时器)爬取+redis去重+mybatis保存 一.创建父项目Spider pom.xml <?xml ...
- 爬虫练习--爬取股票数据
爬取股票数据 步骤 从东方财富网找到上市公司的股票代码并保存 根据股票代码去百度股市通去查找相关股票的具体信息并保存 代码 #-*- coding:utf-8 -*- import requests ...
- 【Python爬虫】爬取大量数据网络超时的解决思路
问题 在爬取大量数据的过程中,有时没有注意,会出现网络超时,结果也不知道爬到了哪里,重新爬一遍代价太大. 解决思路 目前提供解决思路,实践之后补充示例代码. 思路一 1.设置超时处理,超过时间返回异常 ...
- Pycharm + python 爬虫简单爬取网站数据
本文主要介绍简单的写一个爬取网站图片并将图片下载的python爬虫示例. 首先,python爬虫爬取数据,需要先了解工具包requests以及BeautifulSoup requests中文文档:ht ...
- 如何使用爬虫语言爬取网页数据?
爬虫开发 基础概念我们已经讲完,怎么来开发个爬虫呢?举个栗子: 如图,是星斗苍凉.月色照亮的动漫斗罗大陆的播放页面.我们以此为例,开发爬虫来获取页面数据. Java爬虫 Java爬虫的开发主要使用Js ...
- 【python爬虫】爬取网站数据,整理三句半语料数据集
因为目前没有公开的三句半语料库,所以在网络上爬取一些网站上公开的三句半数据. 主要分为两部分: 目录 爬取数据 清洗数据 爬取数据 以爬取 http://p.onegreen.net/JuBen 上的 ...
- python爬取网页内容_你以为Python爬虫只能爬取网页数据吗?APP也是可以的呢!
摘要 大多数APP里面返回的是json格式数据,或者一堆加密过的数据 .这里以超级课程表APP为例,抓取超级课程表里用户发的话题. 1 抓取APP数据包 方法详细可以参考这篇博文:http://my. ...
最新文章
- 命名实体识别入门教程(必看)
- DPI — nDPI — 安装部署与应用示例
- 一次使用Eclipse Memory Analyzer分析weblogic内存溢出
- 10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据
- 前端学习(1319):node.js异步编程
- php新特性:trait 关键字使用
- Mindis(HDU-6670)
- 【STM32】【STM32CubeMX】STM32CubeMX的使用之二:外部中断
- Android 系统(40)--Android7.0 PowerManagerService亮灭屏分析(一)
- 消息称苹果、Epic开庭时间从2021年7月提前至5月份
- (六)多语言人工智能语言翻译
- 9.27 csp-s模拟测试53 u+v+w
- Window10上使用Git与Github远程仓库互连
- 界面开发的推荐色值, dip,px,pt,sp 的区别
- vray5.1 for sketchup 安装教程
- 计算T临界值分布的表
- 【Atomikos】分布式事务简单示例
- 你真的理解什么是“财富自由”吗?
- OpenCV调用摄像头录像并保存下来
- Linux系统启动流程及服务管理控制
热门文章
- 计算机联锁的结构和工作原理,计算机联锁系统冗余结构的设计
- Java的Swing在界面的JPanel面板中中添加图片
- vue element ui里的日期时间选择器 中国标准时间转化为年月日时分秒
- 复旦非全日制研究生计算机,2018年复旦大学信息科学与工程学院非全日制招生计划...
- java语句的用途是什么_continue语句的作用是什么
- Run、RunOnce 键值解析
- VUE+ElementUI+PHP+MySQL实现仿照印记中文网站(1)----概述
- Adobe Acrobat DC详细安装
- 华为无线AC双机热备三层组网配置案例
- audio插入背景音乐_在HTML中添加背景音乐