Bootstrap

CSDN学习笔记总索引(2024)——我的创作纪念日(1024)

从2021-05-21至2024-03-22,我的CSDN博文学习笔记中,收集并展示浏览阅读,点赞收藏评论等数据,以浏览阅读量排逆序展示。


(笔记模板由python脚本于2024年03月22日 00:50:22创建,本篇笔记适合熟悉Python,对其基本数据类型字符串str、数值型(int, float)列表list、元组tuple、字典dict可以熟练应用,认识Linux获取Html文本指令crul、会使正则模块re的coder翻阅)


【学习的细节是欢悦的历程】


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……


2021-05-21至2024-03-22
学习笔记索引(all)
(收集并展示浏览阅读,点赞收藏评论等数据)


本文质量分:

96 96 96

本文地址: https://blog.csdn.net/m0_57158496/article/details/136768180

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ 学习笔记索引(all)
    • 1、思路解析
    • 2、笔记索引列表
      • 2.1 浏览阅读量小于10000的笔记
      • 2.2 浏览阅读量小于8000的笔记
      • 2.3 浏览阅读量小于6000的笔记
      • 2.4 浏览阅读量小于5000的笔记
      • 2.5 浏览阅读量小于2000的笔记
      • 2.6 浏览阅读量小于1000的笔记
      • 2.7 浏览阅读量小于800的笔记
      • 2.8 浏览阅读量小于500的笔记
      • 2.9 浏览阅读量小于300的笔记
    • 3、完整源码(Python)


◆ 学习笔记索引(all)


1、思路解析


  我用Linux的curl指令获取HTML5页面源文本,用 P y t h o n Python Python的re模块从中提取数据,按阅读浏览量逆序展示我的CSDN博文笔记“点赞收藏评论”的数量及笔记摘要等信息。

  在我的“1024纪念日”之际,经过部分代码“重构”优化,完成了我的“CSDN博文笔记总索引”的2024版本蜕变。(查看2023版本的样子请点击这里跳转)

  本笔记的 M a r k D o w n MarkDown MarkDown文本源码,是由Python脚本csdn_myBlogReadedSort.py自动生成的。只要固化好脚本,以后需要更新本笔记数据,只需键入python csdn_myBlogReadedSort.py指令就可以了,将代码输出的文本粘贴到本笔记编辑框覆盖原有源码文本就可以了。


  • 脚本运行指令截屏图片
    在这里插入图片描述
    在这里插入图片描述



回页目录


2、笔记索引列表


  本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。

2.1 浏览阅读量小于10000的笔记



回页目录


2.2 浏览阅读量小于8000的笔记



回页目录


2.3 浏览阅读量小于6000的笔记



回页目录


2.4 浏览阅读量小于5000的笔记



回页目录


2.5 浏览阅读量小于2000的笔记



回页目录


2.6 浏览阅读量小于1000的笔记



回页目录


2.7 浏览阅读量小于800的笔记



回页目录


2.8 浏览阅读量小于500的笔记



回页目录


2.9 浏览阅读量小于300的笔记



回页目录


3、完整源码(Python)

(源码较长,点此跳过源码)

#!/sur/bin/nve python
# coding: utf-8
from traceback import format_exc # 加载异常源码追踪(traceback.format_exc)方法,获取异常提示字符串模式输出。
from time import localtime # 加载time.lacktime方法获取当前时间数据数组。
from os import system # 加载python的“Linux指令运行器”os.system。
from re import findall # 加载re.findall方法获取re通配表达式匹配字符串。
from random import sample # 加载随机取样方法。

    
myDataPath = '/sdcard/Documents/csdn/' # 数据路径。
myUrlRoot = 'https://blog.csdn.net/m0_57158496/article/details/' # 笔记url前缀。
timeStamp = lambda: ''.join([f"{i:0>2}" for i in localtime()[2:6]]) # 时间戳(日时分秒)。
strDate = lambda x=localtime(): ' '.join([f"{x[0]}{x[1]:0>2}{x[2]:0>2}日", ':'.join([f'{i:0>2}' for i in localtime()[3:6]])]) # 字符串格式化当前日期时间(xxxx年xx月xx日 xx:xx:xx)。


def tipRuning() -> None:
    ''' “程序正在运算……”提示函数 '''
    from time import time
    k = int(str(time())[-2:])%26
    print(' '*40, end='\r')
    print(f"{' '*k}{'程序正在运算……'}", end='\r')


