惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
量子位
The Cloudflare Blog
美团技术团队
T
The Exploit Database - CXSecurity.com
博客园 - 【当耐特】
Spread Privacy
Spread Privacy
P
Proofpoint News Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 三生石上(FineUI控件)
T
Tor Project blog
博客园 - 司徒正美
宝玉的分享
宝玉的分享
T
Threatpost
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Secure Thoughts
T
Threat Research - Cisco Blogs
Hacker News: Ask HN
Hacker News: Ask HN
Jina AI
Jina AI
博客园 - 聂微东
A
Arctic Wolf
I
Intezer
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Know Your Adversary
Know Your Adversary
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
爱范儿
爱范儿
Hugging Face - Blog
Hugging Face - Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
小众软件
小众软件
T
Tailwind CSS Blog
The Hacker News
The Hacker News
L
LINUX DO - 最新话题
Hacker News - Newest:
Hacker News - Newest: "LLM"
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
TaoSecurity Blog
TaoSecurity Blog
Project Zero
Project Zero
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Cloudbric
Cloudbric
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
大猫的无限游戏
大猫的无限游戏
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Troy Hunt's Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
V2EX - 技术
V2EX - 技术
The GitHub Blog
The GitHub Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog

碎言

不懂就别瞎掰掰:【程序员的常识】写的什么玩意? AI 辅助编程下的程序设计与代码编写 使用 Next.js 和 Tailwind CSS 构建可编辑和删除的 ToDo 待办事项应用 探索编程新境界:MarsCode 助你一臂之力 使用 Next.js 和 Tailwind CSS 搭建静态图片展示站点并部署到 Vercel AI 辅助编程:免费工具的优缺点及官网一览 GitHub push更新总是失败,写个python脚本解决 把博客从GitHub迁移到到了vercel ComfyUI 和 Flux.1 安装与使用教程 Flux.1 入门必知:硬件、环境、模型 Git项目的子文件夹中的内容无法同步到远程仓库的解决方法 blender流体Fluid使用中没有流体、流体穿模等一些问题的解决方法 博客聚合网站:积薪,竟然关闭了! blender日常使用中的一些技巧 虽然只有我自己在用,但还是更新了碎言博客的源代码, 与其在迷茫中困惑,不如在努力中前进 差点忘了我还有一个博客... 秧歌、博客和AI 终于熬到了新手上路 好久没有更新博客了。。。 老妈大腿骨骨折,最近一直在医院护理 Hello, September! Ubuntu开机自动启动Docker容器运行WordPress Docker 简单快速安装部署WordPress Docker下安装MySQL 加碘盐能防核辐射的话,还怕什么核战争? shields.io 一个简洁、一致、清晰的徽章 Ubuntu下使用root登录ssh的设置 GitHub Actions 构建、部署 Next.js项目 我又用回了"IE"--edge ubuntu-22-live-server 设置固定IP Next项目部署GitHub pages的一些坑 整理了一个下午的收藏夹...... 短暂而忙碌的暑假即将谢幕 GitHub Actions 是干什么用的? 放弃Next.js重构博客:经验、教训与未来技术探索 关于Google LCP 问题:超过了2.5秒 验证已通过 仅用了几个小时就使用next.js重构博客的所有功能 关于使用Next.js重构博客构思的记录 使用Tailwind css和JavaScript实现一个简单的返回顶部功能 罗技K380 F1-F12 功能键锁定 PHILIPS猛禽SPK8404机械键盘手感真是超赞! 局域网的DNS设置192.168.0.1与8.8.8.8,114.114.114.114有什么区别? 史诗结合的浪漫:《长安三万里》 聊 聊 友 情 链 接 1767个中文博客的数据洞察:中文博主都喜欢干啥? python requests 设置读取超时时间 八月回顾:博客之路,一路前行 Docker基础学习笔记和常用命令汇总 vim常用命令整理 Ubuntu 22 安装Docker过程记录 使用python结合feedparser模块编写自己的私人RSS订阅程序 博客大数据分析:38880条博文揭示博主最爱写什么? Windows下国产杀毒软件还有选择吗?火绒安全可以一试。 export exports module.exports 这三个命令的区别是什么如何使用? 时代的变迁:从56K拨号上网到1G光纤的回忆 理工计算机专业准大学生如何选配笔记本? 使用JavaScript编写自己的私人RSS订阅程序 如何使用CSS为博客标题设置彩虹颜色? 最终还是决定使用传统的网线来解决千兆速率问题。 1300M USB双频2.4+5G无线网卡的一些常识和使用技巧 Python Gui新框架:NiceGui之初体验 pycharm 正在关闭项目(closing project)无法关闭退出程序的解决方法! 速度与优雅:博客性能优化之旅 久了,博客主题就会一直做减法 七月的焦虑 在react中使用复制插件clipboard.js react中如把HTML代码转成字符串进行渲染? react useEffect()中使用lodash库中的防抖debounce react useEffect() 为什么在开发模式的时候会执行两次? 七年之痒!别了我曾深爱的MacBookPro 前端React+Material UI开发环境的快速搭建 一键更新Github部署的静态博客 编程新手学习过程中如何更好的提问? Typed.js 一款有意思的网页打字机效果库 解决错误 ERROR [WinError 10049] 在其上下文中,该请求的地址无效。 Stable Diffusion 相关教程与模型的记录 Stable Diffusion ControlNet openpose 报错无法使用 在react或vue中使用localStorage存储数据 使用React+Vite+TailwindCSS+daisyUI打造一个简单的ToDos 碎言静态博客 聊聊Python中的装饰器 npm更换源与nrm安装与配置 pip临时修改下载源 Vue快速学习笔记(9)Vuetify配置及简单使用 Vue快速学习笔记(8)webpack4.X配置Vue开发打包环境 Vue快速学习笔记(5)使用路由vue-router(1) Vue快速学习笔记(4)Vue组件中的数据传递 Vue快速学习笔记(3)Vue的组件 Vue快速学习笔记(2)Vue中的监听与计算属性 Vue快速学习笔记(1)Vue实例基础 基于Django构建的小学生英文单词背写检测考试系统。 如何在Python程序中使用配置文件.ini(ConfigParser) 写在我的博客PV10万时:聊聊编程与画画 python3函数学习笔记简单总结 PythonINI配置文件读写的简单方法 Python open()函数文件打开、读、写操作总结 Python os.path模块中一些常用方法的整理总结 Python 采集数据三步曲之[Requests + re.py模块进行数据采集] Python 采集数据三步曲之[Requests开源协议的HTTP 库]
使用Python编写并部署个人静态博客:(三)搜集博客数据
J.sky · 2023-05-17 · via 碎言

