Python 备份 CSDN 博客

news2024/10/2 20:29:23

代码来源

根据csdn 中的 一位博主 备份代码修改

新增加

增加了保存图片 到本地,和修改markdown中图片的路径

问题

如果博客的内容太多,需要分多个truck 传输,保存时出现’'字符时,无法保存

注意

得获取登陆后的cookie,要不没法从服务器请求回博客详细内容

勉强可以用 , 95% 得到备份
import json
import uuid
import time
import requests
import datetime
from bs4 import BeautifulSoup
import re
import rich
import threading
from time import sleep
from rich.panel import Panel
from rich.progress import Progress

progress = Progress(auto_refresh=False)
master_task = progress.add_task("overall", total=21)
jobs_task = progress.add_task("jobs")

from rich.console import Console
console = Console()
def replace_image_path(markdown,new_path) -> str:
    pattern = r'!\[.*?\]\((.+)\)'
    
    lines = markdown.split('\n')
    for i in range(len(lines)):
        match = re.search(pattern, lines[i])
        
        if match is not None:
            original_path = match.group(1)
            lines[i] = lines[i].replace(original_path, new_path+"/"+original_path.rsplit('/')[-1])
    return '\n'.join(lines)

def request_blog_list(remote_url:str,page)->[]:
    blogs = []
    url = f'{remote_url}/{page}'
    reply = requests.get(url,headers='')
    parse = BeautifulSoup(reply.content, "lxml")
    spans = parse.find_all('div', attrs={'class':'article-item-box csdn-tracking-statistics'})
    for span in spans[:40]:
        try:
            href = span.find('a', attrs={'target':'_blank'})['href']
            date = span.find('span', attrs={'class':'date'}).get_text()
            blog_id = href.split("/")[-1]
            read_num = span.find('span', attrs={'class':'read-num'}).get_text()
            blogs.append([blog_id, date, read_num])
        except:
            print('Wrong, ' + href)
    return blogs

def request_md(blog_id, date):
    url = f"https://blog-console-api.csdn.net/v1/editor/getArticle?id={blog_id}"
    # 检查 cookies 从 csdn 博客中
    headers = {
        "cookie":"",
        "User-Agent": ""
    }
    data = {"id": blog_id}
    reply = requests.get(url, headers=headers, data=data)
    json_cache = reply.json()
    markdowncontent=json_cache['data']['markdowncontent']
    if markdowncontent  is not None:
        with open(f"blogs/{json_cache['data']['title']}.md","w+") as f:
            f.write(replace_image_path(markdowncontent,"img"))
        png = BeautifulSoup(reply.content,"lxml").find("img")
        if png is not None:
            res =  png.get('src')
            res = res.replace('"','').replace('\\','')
            if res is not None:
                with open(f"blogs/img/{res.rsplit('/', 1)[-1]}","wb") as f :
                    f.write(requests.get(res).content)





def main(start:int= 1,total_pages:int=1):
    with console.status("[bold green]Working on tasks...") as status:
         blogs = []
         for page in range(start, total_pages + 1):
             blogs.extend(request_blog_list("https://blog.csdn.net/weixin_45647912/article/list",page))
         for blog in blogs:
             blog_id = blog[0]
             date = blog[1].split()[0].split("-")
             request_md(blog_id, date)

if __name__ == '__main__':
    progress.console.print(
        Panel(
            "[bold blue]A demonstration of progress with a current task and overall progress.",
            padding=1,
        )
    )
    start = 0
    stop = 0
    job_no = 0
    for it in range(1,21,3):
        start = it
        stop = it +3
        if stop > 21 :
            stop = 21
        progress.log(f"Starting job #{job_no}") 
        th = threading.Thread(target=main,args=(start,stop))
        th.start()
        th.join()
        job_no+=1
    progress.console.print(
        Panel(
            "[bold blue]A demonstration of progress with a current task and overall progress. [ done]",
            padding=1,
        )
    )

请添加图片描述

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

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

相关文章

基于时空模型的视频异常检测

假设存在一个运动区域,规则要求只能进行特定的运动项目。 出于安全原因或因为业主不喜欢而禁止进行任何其他活动:)。 我们要解决的问题是:如果我们知道正确行为的列表,我们是否可以创建一个视频监控系统,在出现不常见的行为发出通…

IO、NIO、IO多路复用

IO是什么? IO分为两类,它们之间是有区别的,而且有很大的区别;1. 文件系统的IO 也叫本地io,就是和磁盘或者外围存储设备进行读写操作,外围设备有USB、移动硬盘等等;2. 网络的IO 将数据发送给对方…

获取主流电商平台商品价格,库存信息,数据分析,SKU详情

要接入API接口以采集电商平台上的商品数据,可以按照以下步骤进行: 1、找到可用的API接口:首先,需要找到支持查询商品信息的API接口。这些信息通常可以在电商平台的官方文档或开发者门户网站上找到。 2、注册并获取API密钥&#x…

「 典型安全漏洞系列 」05.XML外部实体注入XXE详解

1. XXE简介 XXE(XML external entity injection,XML外部实体注入)是一种web安全漏洞,允许攻击者干扰应用程序对XML数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后…

Windows 拦截系统睡眠、休眠