def getIds() -> list:
    ''' 获取博文id总列表 '''
    textId = []
    
    for year in range(2021, localtime()[0]+1): # 多个文本循环读取博文笔记id。
        with open(f"{myDataPath}csdn_{year}_publishFootprint.txt") as f:
            textId += f.read().split('\n')[2:] # 去除文本前两行字段字符串。
        
    ids = [(i.split('\\')[2], i.split('\\')[-2]) for i in textId] # 取文本数据中的“ID”和“摘要”。
    print(f"\n{f' 已收集到{len(ids)}条博文笔记id ':.^33}\n")
    return ids
    

def getReaded(Id: str) -> zip:
    ''' 获取博文阅读量等数据 '''
    filename = f"{myDataPath}temp/tempHtmlText.txt"
    system(f"curl -s {myUrlRoot}{Id} > {filename}") # Linux指令curl获取页面文本并存入磁盘文本文件。

    with open(filename) as f:
        textHtml = f.read().split('<li class="tool-item tool-item-bar">')[0] # 读取页面超文本,并截取数据文本,加快数据提取速度。

    fields = '浏览阅读', '标题', 'ID', '作者', '点赞', '收藏', '评论', '摘要', '首次发布', '最后编辑'
    author = findall(r' var nickName = "(.+)";', textHtml) # 摘取作者。

    if not author: # 提取博文笔记作者为空。
        print(f"\n“{myUrlRoot}{Id}”\n{'地址可能有误!':~^35}")
        input(f"\nAuthor: {author}")
        return zip(fields, ['']*len(fields))
    else:
        author = author[0]
        	
    articleTitle = findall(r'var articleTitle = "(.+)";', textHtml)[0] # 摘取文章标题。
    articleReaded = findall(r'<meta name="description" content="(.*)">', textHtml)[0] # 截取包含“浏览阅读、点赞、收藏、评论、摘要”数据的文本字符串。
    
    for i in ['!', '……', 'U3000', '目 录', '  '*2]:
        articleReaded = articleReaded.replace(i, '。') # 替换句末符号为“。”。
    articleReaded, abstract = articleReaded.split('。')[:2] # 摘取含有阅读量、点赞和收藏、文章摘要的文本。    
    
    for i in ['我的CSDN主页', 'Python 官网', '2021年「博客之星」评选开始投票开启']: # 过滤无效摘要。
        if i in abstract:
            abstract = '' # 摘要如果含无效字符,令摘要为空。
            break 
    abstract = abstract.strip() # 去除摘要前后空格。
    articleReaded = findall(r'[\d\.kw]+', articleReaded) # 摘取阅读量、点赞和收藏数据。
    readedLong = len(articleReaded) # len函数获取数据长度。    
    match readedLong: # 数据赋值。
        case 0:
            print(f"\n“{myUrlRoot}{Id}”\n{'地址可能有误!':~^35}")
            input(f"\n数据:{articleReaded}")
            return zip(fields, ['']*len(fields))
        case 2:
            readed = articleReaded[0]
            thumbsUp = articleReaded[-1]
            collect = 0
        case 1:
            readed = articleReaded[0]
            thumbsUp, collect = 0, 0
        case 2:
            readed = articleReaded[0]
            thumbsUp = articleReaded[-1]
            collect = 0
        case 3:
            readed = articleReaded[0]
            thumbsUp = articleReaded[1]
            collect = articleReaded[-1]

    readed = int(float(readed[:-1])*1000) if readed[-1] == 'k' else int(float(readed[:-1])*10000) if readed[-1] == 'w' else int(readed) # 三元操作语句嵌套还原阅读量为整型。
    comments = findall(r'<span class="count">\n\s*([\d\.kw]*)\n\s*</span>\n\s*</a>\n\s*<div class="tool-hover-tip"><span class="text space">评论</span></div>', textHtml)[0]
    firstEditTime = ''.join(findall(r'<div class="up-time"><span>于&nbsp;([\d\s\-:]+)&nbsp;首次发布</span></div>', textHtml))
    reeditTime = ''.join(findall(r'<span class="time">已于&nbsp;([\s\d\-:]+)&nbsp;修改</span>', textHtml))
    datas = readed, articleTitle, Id, author, thumbsUp, collect, comments, abstract, firstEditTime, reeditTime
    return zip(fields, datas)