使用Python编写并部署个人静态博客:(一)分析与设计

使用Python编写并部署个人静态博客:(二)实现静态页面的输出

使用Python编写并部署个人静态博客:(三)搜集博客数据

使用Python编写并部署个人静态博客:(四)逐步输出静态页面

使用Python编写并部署个人静态博客:(五)Python异步输出博文页面

搜集博客数据

在这里插入图片描述

博客的静态页面的生成都是由博客的基础数据支撑的,搜集博客的基本信息和博客文章数据,是生成博客静态文件的核心功能。

博客的基础配置

每个博客都会有一些最基础的配置,例如博客的名称、简介、站长的昵称头像等,我们可以把这些基础的数据设置为一个配置文件,这里我使用了JSON格式的配置文件。可以在站点的根目录下创建一个config.json,其内容格式大概如下,可以根据自己的需要添加修改。

{
    "dev": 0,
    "blog_name": "碎言博客",
    "blog_name_en": "SuiYan",
    "blog_author": "J.sky",
    "blog_description_en": "You see see you , This one day day di.",
    "blog_typed": [
        "Life is short, you need Python",
        "人生苦短,我用Python.",
        "Beautiful is better than ugly.",
        "美丽优于丑陋.",
        "Explicit is better than implicit.",
        "直白优于含蓄.",
        "Simple is better than complex.",
        "简单优于复杂.",
        "Complex is better than complicated.",
        "复杂优于繁琐.",
        "Readability counts.",
        "可读性很重要."
    ],
    "meta_description": " Python Django JavaScript 学习讨论,我们是一群热爱Python的程序员,人生苦短,我用JavaScript!一个不会JavaScript的Python开发者不是一个好网管。",
    "meta_keywords":"Python,Django,JavaScript,程序员,人生苦短,我用Python",
    "profile_image":"assets/images/avatar.jpg",
    "blog_bg": "assets/images/bg.jpg",
    "theme": "my_blog",
    "build": "blog",
    "md_dir": "articles",
    "blog_page_num":8,
    "blog_test_url":"http://127.0.0.1:5501/",
    "blog_url":"https://suiyan.cc/",
    "blog_sns": [
        {
            "ico": "github",
            "url": "https://github.com/bosichong/suiyan"
        },
        {
            "ico": "git",
            "url": "https://gitee.com/J_Sky/suiyan"
        },
        {
            "ico": "envelope",
            "url": "mailto:285911@gmail.com"
        },
        {
            "ico": "book",
            "url": "https://www.zhihu.com/people/J_sky/activities"
        },
        {
            "ico": "rss-square",
            "url": "https://suiyan.cc/rss.xml"
        }
    ],
    "nav": [
        {
            "ico": "home",
            "text": "Home",
            "url": ""
        },
        {
            "ico": "archive",
            "text": "Archive",
            "url": "archives.html"
        },
        {
            "ico": "tags",
            "text": "Tags",
            "url": "tags.html"
        },
        {
            "ico": "user-md",
            "text": "About Me",
            "url": "aboutme.html"
        },
        {
            "ico": "link",
            "text": "Links",
            "url": "links.html"
        }
    ]

}

