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

news2024/10/5 16:30:10

自己去看文章数据的话,比较慢,所以一直想通过程序来批量获取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;
                }
            }

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

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

相关文章

VUE学习三、前端项目部署

1.前端项目打包 执行命令 npm run build:prod正常命令结束 , 会在前端项目里面出现dist文件夹 2.nginx下载安装 nginx下载 : http://nginx.org/en/download.html Windows 下载版本 Mainline version&#xff1a;Mainline 是 Nginx 目前主力在做的版本&#xff0c;可以说…

【手撕算法系列】BN

BN的计算公式 BN中均值与方差的计算 所以对于输入x: b,c,h,w 则 mean: 1,c,1,1var: 1,c,1,1代码 class BatchNorm(nn.Module):def __init__(self, num_features, num_dims):# num_features&#xff1a;完全连接层的输出数量或卷积层的输出通道数。# num_dims&#xff1a;2表示…

【JavaEE】多线程(4) -- 单例模式

目录 什么是设计模式? 1.饿汉模式 2.懒汉模式 线程安全问题 什么是设计模式? 设计模式好⽐象棋中的 "棋谱". 红⽅当头炮, ⿊⽅⻢来跳. 针对红⽅的⼀些⾛法, ⿊⽅应招的时候有⼀ 些固定的套路. 按照套路来⾛局势就不会吃亏. 软件开发中也有很多常⻅的 "问题…

接口优先于反射机制

在Java中&#xff0c;使用接口通常比反射机制更为优雅和安全。接口提供了一种声明性的方式来定义类的契约&#xff0c;并且能够在编译时进行类型检查&#xff0c;而反射则是在运行时动态获取和操作类的信息。下面是一个简单的例子&#xff0c;说明为什么在某些情况下接口比反射…

基于Java SSM框架实现体育竞赛运动会成绩裁判管系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现体育竞赛运动会成绩裁判管系统演示 摘要 体育竞赛是各种体育体育项目比赛的总称。是在裁判员的主持下&#xff0c;按统一的规则要求&#xff0c;组织与实施的体育员个体或体育队之间的竞技较量&#xff0c;是竞技体育与社会发生关联&#xff0c;并作用于…

鼠标点击展开详情

网页部分&#xff1a; HTML部分&#xff1a; <body><br><div id"nav"><div id"dang"></div><ul id"aaa"><li class"a1"><img src"img/U011.jpg" width"195" heig…

7+PPI+机器学习+实验,非肿瘤结合建模筛选生物标志物,可升级

今天给同学们分享一篇生信文章“Identification of diagnostic biomarkers and therapeutic targets in peripheral immune landscape from coronary artery disease”&#xff0c;这篇文章发表在J Transl Med期刊上&#xff0c;影响因子为7.4。 结果解读&#xff1a; 外周血中…

为什么要用 top_p 做文本生成采样

上一篇文章介绍了在大模型生成文本时&#xff0c;一个可以控制的参数 Temperature 的作用&#xff1a;查看温度参数与 softmax&#xff0c;今天继续来看另一个同样可以控制文本输出效果的参数。 或许你在使用 OpenAI 的接口时&#xff0c;会碰到这个参数&#xff0c;那就是 to…

尚硅谷Docker笔记-基础篇

B站视频&#xff1a;https://www.bilibili.com/video/BV1gr4y1U7CY 1.Docker简介 解决了运行环境和配置问题的软件容器 方便做持续集成并有助于整体发布的容器虚拟化技术 容器与虚拟机比较 Docker 容器是在操作系统层面上实现虚拟化&#xff0c;直接复用本地主机的操作系统…

线程终止,线程的相关方法,线程状态图以及线程的同步机制。

首先我们知道了什么是线程&#xff0c;以及线程的实现方法&#xff0c;接下来我们来了解一下继承Thread类和Runnable接口的区别&#xff0c;其实本质上是没有区别的&#xff0c;因为Thread也实现了Runnable的接口&#xff0c;唯一区别就是使用Runnable接口&#xff0c;可以实现…

准确无误的二手车估值API接口,帮您把握市场行情!

随着二手车市场的快速发展&#xff0c;越来越多的人开始关注二手车的估值问题。在购买二手车或者出售二手车时&#xff0c;了解车辆的真实价值是非常重要的。而准确无误的二手车估值API接口能够帮助我们更好地把握市场行情。 在挖数据平台上&#xff0c;我们提供了一个功能强大…

IntersectionObserver API的简单介绍及应用

前言 IntersectionObserver 之前就有所了解&#xff0c;但是一直没有用&#xff0c;当时觉得浏览器兼容性不好&#xff0c;直接用onscroll监听也能实现相关功能&#xff0c;但是随着浏览器支持性越来越好&#xff0c;这个属性到迄今为止&#xff0c;可以用在大部分的正式项目中…

C++泛型超详细合集-泛化的编程方式-程序员编写一个函数/类的代码让编译器去填补出不同的函数实现-供大家学习研究参考

以Add函数为例&#xff0c;在函数模板存在的同时&#xff0c;我们还可以单独写一个int类型的add函数。这都归功于函数重载的存在。 同时&#xff0c;我们还可以使用<int>来指定函数模板重载为已存在的Add函数。因为本质上这两个函数是不同的&#xff0c;并不会冲突。 下…

代码随想录27期|Python|Day16|二叉树|104.二叉树的最大深度|111.二叉树的最小深度|222.完全二叉树的节点个数

二叉树专题&#xff0c;重点掌握后续的递归和中间节点的处理。 104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 本题在前一章已经解决了层序遍历的解法&#xff0c;现在来聊一下递归法。 首先需要明确两个概念&#xff1a;深度和高度。&#xff08;注意&…

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

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

Ubuntu系统入门指南:基础操作和使用

Ubuntu系统的基础操作和使用 一、引言二、安装Ubuntu系统三、Ubuntu系统的基础操作3.1、界面介绍3.2、应用程序的安装和卸载3.3、文件管理3.4、系统设置 四、Ubuntu系统的日常使用4.1、使用软件中心4.2、浏览器的使用和网络连接设置4.3、邮件客户端的配置和使用4.4、文件备份和…

大数据与深度挖掘:如何在数字营销中与研究互动

数字营销最吸引人的部分之一是对数据的内在关注。 如果一种策略往往有积极的数据&#xff0c;那么它就更容易采用。同样&#xff0c;如果一种策略尚未得到证实&#xff0c;则很难获得支持进行测试。 数字营销人员建立数据信心的主要方式是通过研究。这些研究通常分为两类&…

人工智能文本分类

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

java集合的迭代器与遍历

文章目录 迭代器Iterator1、什么是Iterator2&#xff0c;iterator接口的API3、Irerator()方法细节解释4. Irerator的原理示意图4. 1 Irerator的案例5. forEach循环与Iterator遍历的区别与联系 ListIterator1.ListIterator的概述(1) 概念(2) 解析 2.ListIterator的生成3.ListIte…

微服务实战系列之ZooKeeper(下)

前言 通过前序两篇关于ZooKeeper的介绍和总结&#xff0c;我们可以大致理解了它是什么&#xff0c;它有哪些重要组成部分。 今天&#xff0c;博主特别介绍一下ZooKeeper的一个核心应用场景&#xff1a;分布式锁。 应用ZooKeeper Q&#xff1a;什么是分布式锁 首先了解一下&…