def readSort():
    ''' 阅读量排序列表 '''
    from time import time 
    start = time()
    ids = getIds()
    yes = input(f"\n{'':>12}程序调试?(Y)_").strip().upper()
    ids = sample(ids, k=8) if yes == 'Y' else ids # 随机取样8个id,调试代码。
    readeds = []

    print(f"\n\n{'':~^40}\n") # 打印空行。
    for i in ids: # 数据清洗。
        tipRuning() # 正在提取阅读量排序操作提示打印。
        articleInfo = {k: v for k,v in getReaded(f"{i[0]}") if v and v != '0'} # 剔除空值数据项,生成博文笔记浏览阅读等信息字典。
        if not articleInfo:
            continue # 数据全为空,跳过。

        if not articleInfo.get('摘要') and i[1] != articleInfo.get('标题'):
            articleInfo['摘要'] = i[1]
        
        if articleInfo.get('浏览阅读'): # 提取“浏览阅读”数据不为空,收集数据。
            readeds += [articleInfo]

    readeds.sort(reverse=True, key=lambda x: x['浏览阅读']) # 按浏览阅读排降序。
    #print('\n\n'.join(map(str, readeds))) # 数据字典直接终端屏幕打印。
    S = time() - start # 计算提取博文笔记阅读量排序操作用时。
    S = f"{S//60:.0f}{S%60:.2f}秒" if S > 60 else f"{S%60:.2f}秒" # 格式化用时用时数据。
    return readeds, f"本次共计收集 {len(readeds)} 篇博文笔记信息,总阅读量{sum([i.get('浏览阅读') for i in readeds])/10000:.2f}w。数据于{strDate()}完成采集,用时{S}。"


def strDict(articleInfo: dict) -> str:
    ''' 格式化文章阅读量信息 '''
    d = articleInfo #* *数据字典别名,缩短代码行。
    readed = d.get('浏览阅读')
    
    if readed >= 10000:
        color = 'gold'
        size = 5
    elif 8000 <= readed < 10000:
        color = 'purple'
        size = 4
    elif 6000 <= readed < 8000:
        color = 'scarlet'
        size = 4
    elif 5000 <= readed < 6000:
        color = 'red'
        size = 3
    elif 4000 <= readed < 5000:
        color = 'orange'
        size = 3
    elif 2000 <= readed < 4000:
        color = 'green'
        size = 3
    elif 1000 <= readed < 2000:
        color = 'cyan'
        size = 3
    elif 500 <= readed < 1000:
        color = 'blue'
        size = 3
    elif 100 <= readed < 500:
        color = 'black'
        size = 2
    else:
        color = 'gray'
        size = 2

    readed = f"{readed/10000}w" if readed >= 10000 else f"{readed/1000}k" if 1000 <= readed < 10000 else readed # 格式化千万浏览阅读量数值。
    url = f"{myUrlRoot}{d.get('ID')}"    
    thumbsUp = d.get('点赞', '')
    thumbsUp = f"点赞:{thumbsUp}&emsp;" if thumbsUp else ''
    collect = d.get('收藏', '')
    collect = f"收藏:{collect}&emsp;" if collect else ''
    comment = d.get('评论', '')
    comment = f"评论:{comment}" if comment else ''
    thumbsUps = f"\n{''.join([thumbsUp, collect, comment])}" if thumbsUp or collect or comment else '' 
    abstract = d.get('摘要', '')
    abstract = f"\n摘要:{abstract}。" if abstract else ''
    editTime = f"\n首发:{d.get('首次发布')}\n最后编辑:{d.get('最后编辑')}" if d.get('首次发布') else ''
    return f"标题:<a href='{url}' target=_blank>{d.get('标题')}</a>\n<sub>(浏览阅读 <font color='{color}' size={size}>{readed}</font> )</sub>\n地址:<a href='{url}' target=_blank>{url}</a><font color='gray' size=2>{thumbsUps}{abstract}{editTime}</font>"


