如何批量获取CSDN文章数据并进行持久化

自己去看文章数据的话,比较慢,所以一直想通过程序来批量获取CSDN的文章数据,最近研究了一下,发现还是挺简单的,能够直接通过解析json来获取文章数据,跟大家分享一下。

文章目录

      • 一、步骤
        • 1、首先我们到自己的主页或别人的主页【也就是你想获取的文章数据的那个页面】
        • 2、找到这个以get-busness的请求开头的请求
        • 3、解析请求响应的json数据
        • 4、数据持久化
      • 二、完整的方法代码

一、步骤

1、首先我们到自己的主页或别人的主页【也就是你想获取的文章数据的那个页面】

这里以我自己的为例。

2、找到这个以get-busness的请求开头的请求

查看它的响应信息,我们会发现这里面有20条文章的数据信息,且单个文章的信息也是比较全的,包括了比较重要的几个信息,包括阅读量,文章标题,发布时间等,这就足够了。
在这里插入图片描述

在这里插入图片描述

那有的人就会想问了,这里只有20条,如果我想获取更多的数据该怎么办呢?

我们直接调整请求的参数即可,我们直接到请求的标头中,把请求的url复制出来,更改这个size的参数。
在这里插入图片描述
这里我们将size参数调整为40,发送请求,就得到了40条文章数据。
在这里插入图片描述
在这里插入图片描述

3、解析请求响应的json数据

这里直接参考代码即可,就是一层一层去解析json拿到对应的文章数据。

4、数据持久化

4.1 建文章数据库表

建表语句如下:

CREATE TABLE `article` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id',`title` varchar(255) NOT NULL COMMENT '文章标题',`release_time` datetime NOT NULL COMMENT '发布时间',`yesterday_views` int(11) DEFAULT '0' COMMENT '昨日阅读量',`daily_views` int(11) NOT NULL DEFAULT '0' COMMENT '当天阅读量',`weekly_views` int(11) NOT NULL DEFAULT '0' COMMENT '本周阅读量(周日)',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1359 DEFAULT CHARSET=utf8 COMMENT='csdn文章表';

4.2 创建文章实体类对象

实体类如下:


import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;/*** csdn文章对象 article* * @author ruoyi* @date 2023-10-15*/
public class Article
{private static final long serialVersionUID = 1L;/** 主键自增id */private Long id;/** 文章标题 */private String title;/** 发布时间 */@JsonFormat(pattern = "yyyy-MM-dd")private Date releaseTime;/** 昨日阅读量 */private Long yesterdayViews;/** 当天阅读量 */private Long dailyViews;/** 本周阅读量(周日) */private Long weeklyViews;public void setId(Long id) {this.id = id;}public Long getId() {return id;}public void setTitle(String title) {this.title = title;}public String getTitle() {return title;}public void setReleaseTime(Date releaseTime) {this.releaseTime = releaseTime;}public Date getReleaseTime() {return releaseTime;}public void setYesterdayViews(Long yesterdayViews) {this.yesterdayViews = yesterdayViews;}public Long getYesterdayViews() {return yesterdayViews;}public void setDailyViews(Long dailyViews) {this.dailyViews = dailyViews;}public Long getDailyViews() {return dailyViews;}public void setWeeklyViews(Long weeklyViews){this.weeklyViews = weeklyViews;}public Long getWeeklyViews(){return weeklyViews;}@Overridepublic String toString() {return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE).append("id", getId()).append("title", getTitle()).append("releaseTime", getReleaseTime()).append("yesterdayViews", getYesterdayViews()).append("dailyViews", getDailyViews()).append("weeklyViews", getWeeklyViews()).append("createTime", getCreateTime()).toString();}
}

4.3 将数据封装到实体类中,并插入到数据库中

参考代码

二、完整的方法代码

  /*** 通过爬虫批量插入文章数据* @return*///@Overridepublic  int insertArticleByCSDN() throws IOException, ParseException {String url2="https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=50&businessType=blog&orderby=&noMore=false&year=&month=&username=Keep__Me";//获取的JSON接口数据String list = sendGet(url2);//System.out.println(list);//定义一个空变量JSONObject row = null;//将获取的JSON数据存储到变量中JSONObject jsonObject = JSON.parseObject(list);//定义一个空对象Article article;int sum = 0;if ("200".equals(jsonObject.getString("code"))) {article=new Article();JSONObject dataObject  = jsonObject.getJSONObject("data");// 获取 list 数组JSONArray listArray = dataObject.getJSONArray("list");if (listArray != null) {for (int i = 0; i < listArray.size(); i++) {JSONObject itemObject = listArray.getJSONObject(i);// 解析 itemObject 中的各个属性int articleId = itemObject.getIntValue("articleId");String title = itemObject.getString("title");article.setTitle(title);String description = itemObject.getString("description");String url = itemObject.getString("url");int type = itemObject.getIntValue("type");boolean top = itemObject.getBooleanValue("top");boolean forcePlan = itemObject.getBooleanValue("forcePlan");int viewCount = itemObject.getIntValue("viewCount");Long dailyViews=(long)viewCount;article.setDailyViews(dailyViews);//获取当前是星期几LocalDate today = LocalDate.now();DayOfWeek dayOfWeek = today.getDayOfWeek();String chineseDayOfWeek = dayOfWeek.getDisplayName(TextStyle.FULL_STANDALONE, Locale.CHINA);if("星期日".equals(chineseDayOfWeek)){article.setWeeklyViews(dailyViews);}int commentCount = itemObject.getIntValue("commentCount");String editUrl = itemObject.getString("editUrl");String postTime = itemObject.getString("postTime");Date releaseTime = new SimpleDateFormat("yyyy-MM-dd").parse(postTime);article.setReleaseTime(releaseTime);int diggCount = itemObject.getIntValue("diggCount");String formatTime = itemObject.getString("formatTime");int collectCount = itemObject.getIntValue("collectCount");Date nowDate = DateUtils.getNowDate();article.setCreateTime(nowDate);// 获取 picList 数组JSONArray picListArray = itemObject.getJSONArray("picList");if (picListArray != null) {List<String> picList = new ArrayList<>();for (int j = 0; j < picListArray.size(); j++) {String picUrl = picListArray.getString(j);picList.add(picUrl);}// 将解析出的数据保存到某个数据结构中(例如 JavaBean)// ...}int i1 = articleMapper.insertArticle(article);sum+=i1;}}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件函数的简单介绍

