从2021-05-21至2024-03-21,我的CSDN博文学习笔记中,收集并展示浏览阅读,点赞收藏评论等数据,以浏览阅读量排逆序展示。
(笔记模板由python脚本于2024年03月21日 10:07:07创建,本篇笔记适合熟悉Python,对其基本数据类型字符串str、数值型(int, float)列表list、元组tuple、字典dict可以熟练应用,认识Linux获取Html文本指令crul、会使正则模块re的coder翻阅)
-
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
本文质量分:
本文地址: https://blog.csdn.net/m0_57158496/article/details/136768180
CSDN质量分查询入口:http://www.csdn.net/qc
- ◆ 学习笔记索引(all)
- 1、思路解析
- 2、笔记索引列表
- 2.1 浏览阅读量小于5000的笔记
- 2.2 浏览阅读量小于1000的笔记
- 2.3 浏览阅读量小于800的笔记
- 2.4 浏览阅读量小于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、笔记索引列表
本次共计收集 8 篇博文笔记信息,总阅读量0.98w。数据于2024年03月21日 10:07:07完成采集,用时13.27秒。
2.1 浏览阅读量小于5000的笔记
-
002
标题:聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )
(浏览阅读 3.8k )
地址:https://blog.csdn.net/m0_57158496/article/details/124539589
点赞:4 收藏:2 评论:3
摘要:聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )_屏蔽词库。
首发:2022-05-02 13:02:39
最后编辑:2022-05-21 06:10:42 -
001
标题:神奇的兔子数列——算法学习笔记
(浏览阅读 2.5k )
地址:https://blog.csdn.net/m0_57158496/article/details/127481558
摘要:这是我参加“14天阅读挑战赛”第一周第二篇点击查看“14天阅读挑战赛”详情,《趣学算法第二版》1.4 神奇的兔子数列。
首发:2022-10-23 22:46:00
最后编辑:2022-10-23 23:04:53
2.2 浏览阅读量小于1000的笔记
-
003
标题:练习:任意多行字条串拆分数值求和&冒泡排序&两数的最大公约数和最大公倍数
(浏览阅读 932 )
地址:https://blog.csdn.net/m0_57158496/article/details/121585855
摘要:CSDN2021-11-27“每日一练”。 -
002
标题:CSDN博文中的灰白背景文字块叫“引用”
(浏览阅读 930 )
地址:https://blog.csdn.net/m0_57158496/article/details/123265876
评论:8
摘要:CSDN博文中的灰白背景文字块_csdn灰块。
首发:2022-03-03 22:40:19
最后编辑:2022-03-31 16:07:29 -
001
标题:X 进制转十进制黄金万能算法
(浏览阅读 818 )
地址:https://blog.csdn.net/m0_57158496/article/details/130168776
点赞:4 收藏:3 评论:4
摘要:单纯、混合进制能吃,真正的黄金万能转换。
首发:2023-04-15 13:16:57
最后编辑:2023-04-30 12:00:43
2.3 浏览阅读量小于800的笔记
- 001
标题:Python 异常类型捕获( try … except 用法浅析)——Don‘t bare except (不要让 except 裸奔)
(浏览阅读 501 )
地址:https://blog.csdn.net/m0_57158496/article/details/130997686
摘要:不要让 except 裸奔。
首发:2023-06-01 23:04:07
最后编辑:2023-07-06 19:25:30
2.4 浏览阅读量小于300的笔记
-
002
标题:类属性修改(为什么python类不具备被赋值能力?)
(浏览阅读 164 )
地址:https://blog.csdn.net/m0_57158496/article/details/134417589
摘要:为什么python类不具备被赋值能力?,用魔术方法收集实参,在类中可以定义方法处理实际参数,实现对类“赋值”。
首发:2023-11-15 13:04:46
最后编辑:2023-11-15 14:04:10 -
001
标题:数学王国找寻另一半:求一个整数的真因子总和,算法优化解决方案超时问题
(浏览阅读 149 )
地址:https://blog.csdn.net/m0_57158496/article/details/133635207
评论:1
摘要:数学王国找寻另一半,求一个整数的真因子总和。
首发:2023-10-07 12:22:57
最后编辑:2023-10-07 14:01:07
3、完整源码(Python)
(源码较长,点此跳过源码)
#!/sur/bin/nve python
# coding: utf-8
from traceback import format_exc # 加载异常源码追踪(traceback.format_exc)方法。
from time import localtime
from os import system
from re import findall
from random import sample
myDataPath = '/sdcard/Documents/csdn/' # 数据路径。
myUrlRoot = 'https://blog.csdn.net/m0_57158496/article/details/' # 笔记id前缀。
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]])]) # 字符串格式化当前日期时间(中文年月日,英文时分秒)。
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]
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}") # 获取页面文本并存入文本文件。
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 list('!……——')+['U3000', '目 录', ' ', ' ']:
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>于 ([\d\s\-:]+) 首次发布</span></div>', textHtml))
reeditTime = ''.join(findall(r'<span class="time">已于 ([\s\d\-:]+) 修改</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() # 打印空行。
for i in ids: # 数据清洗。
tipRuning() # 正在提取阅读量排序操作提示打印。
articleInfo = {k: v for k,v in getReaded(f"{i[0]}") if v and v != '0'} # 剔除空值数据项,生成博文笔记浏览阅读等信息字典。articleInfo
if not articleInfo.get('摘要') and i[1] != articleInfo['标题']:
articleInfo['摘要'] = i[1]
if articleInfo['浏览阅读']: # 提取“浏览阅读”数据不为空,收集数据。
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} " if thumbsUp else ''
collect = d.get('收藏', '')
collect = f"收藏:{collect} " 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>  {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>目 录</b></font></center>\n\n@[TOC]( )\n\n<hr>\n\n# ◆ {title}\n\n<br>\n\n## 1、思路解析\n\n<br>\n\n  我用Linux的curl指令获取HTML5页面源文本,用$Python$的re模块从中提取数据,按阅读浏览量逆序展示我的CSDN博文笔记“点赞收藏评论”的数量及笔记摘要等信息。\n\n<font color=#4F999F size=4>  在我的“1024纪念日”之际,经过部分代码“重构”优化,完成了我的“<b>CSDN博文笔记总索引</b>”的2024版本蜕变。</font><sub><font color='gray'>(查看2023版本的样子请点击[这里](https://blog.csdn.net/m0_57158496/article/details/129728550)跳转)</font></sub>\n\n  本笔记的$MarkDown$文本源码,是由Python脚本`csdn_myBlogReadedSort.py`自动生成的。只要固化好脚本,以后需要更新本笔记数据,只需键入`python csdn_myBlogReadedSort.py`指令就可以了,将代码输出的文本粘贴到本笔记编辑框覆盖原有源码文本就可以了。\n\n<br>\n\n- `脚本运行指令截屏图片`\n![在这里插入图片描述](https://img-blog.csdnimg.cn/3c23b21c9f9643c780708105e50aab51.jpg =260x)\n![在这里插入图片描述](https://img-blog.csdnimg.cn/20f7784a5e9e44eca56e539fc79f6733.jpg =260x)\n\n{goContents}\n\n## 2、笔记索引列表\n\n<br>\n\n  {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上一篇: \n<a href='{lastBlogUrl}' target='_blank'>{lastBlogTitle}</a><font color='gray'><sub>({lastBlogSummary})</sub></font><br>\n下一篇: \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<br>\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的文本输出。 '''
print(f"\n{strDate():~^39}\n")
n = int(input('\nHotBlog基数:'))
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 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
- 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
- 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
- 靠谱程序员的好习惯
- 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归
CSDN实用技巧博文:
- 8个好用到爆的Python实用技巧
- python忽略警告
- Python代码编写规范
- Python的docstring规范(说明文档的规范写法)