然后就可以在程序的文件中组织这些最基础的配置,例如提取文件地址和内容,分配静态文件生成发布的目录等,使用一些常量来定他们,放到代码的最顶部。

APP_CONFIG = "config_my.json"
BASE_DIR = os.path.dirname(os.path.abspath(__file__))  # 当前目录地址
CONFIG = load_configjson(os.path.join(BASE_DIR, APP_CONFIG))  # 获取当前配置
BLOGPAGES = os.path.join(BASE_DIR, CONFIG["build"])  # 所有静态资源存放目录
ARTICLES_DIR = os.path.join(BASE_DIR, CONFIG["md_dir"])  # 博文目录
THEME = os.path.join(BASE_DIR, "theme")  # 主题目录
CONFIGJSON = os.path.join(BASE_DIR, APP_CONFIG)
BLOGCONFIG = os.path.join(BLOGPAGES, 'config.json')
BLOGDATAJSON = os.path.join(BLOGPAGES, 'blog_data.json')
SUIYANVERSION = "3.1.0"  # 程序版本

通过Python读写文件的操作,定义一个方法从磁盘上来获取config.json的内容并转化为Python的字典:

def load_configjson(jsonpath):
    """载入blog配置文件config.json"""
    config_code = loadcode(jsonpath)
    config = json.loads(config_code)
    return config

具体的代码可以查看碎言静态博客的代码仓库,这里只介绍一些项目的架构技巧。

博客文章以及其他相关数据的搜集

博客的静态文件除了基础的博客信息外,还有博客的归档、分类(标签)、博客页面的数据等,这些都需要从博客文章的Markdown文件数据集中计算得出。 这里我采用了从文章目录中搜集博客文章,读取文章头部的定义内容,组织这些数据创建一个blog.json的索引,这个索引可以用来生成归档和标签页面的内容,也可以用来作为搜索的依据。

具体通过递归扫描文章目录来生成:

def create_blogdata_json(adir):
    """
    递归获得当前目录及其子目录中所有的.md文件列表。
    并创建blog的data索引JSON
    :param adir: 文章日志所在目录
    :param bdir: 站点根目录
    :return: json字符串
    """
    data_json = []
    # 当前目录下所有的文件、子目录、子目录下的文件。
    for root, dirs, files in os.walk(adir):
        for file in files:
            # 值读取.md
            if file.endswith('.md'):
                url = os.path.join(root, file).replace(
                    adir + os.sep, '').replace('.md', '')  # 最后需要组装的相对目录
                furl = os.path.join(root, file)  # 当前文件的绝对目录
                f_data = extract_md_header(furl)  # 获取.md的文章信息转成字典
                f_data["url"] = url
                f_data["uptime"] = get_file_modification_time(os.path.join(root, file))
                data_json.append(f_data)  # 添加到需要返回的数据数组中

    data_json.sort(key=lambda x: x["time"], reverse=True)  # 对数组进行降序排序
    data_json_str = json.dumps(data_json, ensure_ascii=False)  # 转化为json字符串
    return data_json_str

有了这个文章数据之后,基本上就是解决了所有的静态博客文件生成依赖了。之后我们就可以编写代码,依次或是批量生成相关的页面了。