1. 向文件中写入一个字符 fputc int_Ch指的是输入文件中的字符 &#xff08;int&#xff09;的原因是以ascll码值的型式输入 #include <stdio.h> #include <errno.h> #include <string.h> int main() { FILE* pf fopen("test.txt","…

Ubuntu 常用命令之 chmod 命令用法介绍

chmod是Linux系统下的一个命令&#xff0c;用于改变文件或目录的权限。它的名称是“change mode”的缩写。在Linux中&#xff0c;文件或目录的权限分为读&#xff08;r&#xff09;、写&#xff08;w&#xff09;和执行&#xff08;x&#xff09;三种&#xff0c;分别对应数字4…

实验记录:深度学习模型收敛速度慢有哪些原因

深度学习模型收敛速度慢有哪些原因&#xff1f; 学习率设置不当&#xff1a; 学习率是算法中一个重要的超参数&#xff0c;它控制模型参数在每次迭代中的更新幅度。如果学习率过大&#xff0c;可能会导致模型在训练过程中的振荡&#xff0c;进而影响到收敛速度&#xff1b;如果…

Lit官方入门示例

陈拓 2023/12/17-2023/12/17 1. 简介 在《用Vite构建Lit项目》 https://blog.csdn.net/chentuo2000/article/details/134831884?spm1001.2014.3001.5501 一文中我们介绍了怎样用Vite构建Lit项目。 本文我们介绍不依赖Vite的Lit入门示例。 我的开发环境还是和上文相同。 …

【Linux】初识命令行

为什么使用命令行&#xff1f; 大多数的计算机用户只是熟悉图形用户界面(GUI)&#xff0c;采用图形方式显示的用户操作界面。命令行界面(CLI)是一种通过文本输入来与计算机进行交互的方式&#xff0c;用来和计算机进行交流沟通的非常有效的方式&#xff0c;正像人类社会使用文…

文心一言 VS 讯飞星火 VS chatgpt (158)-- 算法导论12.3 5题

五、用go语言&#xff0c;假设为每个结点换一种设计&#xff0c;属性 x.p 指向 x 的双亲&#xff0c;属性 x.succ 指向 x 的后继。试给出使用这种表示法的二叉搜索树 T 上 SEARCH、INSERT 和DELETE 操作的伪代码。这些伪代码应在 O(h) 时间内执行完&#xff0c;其中 h 为树 T 的…

图像截屏公式识别——LaTeX-OCR安装与使用

一、简介 LaTeX-OCR 是一个开源的光学字符识别&#xff08;OCR&#xff09;软件&#xff0c;专为 LaTeX 文档提供支持。其主要目的是帮助用户将扫描的文档转换为 LaTeX 编辑器可以使用的可编辑文本&#xff0c;从而方便进行修改、编辑和排版。LaTeX广泛用于科技、数学、工程等…

Spring之容器:IOC(1)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Vue3使用Three.js导入gltf模型并解决模型为黑色的问题

背景 如今各类数字孪生场景对三维可视化的需求持续旺盛&#xff0c;因为它们可以用来创建数字化的双胞胎&#xff0c;即现实世界的物体或系统的数字化副本。这种技术在工业、建筑、医疗保健和物联网等领域有着广泛的应用&#xff0c;可以帮助人们更好地理解和管理现实世界的事…

FL Studio2024破解版注册机及使用教程

FL Studio 2024破解版是一款非常实用的软件。该软件用于不同的目的&#xff0c;例如从音频中删除人声、管理音频以及更改不同的音频属性。此外&#xff0c;您还可以查看音频和歌曲的不同效果并管理其音量和大小。您还可以管理音乐和音频的自动化。您可以用它创作一首具有不同音…

Pantera Capital致信2024:继续做多BTC

作者&#xff1a;Dan Moredherd, Katrina Paglia, Jeff Lewis, Erik Lowe Pantera Capital 编译&#xff1a;秦晋 碳链价值 一年的变化有多大啊。这就是我们2023年1月信函的开头&#xff1a; 亲爱的投资者&#xff1a; 假设现在是2022年1月1日。想象一下&#xff0c;我告诉你…

汇编语言的前世今生

计算机中的0和1是用电的状态表示的。具体来说&#xff0c;断开为0&#xff0c;接通为1。自然而言&#xff0c;这也对应着二进制。曾经时代的二进制加法机是一个划时代的产物&#xff0c;能够进行两个8位二进制数的实时加法&#xff0c;尽管今天看来很LOW。 图1 二进制加法器&am…