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

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

一、步骤

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;
                }
            }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丿BAIKAL巛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值