CSDN博客迁移至Hexo

实现思路:

  • 获取博客列表
  • 获取博客详情
  • 解析博客详情html,找出 #article_content部分
  • 通过jsoup解析博客内容,转成md格式文件

依赖

  <dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.33</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId><version>5.8.21</version></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.14.3</version></dependency>

java实现代码

package com.example.iotdbdemo.config;import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.file.FileWriter;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
import org.jsoup.select.Elements;import java.io.IOException;/*** @author WANG*/
@Slf4j
public class Csdn2Hexo {private static final String LIST_URL = "https://blog.csdn.net/community/home-api/v1/get-business-list?page=2&size=10000&businessType=blog&orderby=&noMore=false&year=&month=&username=%s";private static final String DETAIL_URL = "https://blog.csdn.net/%s/article/details/%s";private static final String USER_ID = "your-userId";private static String getHttp(String url) {String responseStr = null;CloseableHttpClient httpclient = HttpClients.createDefault();HttpGet httpPost = new HttpGet(url);RequestConfig config = RequestConfig.custom().build();httpPost.setConfig(config);try (CloseableHttpResponse response2 = httpclient.execute(httpPost)){HttpEntity entity2 = response2.getEntity();responseStr = EntityUtils.toString(entity2);} catch (IOException e) {e.printStackTrace();}return responseStr;}private static void parseHtml(String html, String title, String description, String date) {Document document = Jsoup.parse(html);Element articleContentDiv = document.select("#article_content").first();assert articleContentDiv != null;Document doc = Jsoup.parse(articleContentDiv.html());StringBuilder markdown = new StringBuilder();markdown.append("---").append("\r\n").append("title: ").append(title).append("\r\n").append("date: ").append(date).append("\r\n").append("---").append("\r\n").append(description).append("\r\n");Element element = doc.body().children().get(0);for (Node node : element.childNodes()) {if (node instanceof TextNode textNode) {markdown.append(textNode.text());} else if (node instanceof Element childElement) {switch (childElement.tagName()) {case "h1", "h2", "h3", "h4", "h5", "h6" -> {int level = Integer.parseInt(childElement.tagName().substring(1));markdown.append("\n").append("#".repeat(level)).append(" ").append(childElement.text()).append("\n\n");}case "p" -> markdown.append("\n").append(childElement.text()).append("\n\n");case "ul" -> markdown.append(convertListToMarkdown(childElement, false));case "ol" -> markdown.append(convertListToMarkdown(childElement, true));case "pre" -> markdown.append("\n```\n").append(childElement.text()).append("\n```\n\n");default -> markdown.append("\r\n");}}}title = title.replaceAll("\\.+", "-");title = title.replaceAll(":+", "-");title = title.replaceAll("\\|+", "-");title = title.replaceAll(">+", "-");FileWriter writer = new FileWriter("E:\\gitee\\html\\" + title + ".md");writer.write(markdown.toString());log.info("Write {} success", writer.getFile().getAbsolutePath());}private static String convertListToMarkdown(Element list, boolean ordered) {StringBuilder markdown = new StringBuilder();Elements items = list.children();int count = 1;for (Element item : items) {String prefix = ordered ? (count++ + ". ") : "* ";markdown.append(prefix).append(item.text()).append("\n");}return markdown.append("\n").toString();}public static void main(String[] args) {String listUrl = String.format(LIST_URL, USER_ID);String listJson = getHttp(listUrl);JSONObject jsonObject = JSONObject.parseObject(listJson);Integer code = jsonObject.getInteger("code");if(code == 200){JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("list");if(CollUtil.isNotEmpty(jsonArray)){for (Object o : jsonArray) {if(o instanceof JSONObject item){Integer articleId = item.getInteger("articleId");String title = item.getString("title");String description = item.getString("description");String date = item.getString("postTime");String detailUrl = String.format(DETAIL_URL, USER_ID, articleId);String html = getHttp(detailUrl);parseHtml(html, title, description, date);}}}}}}

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

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

相关文章

Linux实用操作篇-下篇

Linux实用操作篇-上篇&#xff1a;Linux实用操作-上篇-CSDN博客 一、网络传输 1.1 ping命令 网络是否可联通 可以通过ping命令&#xff0c;检查指定的网络服务器是否是可联通状态 语法: ping [-c num] ip或主机名 选项&#xff1a;-c&#xff0c;检查的次数&#xff0c;…

嵌入式SOC芯片选型

摘要&#xff1a; 本文主要探讨的是如果涉及芯片选型&#xff0c;需要考虑哪些方面&#xff1f; 将相关的需求列出来&#xff0c;供后续实践的时候参考。 SOC芯片选型 能力参数指标备注算力编码能力VPU处理能力YUV算法资源媒体audiovideoCPU运行主频架构DDRDDR规格DDR带宽DD…

cmake常用设置命令及参数大全

CMake是一个跨平台的开源构建工具,用于管理软件项目的构建过程。它使用简单的配置文件(CMakeLists.txt)来定义构建过程的规则。 以下是一些常用的CMake设置和命令: 1. cmake_minimum_required(VERSION x.x):指定需要的CMake版本。 2. project(project_name):设置项目的…

深入理解Java虚拟机---垃圾收集算法

深入理解Java虚拟机---垃圾收集算法 如何判定对象是否存活引用计数法可达性分析法 Java引用类型垃圾回收算法标记-清除算法复制算法标记-整理算法分代收集算法 HotSpot的算法实现枚举根节点安全点安全区域 如何判定对象是否存活 引用计数法 引用计数算法利用额外的内存空间来…

Dockerfile创建镜像介绍

