当前位置: 首页 > news >正文

【java爬虫】基于springboot+jdbcTemplate+sqlite+OkHttp获取个股的详细数据

注:本文所用技术栈为:springboot+jdbcTemplate+sqlite+OkHttp

前面的文章我们获取过沪深300指数的成分股所属行业以及权重数据,本文我们来获取个股的详细数据。

我们的数据源是某狐财经,接口的详细信息在下面的文章中,本文就不再赘述了

用爬虫分析沪深300指数超长走势-CSDN博客

下面是一组url和返回值的示例

https://q.stock.sohu.com/hisHq?code=cn_000001&start=20190101&end=20190102&stat=1&order=D&period=d&callback=historySearchHandler&rt=jsonp
historySearchHandler([{"status":0,"hq":[["2019-01-02","9.39","9.19","-0.19","-2.03%","9.16","9.42","539386","49869.51","0.31%"]],"code":"cn_000001","stat":["累计:","2019-01-02至2019-01-02","-0.19","-2.03%",9.16,9.42,539386,49869.51,"0.31%"]}])

我们需要关心的是"hq"中的值,"hq"中的值是一个列表,列表中还有很多列表,每个列表代码一组数据,至于数据的具体含义,可以登陆搜狐财经网站上去看看。

宁德时代(300750) - 历史行情 - 股票行情中心 - 搜狐证券 (sohu.com)

这边我就随便截取一端数据

数据的从左到右分别代表日期,开盘价,收盘价,涨跌额,涨跌幅,最低,最高,成交量,成交金额和换手率,最后的盘后量是没有的。

