如何批量获取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;
    }

    @Override
    public 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
     */
    //@Override
    public  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;
                }
            }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript数组分组groupBy

JavaScript 最近发布了一个方法 Object.groupBy&#xff0c;可以对可迭代对象中的元素进行分组。 语法&#xff1a; Object.groupBy(items, callbackFn)items 被分组的可迭代对象&#xff0c;如 Array。 callbackFn 对可迭代对象中的每个元素执行的函数。 举个例子&#…

结构型设计模式(一):门面模式 组合模式

门面模式 Facade 1、什么是门面模式 门面模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在为系统提供一个统一的接口&#xff0c;以便于访问子系统中的一群接口。它通过定义一个高层接口&#xff0c;简化了客户端与子系统之间的交互&#xf…

基于Java SSM框架实现图书店仓库进销存管理系统项目【项目源码+论文说明】

基于java的SSM框架实现图书店仓库进销存管理系统演示 摘要 仓库作为储存货物的核心功能之一&#xff0c;在整个仓储中具有非常重要的作用&#xff0c;是社会物质生产的必要条件。良好的仓库布局环境能够对货物进入下一个环节前的质量起保证作用&#xff0c;能够为货物进入市场…

FPGA设计与实战之时钟及时序简介1

文章目录 一、时钟定义二、基本时序三、总结一、时钟定义 我们目前设计的电路以同步时序电路为主,时钟做为电路工作的基准而显得非常重要。 简单的接口电路比如I2C、SPI等,复杂一点接口比如Ethernet的MII、GMII等接口,它们都有一个或多个时钟信号。 那么什么是时钟信号?它…

PADS9.5 : 原图绘图图纸尺寸下修改

原图绘图图纸尺寸下修改 图页边界线也要修改 如果二者选择不一致&#xff1a; 会出现下图所示情况&#xff1a;

Android hwcomposer服务启动流程

Android hwcomposer服务启动流程 客户端 binder远程调用 服务端 surfaceflinger --binder--> hwcomposer .hal文件编译时生成支持binder进程间远程调用通信的cpp文件 在out/soong/.intermediates/hardware/interfaces/graphics/composer/2.1/ 目录下找…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建3. 模型训练及保存1&#xff09;模型训练2&#xff09;模型保存 4. 模型生成1&#xff09;模型导入及调用2&#xff09;相关代码&#xff08;1&#xff09;布局文件&#xff08;2&#xff…

LCR 120. 寻找文件副本

解题思路&#xff1a; 利用增强for循环遍历documents&#xff0c;将遇见的id加入hmap中&#xff0c;如果id在hamp中存在&#xff0c;则直接返回id class Solution {public int findRepeatDocument(int[] documents) {Set<Integer> hmapnew HashSet<>();for(int d…

插入排序----希尔排序

希尔排序 希尔排序法又称缩小增量法。希尔排序法的基本思想是&#xff1a;先选定一个整数&#xff0c;把待排序文件中所有记录分成个gap组&#xff0c;所有距离为的记录分在同一组内&#xff0c;并对每一组内的记录进行排序。然后&#xff0c;取&#xff0c;重复上述分组和排序…

千亿露酒市场的未来之“露”

执笔 | 尼 奥 编辑 | 扬 灵 12月15日&#xff0c;以“以美为酿&#xff0c;品致未来”为主题的中国露酒产业发展大会暨露酒价值论坛在“中国酒都”宜宾举办。 近年来&#xff0c;露酒产业发展异军突起&#xff0c;市场销售规模超越黄酒、葡萄酒品类&#xff0c;成为中国酒…

【Qt QML 入门】TextEdit

TextEdit可以显示多行可编辑的格式化文。默认是无边框的&#xff0c;可以和父控件完美融合。 import QtQuick import QtQuick.Window import QtQuick.ControlsWindow {id: winwidth: 800height: 600visible: trueTextEdit {id: textEditanchors.centerIn: parenttext: "He…

Sentinel使用详解

组件简介 Sentinel是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景&#xff0c;例如秒杀、消息削峰填谷、集群流量控…

翻译: LLM工具使用和代理Tool use and agents

欢迎来到本周的最后一个视频。在这个视频中&#xff0c;我想与您分享LLM&#xff08;大型语言模型&#xff09;开始能够使用工具的情况&#xff0c;以及讨论一下前沿的“代理”主题&#xff0c;这是让LLM自己决定下一步采取什么行动的领域。让我们来看看。在早期的食物订单接收…

操作系统期末复习-内存管理

一、内存管理 分页存储管理&#xff0c;是将一个进程的逻辑地址空间分成若干个大小相等的片&#xff0c;称为页面或页&#xff0c;并为各页加以编号&#xff0c;从0开始&#xff0c;如第0页、第1页等。相应地&#xff0c;也把内存空间分成与页面相同大小的若干个存储块&#xf…

人工智能文本分类

在本文中&#xff0c;我们全面探讨了文本分类技术的发展历程、基本原理、关键技术、深度学习的应用&#xff0c;以及从RNN到Transformer的技术演进。文章详细介绍了各种模型的原理和实战应用&#xff0c;旨在提供对文本分类技术深入理解的全面视角。 一、引言 文本分类作为人工…

交叉熵在机器学习里做损失的意义

交叉熵是机器学习中常用的损失函数之一&#xff0c;特别适用于分类任务。其背后的核心思想是衡量两个概率分布之间的差异。在分类问题中&#xff0c;通常有一个真实分布&#xff08;ground truth distribution&#xff09;和一个模型预测的分布&#xff08;predicted distribut…

knime 安装Regex Extractor节点

1、在File中&#xff0c;找到install knime extensions 2、接着输入palladian&#xff0c;然后选择select all&#xff0c;最后点击next就可以了&#xff0c;等待安装就可以了 3、然后重启knime就可以看到了Regex Extractor节点

整理了上百个开源中文大语言模型,涵盖模型、应用、数据集、微调、部署、评测

自ChatGPT为代表的大语言模型&#xff08;Large Language Model, LLM&#xff09;出现以后&#xff0c;由于其惊人的类通用人工智能&#xff08;AGI&#xff09;的能力&#xff0c;掀起了新一轮自然语言处理领域的研究和应用的浪潮。 尤其是以ChatGLM、LLaMA等平民玩家都能跑起…