前言 在前一篇文章中,我们分析了以编程方式拦截 Winlogon 相关回调过程的具体做法,我们给出了一种拦截 RPC 异步回调的新方法——通过过滤特征码,我们可以对很多系统热键以及跟电源有关的操作做出“提前”响应。但是我们给出的代码并不能真正…

7.前端--CSS-复合选择器

1.什么是复合选择器 复合选择器是由两个或多个基础选择器,通过不同的方式组合而成的,可以更准确、更高效的选择目标元素(标签) 常用的复合选择器包括:后代选择器、子选择器、并集选择器、伪类选择器等等 2.后代选择器 …

DAY06_SpringBoot—入门properties/YML文件lombok插件及使用

目录 1 SpringBoot1.1 SpringBoot介绍1.2 SpringBoot入门案例1.2.1 安装SpringBoot插件1.2.2 创建SpringBoot项目 1.3 关于SpringBoot项目说明1.3.1 关于POM.xml文件说明1.3.2 依赖配置项1.3.3 build标签 1.4 SpringBoot Maven操作1.4.1 项目打包1.4.2 java命令运行项目 1.5 关…

Vulnhub-dc3

靶场下载 https://download.vulnhub.com/dc/DC-3-2.zip 信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-18 19:49 CST Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.00022s latency). MAC …

MySQL不同插入方式性能对比实验

最近负责的项目需要数据同步入库MySQL,为了测速那种入库方式效率比较高,为此进行了以下的对比实验,在此记录一下 实验表单数据格式 实验代码 共三种方法对比 mutiSqlInsert: 一条一条插入,最后一次提交 singleSqlInsert&…

RedisConnectionException: Unable to connect to redis.xxx.com:6379

报错 org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to redis.xxx.com:6379at org.springframework.data.redis.connection.lettuc…

力扣日记1.21-【回溯算法篇】77. 组合

力扣日记:【回溯算法篇】77. 组合 日期:2023.1.21 参考:代码随想录、力扣 终于结束二叉树了!听说回溯篇也是个大头,不知道这一篇得持续多久了…… 77. 组合 题目描述 难度:中等 给定两个整数 n 和 k&#…

接口测试 03 -- 接口自动化思维 Requests库应用

1. 接口自动化思维梳理 1.1接口自动化的优点 接口测试自动化,简单来讲就是功能测试用例脚本化然后执行脚本,产生一份可视化测试报告。不管什么样的测试方式,都是为了验证功能与发现 BUG。那为什么要做接口测试自动化呢?一句话概括…

一文搞懂分布式session解决方案与一致性hash

一、问题的提出 1. 什么是Session? 用户使用网站的服务,需要使用浏览器与Web服务器进行多次交互。HTTP协议本身是无状态的,需要基于HTTP协议支持会话状态(Session State)的机制。具体的实现方式是:在会话开…

72.批量执行Redis命令的4种方式!

文章目录 前言一、Redis命令执行过程二、原生批量命令三、pipeline(管道)四、Lua脚本五、Redis事务六、Redis Cluster模式下该如何正确使用批量命令操作? 前言 在我们的印象中Redis命令好像都是一个个单条进行执行的,但实际上我们是可以批量执行Redis命…

探秘二维码:从原理到应用,一探无线黑科技

目录 一、前言 1.1 二维码的起源和发展 1.2 二维码的重要性和应用广泛性 二、二维码的原理 2.1 二维码的结构和编码方式 2.2 二维码的扫描和解码原理 2.3 二维码的纠错码原理 三、二维码的类型和特点 3.1 静态二维码和动态二维码 3.2 黑白二维码和彩色二维码 3.3 静…

详解C语言中`||`的短路机制

在C语言中,逻辑或运算符(||)是一种常用的逻辑运算符,用于组合多个条件表达式。与其他编程语言一样,C语言中的逻辑或运算符具有短路机制,这是一种非常重要的概念,本文将深入解释C语言中的||短路机…

【Redis】redis为什么快

​ 🍎个人博客:个人主页 🏆个人专栏:Redis ⛳️ 功不唐捐,玉汝于成 ​ 目录 前言 正文 结语 我的其他博客 前言 在当今的计算机应用领域,数据存储和高性能访问成为系统设计中至关重要的一环。Redis以…

一.Winform使用Webview2(Edge浏览器核心) 创建demo(Demo1)实现回车导航到指定地址

Winform使用Webview2创建demo1实现回车导航到指定地址 往期目录参考文档实现1.安装visual studio2.创建单窗口应用3.修改项目中的窗体名称MainForm4.添加按钮5.添加窗口Demo16.在Demo1中添加WebView2 SDK7.在Demo1窗体中选择添加textbox和webview28.在MainForm.cs窗体中添加but…

【开源】基于JAVA的智慧社区业务综合平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 业务类型模块2.2 基础业务模块2.3 预约业务模块2.4 反馈管理模块2.5 社区新闻模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 业务类型表3.2.2 基础业务表3.2.3 预约业务表3.2.4 反馈表3.2.5 社区新闻表 四、系统展…

数据结构期末复习(六)查找算法

查找算法 查找算法通常有两种常见的实现方式:顺序查找和二分查找。 顺序查找 顺序查找也称为线性查找,是最简单的一种查找算法。它从数据集的起点开始逐个比较每个元素,直到找到目标元素或者搜索到数据集的末尾。 示例代码: …