今日指数项目A股大盘数据采集

news2024/9/30 22:32:30

1、A股大盘数据采集

1.1 A股大盘数据采集准备

1.1.1 配置ID生成器bean

A股大盘数据采集入库时,主键ID保证唯一,所以在stock_job工程配置ID生成器:

@Configuration
public class CommonConfig {
    /**
     * 配置基于雪花算法生成全局唯一id
     *   参与元算的参数: 时间戳 + 机房id + 机器id + 序列号
     *   保证id唯一
     * @return
     */
    @Bean
    public IdWorker idWorker(){
        //指定当前为1号机房的2号机器生成
        return new IdWorker(2L,1L);
    }
}  
1.1.2 股票常量数据配置

1) 配置股票地址参数

在stock_job工程下,定义股票相关配置文件application-stock.yml,该文件与stock_backend下的配置一致,然后我们把大盘、板块、股票相关的通用参数配置进来:

# 配置股票相关的参数
stock:
  inner: # 国内大盘ID
    - sh000001 # 上证ID
    - sz399001 #  深证ID
  outer: # 外盘ID
    - int_dji # 道琼斯
    - int_nasdaq # 纳斯达克
    - int_hangseng # 恒生
    - int_nikkei # 日经指数
    - b_TWSE # 台湾加权
    - b_FSSTI # 新加坡
  marketUrl: http://hq.sinajs.cn/list=
  blockUrl: http://vip.stock.finance.sina.com.cn/q/view/newSinaHy.php    

2)股票常量数据封装

在stock_common工程继续完善StockInfoConfig类:

package com.itheima.stock.pojo.domain;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
/**
 * @author by itheima
 * @Date 2021/12/30
 * @Description
 */
@ConfigurationProperties(prefix = "stock")
@Data
public class StockInfoConfig {
    //a股大盘ID集合
    private List<String> inner;
    //外盘ID集合
    private List<String> outer;
    //大盘参数获取url
    private String marketUrl;
    //板块参数获取url
    private String blockUrl;
}

2) 在公共配置类上开启配置

@EnableConfigurationProperties(StockInfoConfig.class)//开启常用参数配置bean
@Configuration
public class CommonConfig {
	//......
} 
1.1.3 A股大盘响应数据说明

在这里插入图片描述

var hq_str_sh000001="上证指数,3358.9338,3361.5177,3398.6161,3417.0085,3358.9338,0,0,381243178,510307202948,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-06-30,15:30:39,00,";
参数说明:
0:指数名称
1:开盘点
2:前收盘点
3:当前点
4:最高点
5:最低点
8:成交量
9:成交金额
30:当前日期
31:当前时间

1.2 java正则回顾

​ 上一小结我们发现,采集的大盘数据是标准的Js格式数据(非json),需要我们自行解析处理,显然在批量解析数据时,我们可借助java的正则实现,所以接下来我们回顾下前面讲的关于正则的一些知识点。

重点应用:

  • 正则表达式理解;
  • 捕获组理解;
  • 核心类:Pattern、Matcher;

参考:day05\资料\基础知识点预习\Java正则表达式.mhtml

    @Test
    public void testRep2(){
        // 按指定模式在字符串查找
        String line = "This order was placed for QT3000! OK?";
        String pattern = "(\\D*)(\\d+)(.*)";
        // 创建 Pattern 对象
        Pattern r = Pattern.compile(pattern);
        // 现在创建 matcher 对象
        Matcher m = r.matcher(line);
        if (m.find( )) {
            System.out.println("Found value: " + m.group(0) );
            System.out.println("Found value: " + m.group(1) );
            System.out.println("Found value: " + m.group(2) );
            System.out.println("Found value: " + m.group(3) );
        } else {
            System.out.println("NO MATCH");
        }
    }

1.3 A股大盘数据采集实现

在这里插入图片描述

1.3.1 定义A股大盘数据采集服务

在stock_job工程下定义服务接口:

/**
 * @author by itheima
 * @Description 定义采集股票数据的定时任务的服务接口
 */
public interface StockTimerTaskService {
    /**
     * 获取国内大盘的实时数据信息
     */
    void getInnerMarketInfo();
} 

定义服务接口实现:

@Service("stockTimerTaskService")
@Slf4j
public class StockTimerTaskServiceImpl implements StockTimerTaskService {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private StockInfoConfig stockInfoConfig;