def writeHot(readeds: list, filename: str, n: int) -> None:
    ''' 写“我的热博” '''
    hots = [i for i in readeds[0] if i.get('浏览阅读') >= n] # 解析“热博”数据。
    n = n if n < 1000 else f"{n/1000:.2f}k" if n < 10000 else f"{n/10000:.2f}w" # 格式化int。
    
    with open(filename, 'w') as f:
        f.write(f"\n<div id='mybolg'></div>\n\n我的<mark><i><font color=#4F999F>HOT</font></i></mark>博:\n<br><font color='gray' size=2>&emsp;&emsp;{readeds[1]}阅读量不小于<b>{n}</b>的有${len(hots)}$篇。</font>\n<br>")
        
        for k,i in enumerate(hots):
            f.write(f"\n\n- {k+1:0>3}\n{strDict(i)}")

        f.write(f"\n\n<hr>\n\n<center><font size=3 color='gray'>推荐条件</font><i><mark><font color=#4F999F size=4>阅读量突破<b>{n}</b></font></mark></i></center>\n\n<center><font color='gray' size=2>(<a href='https://blog.csdn.net/m0_57158496/article/details/136768180' target='_blank'>更多热博</a>,请点击蓝色文字跳转翻阅)</font></center>\n")


def writer(readeds, sortedName):
    ''' 将排序后的浏览阅读数据写入HTML5文本 '''
    reader = '熟悉Python,对其基本数据类型字符串str、数值型(int, float)列表list、元组tuple、字典dict可以熟练应用,认识Linux获取Html文本指令crul、会使正则模块re'
    title = '学习笔记索引(all)'
    t = localtime() # 获取当前时间九位数组。
    title1 = f"2021-05-21至{'-'.join([f'{i:0>2}' for i in t[:3]])}"
    title2 = '收集并展示浏览阅读,点赞收藏评论等数据'
    headModel = f"从{title1},我的CSDN博文学习笔记中,{title2},以浏览阅读量排逆序展示。\n<div id='top'></div>\n<hr>\n\n<font color='gray' size=2>(笔记模板由python脚本于{strDate()}创建,本篇笔记适合<font color=#4F999F>{reader}</font>的coder翻阅)\n\n{open(f'{myDataPath}csdn_blogHead.txt').read()}\n\n<hr><hr>\n<center><font color='gray' size=2></font>{title1}</center>\n<center><b><font color=#4F999F size=5>{title}</font></b></center>\n<center><font color='gray' size=2>({title2})</font></center>\n\n<hr><hr>\n\n本文质量分:<center><font color=#4F999F size=5>【 <b>$96$</b> 】</font></center>\n本文地址:<a href='https://blog.csdn.net/m0_57158496/article/details/136768180'>https://blog.csdn.net/m0_57158496/article/details/136768180</a>\n\nCSDN质量分查询入口:<a href='http://www.csdn.net/qc'>http://www.csdn.net/qc</a></center>"
    goContents = "\n\n<br><hr>\n<center><a href='#contents'>回页目录</a></center>\n<hr><br>"
    bodyFirst = f"\n\n<hr>\n\n<div id='contents'></div>\n\n<center><font color=#4F999F size=5><b>目&emsp;录</b></font></center>\n\n@[TOC]( )\n\n<hr>\n\n# ◆&ensp;{title}\n\n<br>\n\n## 1、思路解析\n\n<br>\n\n&emsp;&emsp;我用Linux的curl指令获取HTML5页面源文本,用$Python$的re模块从中提取数据,按阅读浏览量逆序展示我的CSDN博文笔记“点赞收藏评论”的数量及笔记摘要等信息。\n\n<font color=#4F999F size=4>&emsp;&emsp;在我的“1024纪念日”之际,经过部分代码“重构”优化,完成了我的“<b>CSDN博文笔记总索引</b>”的2024版本蜕变。</font><sub><font color='gray'>(查看2023版本的样子请点击[这里](https://blog.csdn.net/m0_57158496/article/details/129728550)跳转)</font></sub>\n\n&emsp;&emsp;本笔记的$MarkDown$文本源码,是由Python脚本`csdn_myBlogReadedSort.py`自动生成的。只要固化好脚本,以后需要更新本笔记数据,只需键入`python csdn_myBlogReadedSort.py`指令就可以了,将代码输出的文本粘贴到本笔记编辑框覆盖原有源码文本就可以了。\n\n<br>\n\n- `脚本运行指令截屏图片`\n![在这里插入图片描述](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuLzNjMjNiMjFjOWY5NjQzYzc4MDcwODEwNWU1MGFhYjUxLmpwZw%3D%3D =260x)\n![在这里插入图片描述](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuLzIwZjc3ODRhNWU5ZTQ0ZWNhNTZlNTM5ZmM3OWY2NzMzLmpwZw%3D%3D =260x)\n\n{goContents}\n\n## 2、笔记索引列表\n\n<br>\n\n&emsp;&emsp;{readeds[1]}"
    bodyEnd = f"\n\n## 3、完整源码(Python)\n\n<font color='gray' size=2>(源码较长,<a href=\#codes_end>点此</a>跳过源码)</font>\n\n~~~python\n{open(f'{myDataPath}csdn_myBlogReadedSort.py').read()}\n\n~~~\n\n<div id='codes_end'></div>"

    lastBlogTitle, address, lastBlogSummary = open(f'{myDataPath}csdn_{localtime()[0]}_publishFootprint.txt').read().split('\n')[2:3][0].split('\\')[1:4] # 解析上篇博文标题、地址、内容摘要。
    lastBlogUrl = f"{myUrlRoot}{address}"
    tailModel =  f"\n\n<br><hr>\n<center><a href='#top'>回页首</a></center>\n<hr><br>\n\n<font color='red'>\n上一篇:&ensp;\n<a href='{lastBlogUrl}' target='_blank'>{lastBlogTitle}</a><font color='gray'><sub>({lastBlogSummary})</sub></font><br>\n下一篇:&ensp;\n</font>\n\n<br><hr>\n\n{open(f'{myDataPath}csdn_blogTail.txt').read()}\n"

    with open(sortedName, 'w') as f:
        f.write(f"{headModel}{bodyFirst}")
        
        # 分段打印索引列表 #
        levelReadeds = lambda x: [i for i in readeds[0] if x[0] <= i.get('浏览阅读') < x[1]] # 解析“分段”数据。

        def levelWrite(a, b, k):
            levels = levelReadeds((a, b))
            if levels:
                n = len(levels)
            else:
                return
            
            f.write(f"\n\n ### <font color='gray' size=2>2.{k} 浏览阅读量小于{b}的笔记</font>")
            for i in levels:
                f.write(f"\n\n- {n:0>3}\n{strDict(i)}")
                n -= 1 # 序号递减。
            
            return True

        levelFields = 10000, 8000, 6000, 5000, 2000, 1000, 800, 500, 300, 100, 0
        k = 1 # 分段打印序号初值
        for i in range(len(levelFields)-1):
            flag = levelWrite(levelFields[i+1], levelFields[i], k) # 分段打印。
            if flag:
                f.write(goContents) # 打印跳转目录“按钮”。
                k += 1 # 分段打印序号递增。
        
        f.write(f"{bodyEnd}{tailModel}")