那么我们就可以根据上述信息建立数据表和实体类

    @Overridepublic void createTbaleIfNotExist() {Integer count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name = ?", Integer.class, TABLE_NAME);if (count == 0) {String sql = "CREATE TABLE " + TABLE_NAME + "(" +"id VARCHAR(50) PRIMARY KEY," +"code VARCHAR(20)," +           // 股票代码"record_date VARCHAR(20)," +    // 记录的时间"open_price float," +           // 开盘价"close_price float," +           // 收盘价"change_ament float," +          // 涨跌额"change_range float," +          // 涨跌幅"max_price float," +             // 最高价格"min_price float," +             // 最低价格"volume float," +                // 成交量(手)"turnover float," +              // 成交额(万)"turnover_rate float)";               // 换手率jdbcTemplate.execute(sql);log.info(TABLE_NAME + "建表成功");} else {log.info("建表失败,表格已存在");}}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class StockEntity {private String id;private String code;private String record_date;private Double open_price;private Double close_price;private Double change_amend;private Double change_range;private Double max_price;private Double min_price;private Double volume;private Double turnover;private Double turnover_rate;// 将数据转换为Object数组public Object[] changeToArray() {Object[] arr = new Object[]{id,code,record_date,open_price.toString(),close_price.toString(),change_amend.toString(),change_range.toString(),max_price.toString(),min_price.toString(),volume.toString(),turnover.toString(),turnover_rate.toString()};return arr;}}

其中id字段是用来放置重复插入的,他的值是code+日期,这样就能保证某一只股票当日的数据是唯一的。

下面是最重要的获取数据和插入数据的方法。

我们采用批量插入的方法,传入一个列表,一次性将列表中所有的值都插入数据库

    @Overridepublic void insertItems(List<StockEntity> entityList) {String sql = "INSERT OR IGNORE INTO " + TABLE_NAME + " (id, code, record_date," +"open_price, close_price, change_ament," +"change_range, max_price, min_price," +"volume, turnover, turnover_rate) values (?,?,?,?,?,?,?,?,?,?,?,?)";// 将列表转为Object数组List<Object[]> arr = new ArrayList<>();for(int i=0; i<entityList.size(); i++) {arr.add(entityList.get(i).changeToArray());}jdbcTemplate.batchUpdate(sql, arr);}

下面就是获取数据的代码

    // 获取数据并且存入数据库// 三个参数分别是:股票代码,开始时间和结束时间// 开始时间和结束时间都填年份,代码中会自动补全具体时间public int getDataByYear(String code, String start, String end) {String url = "https://q.stock.sohu.com/hisHq?";Request request = null;Response response = null;int num = 0;try {for (int i = Integer.parseInt(start); i <= Integer.parseInt(end); i++) {for (int j = 1; j <= 12; j++) {HttpUrl.Builder httpBuiler = HttpUrl.parse(url).newBuilder();String starttime = null;String endtime = null;if (j != 12) {StringBuilder sb = new StringBuilder();sb.append(i);if (j < 10) {sb.append("0");}sb.append(j);sb.append("01");starttime = sb.toString();sb = new StringBuilder();sb.append(i);if (j + 1 < 10) {sb.append("0");}int tmp = j + 1;sb.append(tmp);sb.append("01");endtime = sb.toString();} else {starttime = i + "1201";endtime = i + "1231";}log.info("开始计算时间段[" + starttime + "," + endtime + "]内数据");httpBuiler.addQueryParameter("code", "cn_" + code);httpBuiler.addQueryParameter("start", starttime);httpBuiler.addQueryParameter("end", endtime);httpBuiler.addQueryParameter("stat", "1");httpBuiler.addQueryParameter("order", "D");httpBuiler.addQueryParameter("period", "d");httpBuiler.addQueryParameter("callback", "history");httpBuiler.addQueryParameter("rt", "jsonp");request = new Request.Builder().url(httpBuiler.build()).get()   //默认就是GET请求,可以不写.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36").build();response = client.newCall(request).execute();String res = response.body().string();log.info("请求得到的数据:" + res);// 将数据解析成List列表if (!res.equals(NO_DATA_RESPONSE1) && !res.equals(NO_DATA_RESPONSE2)) {List<StockEntity> entities = parseStrToArr(res, code);sqLiteStockDao.insertItems(entities);log.info("时间段[" + starttime + "," + endtime + "]内有" + entities.size() + "条数据");num += entities.size();} else {log.info("时间段[" + starttime + "," + endtime + "]没有数据");}}}} catch (IOException e) {e.printStackTrace();}return num;}// 将string数据解析成List列表private List<StockEntity> parseStrToArr(String res, String code) {List<StockEntity> entities = new ArrayList<>();res = res.split("\\(\\[")[1].split("]\\)")[0];JSONObject jsonObject = JSON.parseObject(res);// 获取 hq 字段的值Object hq = jsonObject.get("hq");// 判断 hq 的值是否为数组if (hq instanceof JSONArray) {// 遍历数组for (Object arr : (JSONArray) hq) {JSONArray jsonArray = (JSONArray) arr;StockEntity entity = new StockEntity();entity.setRecord_date((String) jsonArray.get(0));Double open_price = Double.parseDouble((String) jsonArray.get(1));Double close_price = Double.parseDouble((String) jsonArray.get(2));Double change_amend = Double.parseDouble((String) jsonArray.get(3));Double change_range = Double.parseDouble(((String) jsonArray.get(4)).split("%")[0]);Double max_price = Double.parseDouble((String) jsonArray.get(5));Double min_price = Double.parseDouble((String) jsonArray.get(6));Double volume = Double.parseDouble((String) jsonArray.get(7));Double turnover = Double.parseDouble((String) jsonArray.get(8));Double turnover_rate = Double.parseDouble(((String) jsonArray.get(9)).split("%")[0]);entity.setOpen_price(open_price);entity.setClose_price(close_price);entity.setChange_amend(change_amend);entity.setChange_range(change_range);entity.setMax_price(max_price);entity.setMin_price(min_price);entity.setVolume(volume);entity.setTurnover(turnover);entity.setTurnover_rate(turnover_rate);entity.setCode(code);entity.setId(entity.getCode() + "_" + (String) jsonArray.get(0));entities.add(entity);}}return entities;}

主要就是获取了数据然后进行解析,每一次解析都是从当前月份的1日到第二个月的1日,如果是12月的话是从12月1日到12月31日。

最后提供一个get接口进行方法的调用

    @RequestMapping("/getDataByYear/{code}/{start}/{end}")@ResponseBodypublic String getDataByYear(@PathVariable("code") String code,@PathVariable("start") String start,@PathVariable("end") String end) {Integer num = stockService.getDataByYear(code, start, end);return num.toString();}

最后获取到的数据是这样的

相关文章:

【java爬虫】基于springboot+jdbcTemplate+sqlite+OkHttp获取个股的详细数据

注&#xff1a;本文所用技术栈为&#xff1a;springbootjdbcTemplatesqliteOkHttp 前面的文章我们获取过沪深300指数的成分股所属行业以及权重数据&#xff0c;本文我们来获取个股的详细数据。 我们的数据源是某狐财经&#xff0c;接口的详细信息在下面的文章中&#xff0c;本…...

智能优化算法应用:基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工兔算法4.实验参数设定5.算法结果6.参考文…...

【ubuntu 22.04】安装vscode并配置正常访问应用商店

注意&#xff1a;要去vscode官网下载deb安装包&#xff0c;在软件商店下载的版本不支持输入中文 在ubuntu下用火狐浏览器无法访问vscode官网&#xff0c;此时可以手动进行DNS解析&#xff0c;打开DNS在线查询工具&#xff0c;解析以下主机地址&#xff08;复制最后一个IP地址&a…...

K8s出现问题时,如何排查解决!

K8s问题的排查 1. POD启动异常、部分节点无法启动pod2. 审视集群状态3. 追踪事件日志4. 聚焦Pod状态5. 检查网络连通性6. 审视存储配置7. 研究容器日志8. K8S集群网络通信9. 问题&#xff1a;Service 是否通过 DNS 工作&#xff1f;10. 总结1、POD启动异常、部分节点无法启动p…...

2015年第四届数学建模国际赛小美赛B题南极洲的平均温度解题全过程文档及程序

2015年第四届数学建模国际赛小美赛 B题 南极洲的平均温度 原题再现&#xff1a; 地表平均温度是反映气候变化和全球变暖的重要指标。然而&#xff0c;在以前的估计中&#xff0c;在如何界定土地平均数方面存在一些方法上的差异。为简单起见&#xff0c;我们只考虑南极洲。请建…...

npm常见错误

三个方面 1. npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! phantomjs-prebuilt2.1.15 install: node install.js npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the phantomjs-prebuilt2.1.15 install script. np…...

JVM入门到入土-Java虚拟机寄存器指令集与栈指令集

JVM入门到入土-Java虚拟机寄存器指令集与栈指令集 HotSpot虚拟机中的任何操作都需要入栈和出栈的步骤。 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。优点是跨平台&#xff0c;指令集小&#x…...

MS2244模拟开关可Pin to Pin兼容NJM2244

MS2244 是一款集成的视频开关&#xff0c;实现三输入视频或音频信号的三选一。可Pin to Pin兼容NJM2244。 芯片集成了 75Ω驱动电路&#xff0c;可以直接驱动电视监控器。芯片工作电压 5V&#xff5e;12V&#xff0c;带宽 10MHz&#xff0c;抗串扰 70dB (4.43MHz)。另外芯片还集…...

PostgreSQL 可观测性最佳实践

简介 软件简述 PostgreSQL 是一种开源的关系型数据库管理系统 (RDBMS)&#xff0c;它提供了许多可观测性选项&#xff0c;以确保数据库的稳定性和可靠性。 可观测性 可观测性&#xff08;Observability&#xff09;是指对数据库状态和操作进行监控和记录&#xff0c;以便在…...

51单片机相关寄存器

前言 单片机复习的时候对应寄存器的记忆感觉很混乱&#xff0c;这里进行一下整理,后面的单词是我用来辅助记忆的&#xff0c;可能并不是表示原本的含义。 P3口的第二功能 0RXD 串行数据输入口 1TXD串行数据输出口2INT0外部中断0输入3INT1外部中断1输入4T0定时器0外部计数输入…...

二叉树进阶题目(超详解)

文章目录 前言根据二叉树创建字符串题目分析写代码 二叉树的层序遍历题目分析 写代码二叉树的层序遍历II题目分析写代码 二叉树的最近公共祖先题目分析写代码时间复杂度 优化思路优化的代码 二叉搜索树与双向链表题目分析写代码 从前序与中序遍历序列构造二叉树题目分析写代码从…...

W6100-EVB-Pico评估版介绍

文章目录 1 简介2 硬件资源2.1 硬件规格2.2 引脚定义2.3 工作条件 3 参考资料3.1 Datasheet3.2 原理图3.3 尺寸图&#xff08;尺寸&#xff1a;mm&#xff09;3.4 参考例程 4 硬件协议栈优势 1 简介 W6100-EVB-Pico是一款基于树莓派RP2040和全硬件TCP/IP协议栈以太网芯片W6100的…...

嵌入式面试准备

题目都摘于网上 嵌入式系统中经常要用到无限循环&#xff0c;如何用C编写死循环 while(1){}或者for(;&#x1f609; 内存分区 代码区&#xff0c;全局区&#xff08;全局变量&#xff0c;静态变量&#xff0c;以及常量&#xff09;&#xff0c;栈区&#xff0c;堆区 const关键…...

在Linux Docker中部署RStudio Server,实现高效远程访问

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装RStudio Server二. 本地访问三. Linux 安装cpolar四. 配置RStudio serv…...

EternalBlue【永恒之蓝】漏洞详解(复现、演示、远程、后门、入侵、防御)内容丰富-深入剖析漏洞原理-漏洞成因-以及报错解决方法-值得收藏!

漏洞背景&#xff1a; 1.何为永恒之蓝&#xff1f; 永恒之蓝&#xff08;Eternal Blue&#xff09;爆发于2017年4月14日晚&#xff0c;是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限&#xff0c;以此来控制被入侵的计算机。甚至于2017年5月12日&#xff0c; 不法分子…...

长链接与在线文件

什么是在线文件 常见的聊天工具&#xff0c;比如。。。微信&#xff0c;你可以发送一个文件给对端&#xff0c;即使对端不在线&#xff0c;这个文件也可以暂存在服务器上面&#xff0c;直到接收端上线消费或者超时&#xff0c;这个叫离线文件。与之对应的&#xff0c;在线文件要…...

Python内置数据类型等入门语(句)法

内置数据类型 数字&#xff08;Number&#xff09;关键字: int 、float、complex字符串&#xff08;String&#xff09;关键字&#xff1a;单引号&#xff0c;双引号 三引号都可以表示&#xff0c;8 种内置类型都可转为字符串类型列表&#xff08;List&#xff09; 关键符号 […...

ElasticSearch之RestClient笔记

1. ElasticSearch 1.1 倒排索引 1.2 ElasticSearch和Mysql对比 1.3 RestClient操作 导入依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.15.…...

饥荒Mod 开发(二二):显示物品信息

饥荒Mod 开发(二一)&#xff1a;超大便携背包&#xff0c;超大物品栏&#xff0c;永久保鲜 饥荒Mod 开发(二三)&#xff1a;显示物品栏详细信息 饥荒中的物品没有详细信息&#xff0c;基本上只有一个名字&#xff0c;所以很多物品的功能都不知道&#xff0c;比如浆果吃了也不知…...

Microsoft Edge使用方法和心得

Microsoft Edge使用方法和心得 大家好&#xff0c;我是豪哥&#xff0c;一名来自杭州的Java程序员&#xff0c;今天我想分享一下我对Microsoft Edge的使用方法和心得。作为一名热爱编程的程序员&#xff0c;我发现一个高效的浏览器对于我们的工作和学习至关重要。而Microsoft …...

LABVIEW写入Excel的函数:应用程序目录、创建路径、写入带分隔符电子表格、for循环、条件结构、按名称解除捆绑、创建数组

...

C语言转译LDPC码:试用比特翻转算法逼近香农极限

作者&#xff1a;绳匠_ZZ0为什么我要学LDPC&#xff1f;前几篇文章中&#xff0c;我已经实现了卷积码&#xff08;Viterbi译码&#xff09;和RS卷积级联码&#xff0c;它们在低信噪比下表现不错。但学长和我提到&#xff1a;Turbo码和LDPC码能够逼近香农极限&#xff0c;在相同…...

04_RAGFlow之知识图谱与Text2SQL

RAGFlow之知识图谱与Text2SQL&#xff1a;构建智能检索的双引擎 知识体系结构 RAGFlow技术栈 │ ├── 知识图谱层 │ ├── 实体识别与关系提取&#xff08;NER Relation Extraction&#xff09; │ ├── 图谱查询与推理&#xff08;Graph Query & Reasoning&a…...

74HC595移位寄存器驱动原理与CrazyHC595库深度解析

1. CrazyHC595库概述&#xff1a;面向嵌入式工程师的74HC595移位寄存器驱动深度解析74HC595是工业界最经典、应用最广泛的8位串行输入/并行输出移位寄存器芯片之一。其核心价值在于以3根GPIO线&#xff08;数据、时钟、锁存&#xff09;扩展出8个可独立控制的数字输出通道&…...

LinkSwift:重新定义网盘下载体验的八大平台直链解析工具

LinkSwift&#xff1a;重新定义网盘下载体验的八大平台直链解析工具 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

bilibili-api技术解析:如何解决视频标识符转换核心问题

bilibili-api技术解析&#xff1a;如何解决视频标识符转换核心问题 【免费下载链接】bilibili-api 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址&#xff1a;https://github.com/MoyuScript/bilibili-api 项目地址: https://gitcode.com/gh_mir…...

Python 使用 `raise` 报错抛出异常显示 Unicode 码如何解决

在 Python 开发中&#xff0c;我们经常使用 raise 抛出异常来处理错误情况。但有时候&#xff0c;异常信息中的中文或其他非 ASCII 字符会被显示为 Unicode 转义序列&#xff08;如 \u6b63\u6587&#xff09;&#xff0c;而不是直接显示中文&#xff08;如“正文”&#xff09;…...

镜像视界|从“静态建模”到“动态空间”:三维重构的终极形态——融合视频流建模与轨迹连续计算的空间智能引擎

镜像视界&#xff5c;从“静态建模”到“动态空间”&#xff1a;三维重构的终极形态——融合视频流建模与轨迹连续计算的空间智能引擎一、问题提出&#xff1a;为什么“建模”始终停留在静态在数字孪生、三维GIS与智慧城市系统中&#xff0c;“建模”一直是核心基础能力。 通过…...

Attu可视化工具:向量数据库性能监控与运维效率提升实践

Attu可视化工具&#xff1a;向量数据库性能监控与运维效率提升实践 【免费下载链接】attu The Best GUI for Milvus 项目地址: https://gitcode.com/gh_mirrors/at/attu Attu作为Milvus向量数据库的图形化管理界面&#xff0c;通过系统监控工具、性能分析仪表盘和可视化…...

根据应用场景TongWeb版本选购指南

TongWeb7.0.4企业版TongWeb8.0/7.0.8企业版&#xff08;主推&#xff09;TongWeb7.0.E/8.0.E嵌入版TongHttpServer(THS)应用开发语言JavaEE应用JavaEE/JakartaEE应用JavaEE/JakartaEE应用PHP应用、vue前端应用说明&#xff1a;1. PHP应用直接推荐THS。2. .NET Core应用不需要中…...