    @Autowired
    private IdWorker idWorker;

    @Override
    public void getInnerMarketInfo() {
        //1.定义采集的url接口
        String url=stockInfoConfig.getMarketUrl() + String.join(",",stockInfoConfig.getInner());
        //2.调用restTemplate采集数据
        //2.1 组装请求头
        HttpHeaders headers = new HttpHeaders();
        //必须填写,否则数据采集不到
        headers.add("Referer","https://finance.sina.com.cn/stock/");
        headers.add("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36");
        //2.2 组装请求对象
        HttpEntity<Object> entity = new HttpEntity<>(headers);
        //2.3 resetTemplate发起请求
        String resString = restTemplate.postForObject(url, entity, String.class);
        //log.info("当前采集的数据:{}",resString);
        //3.数据解析(重要)
//        var hq_str_sh000001="上证指数,3267.8103,3283.4261,3236.6951,3290.2561,3236.4791,0,0,402626660,398081845473,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-04-07,15:01:09,00,";
//        var hq_str_sz399001="深证成指,12101.371,12172.911,11972.023,12205.097,11971.334,0.000,0.000,47857870369,524892592190.995,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,2022-04-07,15:00:03,00";
        String reg="var hq_str_(.+)=\"(.+)\";";
        //编译表达式,获取编译对象
        Pattern pattern = Pattern.compile(reg);
        //匹配字符串
        Matcher matcher = pattern.matcher(resString);
        ArrayList<StockMarketIndexInfo> list = new ArrayList<>();
        //判断是否有匹配的数值
        while (matcher.find()){
            //获取大盘的code
            String marketCode = matcher.group(1);
            //获取其它信息,字符串以逗号间隔
            String otherInfo=matcher.group(2);
            //以逗号切割字符串,形成数组
            String[] splitArr = otherInfo.split(",");
            //大盘名称
            String marketName=splitArr[0];
            //获取当前大盘的开盘点数
            BigDecimal openPoint=new BigDecimal(splitArr[1]);
            //前收盘点
            BigDecimal preClosePoint=new BigDecimal(splitArr[2]);
            //获取大盘的当前点数
            BigDecimal curPoint=new BigDecimal(splitArr[3]);
            //获取大盘最高点
            BigDecimal maxPoint=new BigDecimal(splitArr[4]);
            //获取大盘的最低点
            BigDecimal minPoint=new BigDecimal(splitArr[5]);
            //获取成交量
            Long tradeAmt=Long.valueOf(splitArr[8]);
            //获取成交金额
            BigDecimal tradeVol=new BigDecimal(splitArr[9]);
            //时间
            Date curTime = DateTimeUtil.getDateTimeWithoutSecond(splitArr[30] + " " + splitArr[31]).toDate();
            //组装entity对象
            StockMarketIndexInfo info = StockMarketIndexInfo.builder()
                    .id(idWorker.nextId())
                    .marketCode(marketCode)
                    .marketName(marketName)
                    .curPoint(curPoint)
                    .openPoint(openPoint)
                    .preClosePoint(preClosePoint)
                    .maxPoint(maxPoint)
                    .minPoint(minPoint)
                    .tradeVolume(tradeVol)
                    .tradeAmount(tradeAmt)
                    .curTime(curTime)
                    .build();
            //收集封装的对象,方便批量插入
            list.add(info);
        }
       log.info("采集的当前大盘数据:{}",list);
        //批量插入
        if (CollectionUtils.isEmpty(list)) {
            return;
        }
        //TODO 后续完成批量插入功能
    }
} 
1.3.2 A股大盘数据采集测试
package com.itheima.stock;

import com.itheima.stock.job.service.StockTimerService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @author by itheima
 * @Date 2022/1/1
 * @Description
 */
@SpringBootTest
public class TestStockTimerService {
    @Autowired
    private StockTimerTaskService stockTimerService;

    /**
     * 获取大盘数据
     */
    @Test
    public void test01(){
        stockTimerService.getInnerMarketInfo();
    }
}    

效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.4 A股大盘批量保存

1.4.1 定义mapper接口方法

在StockMarketIndexInfoMapper接口添加方法:

    /**
     * 批量插入股票大盘数据
     * @param infos
     */
    int insertBatch(List<StockMarketIndexInfo> infos);
1.4.2 绑定xml