def main():
    ''' 我的csdn博文被阅读量排序主函数,完成hotBlog和readedSort的Markdown源文本输出。 '''
    print(f"\n{strDate():~^39}\n") # 打印当前时间。
    n = input('\nHotBlog基数:').strip()
    n = int(n) if n else 6000 # 直接回车,n默认6000。
    readeds = readSort() # 调用自定义模块获取博文笔记阅读量排逆序后数据列表。
    hotName = f"/sdcard/Documents/csdn/temp/csdn_{timeStamp()}_myHotBlog.txt"
    sortedName = f"/sdcard/Documents/csdn/temp/csdn_{timeStamp()}_myBlogSorted.txt"
    print(readeds[1]) # 打印本次提取博文笔记阅读量排序情况。

    try:
        writeHot(readeds, hotName, n)
        print(f"\n{f' 我的热博文本{hotName}已保存。 ':~^22}\n")
        system(f"ls -l {hotName}")
        writer(readeds, sortedName)
        print(f"\n{f' 我的博文笔记排序文本{sortedName}已保存。 ':~^22}\n")
        system(f"ls -l {sortedName}")
    except Exception as error:
        print(f"\n错误类型:\n{error}\n异常代码:{format_exc()}")

    print(f"\n{strDate():~^39}\n") # 打印操作完成时间。


if __name__ == '__main__':
    main() # 主程序调用。



回页首


上一篇:  CSDN学习笔记总索引(2024)(从2021-05-21起,截止今天的CSDN学习笔记总索引,以浏览阅读量排逆序展示)
下一篇: 




  • 截屏图片
    在这里插入图片描述
      (此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)



回页首


老齐漫画头像

精品文章:

来源:老齐教室


Python 入门指南【Python 3.6.3】


好文力荐:


CSDN实用技巧博文:


悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;