1.介绍 Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile&#xff0c;docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build语法&#xff1a; # docker build [OPTIONS] <PATH | URL | -> 常用选项说明 --build-arg&#xff0c;设置构建时的…

上海亚商投顾:沪指探底回升 AI应用方向再度爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日探底回升&#xff0c;早盘一度均跌超1%&#xff0c;午后集体拉升翻红&#xff0c;深成指、创业板…

FFmpeg的AVcodecParser

文章目录 结构体操作函数支持的AVCodecParser 这个模块是AVCodec中的子模块&#xff0c;专门用来提前解析码流的元数据&#xff0c;为后面的解码做准备&#xff0c;这一点对cuda-NVdec非常明显&#xff0c;英伟达解码器的元数据解析是放在CPU上的&#xff0c;所以就非常依赖这个…

为什么Vue3的proxy需要Reflect呢

何为proxy Proxy 对象用于定义或修改某些操作的自定义行为&#xff0c;可以在外界对目标对象进行访问前&#xff0c;对外界的访问进行改写。 var proxy new Proxy(target, handler)ES6 中的proxy目前提供了13种可代理操作拦截的行为。 何为reflect ES6 标准中&#xff0c;…

远程工作:自由职业者如何成功赚钱

前言 在这个不断进步的数字化时代&#xff0c;远程工作已经从一个可选的边缘工作方式&#xff0c;成长为主流职业趋势的一部分。特别是自从全球疫情改变了我们的生活和工作方式以来&#xff0c;远程工作的概念不再是遥不可及的理想&#xff0c;而是已经成为许多人日常工作的现…

SpringBoot集成swagger2配置权限认证参数

作者简介&#xff1a;大家好&#xff0c;我是撸代码的羊驼&#xff0c;前阿里巴巴架构师&#xff0c;现某互联网公司CTO 联系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗…

[Java][JDK5]可变参数

我们可以假设一种情况&#xff0c;我们需要进行求和计算 在原先&#xff0c;我们考虑到参数只能传入一个数字&#xff0c;因此我们会将需要求和的数字放在一个数组&#xff0c;传入该数组进入方法再拆分计算 比如下面的例子:使用了增强for来对数组进行遍历 public class Mai…

【Lidar】基于Python的三维点云数据转二维平面+散点图绘制

最近一直在搞点云相关的操作&#xff0c;有时候在处理点云数据时需要查看处理后的数据是否满足需求&#xff0c;所以就想着写一套展示点云的代码。之前已经分享过如何可视化点云了&#xff0c;感兴趣的可以自己去看下&#xff1a;【Lidar】基于Python的Open3D库可视化点云数据。…

golang https server如何设计方便抓包定位且安全

代码 测试 用go写后端https服务时&#xff0c;需要定位https包中的内容是否符合预期。 有涉猎的朋友应该了解过https有一种keylog技术&#xff0c;它允许在HTTPS连接中捕获和记录SSL或TLS会话密钥&#xff0c;以便于调试和分析加密流量。 本文将的就是通过可控制开启和关闭的…

单身狗(Python)

题目描述 单身狗 “单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人&#xff0c;以便给予特殊关爱。 输入格式&#xff1a; 输入第一行给出一个正整数 N&#xff08;≤50000&#xff09;&#xff0c;是已知夫妻/伴侣的对数&#xff1b;…

CPU 混合推理,非常见大模型量化方案:“二三五六” 位量化

本篇文章聊聊网上聊的比较少的具体量化操作&#xff0c;非常见整型位数的量化&#xff0c;来自让各种开源模型能够在 CPU 环境、CPU & GPU 环境混合推理的技术方案&#xff1a;llama.cpp 。 写在前面 接下来&#xff0c;有计划分享一些关于各种开源模型的实践内容。为了能…

安装ThingBox Eclipse Plugin

1. ChatGPT问 The latest version of the ThingBox Eclipse Plugin requires Eclipse IDE 2021-06 or later. 2. PTC官网下载 MED-61378-CD-092_F000_Eclipse-Plugin-9-0-1.zip文件, 和 MED-61098-CD-085_F000_ThingWorx-Extension-SDK-8-5-0&#xff08;需要账号&#xff09…

虚拟化逻辑架构:KVM虚拟机通过OVS端口组实现网络连接

目录 一、实验 1.CentOS 7 安装 OpenVSwitch(构建RPM安装包&#xff09; 2.KVM虚拟机通过OVS端口组实现网络连接 二、问题 1.安装openvswitch-2.5.10报错 2.virt-install未找到命令 3.如何删除自定义网络 一、实验 1.CentOS 7 安装 OpenVSwitch(构建RPM安装包&#xff…

字符串知识点

一. 1.字符占据一个字节 2.字符数组&#xff1a;char name[15] { W, a, n, g, L, i}; 字符串&#xff1a;char name[15] “Wang Li”&#xff1b; 二. 1.字符串&#xff1a;为有效长度&#xff08;有效字符的个数&#xff09;而不是字符数组的长度&#xff1b; 2.&#…

创建一个有阴影的threejs三维几何体

import * as THREE from "three" import { OrbitControls } from three/examples/jsm/controls/OrbitControlsconst width window.innerWidth; const height window.innerHeight;//创建场景 const scene new THREE.Scene(); scene.background new THREE.Color(#6…

LinuxBasicsForHackers笔记 --Python 脚本基础

添加Python模块 Python 有一个专门用于安装和管理 Python 包的包管理器&#xff0c;称为 pip&#xff08;Pip Installs Packages&#xff09;。由于我们在这里使用 Python 3&#xff0c;因此您将需要 Python 3 的 pip 来下载和安装软件包。默认情况下应包含 Pip&#xff0c;但…