在StockMarketIndexInfoMapper.xml添加SQL:

    <insert id="insertBatch">
        insert into stock_market_index_info
        ( id,mark_Id,cur_time
        ,mark_name,cur_point,current_price
        ,updown_rate,trade_account,trade_volume
        )
        values
        <foreach collection="list" item="smi" separator=",">
            (#{smi.id,jdbcType=BIGINT},#{smi.markId,jdbcType=CHAR},#{smi.curTime,jdbcType=TIMESTAMP}
            ,#{smi.markName,jdbcType=VARCHAR},#{smi.curPoint,jdbcType=DECIMAL},#{smi.currentPrice,jdbcType=DECIMAL}
            ,#{smi.updownRate,jdbcType=DECIMAL},#{smi.tradeAccount,jdbcType=BIGINT},#{smi.tradeVolume,jdbcType=BIGINT}
            )
        </foreach>
    </insert>
1.4.3 国内大盘数据批量插入实现

注入mapper,然后批量插入:

    @Autowired
    private StockMarketIndexInfoMapper stockMarketIndexInfoMapper;  

	/**
     * 获取国内大盘数据
     */
    @Override
    public void getInnerMarketInfo() {
		//....省略N行....
        //批量插入
        int count = this.stockMarketIndexInfoMapper.insertBatch(infos);
        log.info("批量插入了:{}条数据",count);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2180890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打点 - 泛微 E-Cology WorkflowServiceXml

请求路径 /services%20/WorkflowServiceXml显示如下&#xff0c;漏洞可能存在 利用&#xff1a; 根据提示在 CMD 处输入 Memshell 注入内存马&#xff0c;并点击执行&#xff0c;成功注入 冰蝎配置&#xff0c;输入内存马地址 成功连接 命令执行

2024/9/30 英语每日一段

The British Academy has created three high-profile awards to sit alongside the trophies it hands out to adult television shows--going some way, it is hoped, to replace Bafta’s abandoned children’s TV awards event. “Children’s programme-making has been …

【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)

总览 1.下载和解决依赖问题 2.修改相关参数 3.安装过程 一、下载和解决依赖问题 1.下载 去这里看看&#xff0c;填写相关的显卡参数&#xff0c;选择 linux 版本&#xff0c;然后开始下载。 https://www.nvidia.cn/drivers/lookup/ 进入这个选择界面&#xff1a; 开始下载&…

04-指向指针的指针

int main(int argc, const char* argv[]) {int x 5;int* p &x;*p 6;int** q &p;int*** r &q;printf("%d\n", *p);//指向p中的值 6printf("%d\n", *q);// 指向指针p的地址 printf("%d\n", *(*q));//指向p中地址中的值 6print…

3.1K Star,这款开源在线视频下载神器绝了,速度达 30M/S

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 在如今的数字时代&#xff0c;无论是个人用户还是企业&#xff0c;都…

学科竞赛管理平台:SpringBoot框架深度开发

摘 要 随着国家教育体制的改革&#xff0c;全国各地举办的竞赛活动数目也是逐年增加&#xff0c;面对如此大的数目的竞赛信息&#xff0c;传统竞赛管理方式已经无法满足需求&#xff0c;为了提高效率&#xff0c;竞赛管理系统应运而生。 本学科竞赛管理系统以实际运用为开发背景…

odoo中查找模型以及继承模型的全部字段

快捷键alt k呼出命令菜单&#xff0c;或者直接按alt h呼出界面如下&#xff1a; 输入模型 按模型的名称搜索 视图、字段在里面都能找到了 或者点击这里

TongESB7, TongGW, admin账号密码重置方式

停止控制台 修改系统库 identities 表 configuration字段中的password 重启manage

常用的英文文献数据库和资源平台

在学术研究中&#xff0c;获取和引用权威的英文文献资源是非常重要的。以下列举了几大最常用的英文文献数据库和资源平台&#xff0c;这些平台广泛收录了各类学术论文、期刊、会议论文、书籍等文献资料&#xff0c;是研究人员和学生常用的工具&#xff1a; 1. Google Scholar …

C嘎嘎入门篇:类和对象(2)

前言&#xff1a; 上一篇小编讲了类和对象&#xff08;1&#xff09;&#xff0c;当然&#xff0c;在看这篇文章之前&#xff0c;读者朋友们一定要掌握好前面的基础内容&#xff0c;因为这篇和前面息息相关&#xff0c;废话不多说&#xff0c;下面小编就加快步伐&#xff0c;开…

004集—— txt格式坐标写入cad(CAD—C#二次开发入门)

如图所示原始坐标格式&#xff0c;xy按空格分开&#xff0c;将坐标按顺序在cad中画成多段线&#xff1a; 坐标xy分开并按行重新输入txt&#xff0c;效果如下&#xff1a; 代码如下 &#xff1a; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; us…

新手必知的录屏工具及其使用方法详解

你平常会录屏吗&#xff1f;录屏已经成为了一项非常实用的技能。无论是制作教学视频还是记录游戏精彩瞬间&#xff0c;录屏都可以帮我们记录我们在电脑上看到的精彩瞬间。今天我们就一同来探索在电脑上如何录屏吧。 1.福昕录屏工具 链接&#xff1a;www.foxitsoftware.cn/REC…

N诺计算机考研-错题(DS)

具有线性结构的数据结构是&#xff08; &#xff09;。&#xff08;线性结构就是&#xff1a;在非空有限集合中&#xff0c;存在为一个被称为第一个的数据元素和最后一个元素&#xff0c;有除了第一个元素&#xff0c;集合中每一个元素均只有一个前驱&#xff0c;除了最后一个元…

通过台达ASDA-Soft伺服调试软件导入和导出伺服参数的具体方法示例

通过台达ASDA-Soft伺服调试软件导入和导出伺服参数的具体方法示例 首先,找一根通讯线,如下图所示,打印机通讯线就可以, 通信线连接台达伺服驱动器和电脑后,打开ASDA-Soft软件,如下图所示,勾选On-Line,然后点击开始自动侦测, 如下图所示,正常情况下,软件可以自动侦测…

Oracle 相关的工具使用 SQL Developer , sqlplus

Oracle 相关的工具使用 SQL Developer &#xff0c; sqlplus 一&#xff0c;Oracle SQL Developer 连接数据库 今天在连接sqldeveloper服务器时遇到了很多问题&#xff0c;但最终还是通过网上的博客解决了问题&#xff0c;我就在总结一下我的解决过程。 一.界面 首先&#…

通过 OpenAI API 实测 o1 模型(附源码)

9.11 与 9.9 哪个大? 还记得之前给大家演示的幻觉问题么&#xff1f; 用 gpt4 系列模型提问“9.11 与 9.9 哪个大?” 大家可以回顾一下&#xff0c;即使引导了 COT 的思路&#xff0c;但是 gpt4 还是一本正经的胡说八道。 如今&#xff0c;o1 已经完美解决数学、逻辑推理方…

LampSecurityCTF7 靶机渗透 (sql 注入, 文件上传, 密码喷射)

靶机介绍 LampSecurityCTF7&#xff0c;vulnhub 靶机 主机发现 由于靶机配置问题&#xff0c;扫不到 ip 这里需要特别注意一下&#xff0c;在第一次启动打开靶机的时候&#xff0c;vmware会跳出一个提示框&#xff0c;让你选择我已复制该虚拟机/我已移动该虚拟机&#xff0c…

业绩由盈转亏,全面冲刺大模型的360值得期待吗?

在中国互联网市场上&#xff0c;360无疑是一家大家家喻户晓的公司&#xff0c;从安全软件起家&#xff0c;360的服务已经延展到了市场的方方面面&#xff0c;就在最近360的财报正式公布&#xff0c;很多人都在问360的财报该怎么看&#xff1f;全面冲刺大模型的360值得我们期待吗…

.net Framework 4.6 WebAPI 使用Hangfire

C# 使用 Hangfire 第一章 .net Framework 4.6 WebAPI 使用Hangfire 文章目录 C# 使用 Hangfire前言一、hangfire是什么?二、hangfire的特点三、.net Framework 中hangfire的使用方法第一步:创建WebAPI控制器第二步:添加nuget包第三步 创建startup类新建项目startup类Startu…

企业数据安全从0到1建设方法

随着中国数字经济的不断发展&#xff0c;各行各业都在积极推进数字化转型&#xff0c;数据安全逐渐受到国家和企业的重视。 近年来&#xff0c;国家持续颁布多种行业数据安全管理办法&#xff0c;明确各行业数据安全的建设标准&#xff0c;督促企业进行数据安全建设。 企业应该…