Python 代码打造小 AI ,获取笔记信息,自动阅读量降序编排索引列表,生成 HTML5 源码文本。
-
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
本文质量分:
CSDN质量分查询入口:http://www.csdn.net/qc
- ◆罗列博文笔记总索引列表
- 1、久留心中的想法
- 2、“自动”的署光
- 3、“ AI ”算法
- 4、代码流程
- 4.1 笔记 ID 准备
- 4.2 摘取笔记信息
- 4.3 数据结构
- 4.4 程序功用
- 4.4.1 默认更新“我的HOT博”
- 4.4.2 双线“并发”
- 4.4.3 阅读量分级
- 4.5 格式化笔记信息
- 4.6 套用“笔记模板”
- 5、效果截屏
- 6、完整源码
◆罗列博文笔记总索引列表
1、久留心中的想法
当在 CSDN 记录学习 Python 点滴,已成习惯时,总时不时关注其阅读量等信息。特别是在有了些阅读量的时候,更是每天都要关注,以此找些“存在感”,且达到乐此不疲的地步。PC 端有阅读量排序页面,但 app 目前没有,而我又是多用 app 的,因而时常感到有些“不适”。🤨
当我的 CSDN 笔记,有了“模板”之后,就在文末拼上了阅读量过千(现在改为过 3k 了)的博文笔记索引列表。信息采集、排序以及页面源码,都是手动 CV 或键盘敲打,实在难搞。“数据来源”就是 PC 端的笔记阅读量排序页面,眼盯手写,完全刀耕火种。😂
一直心想要“自动”。——这几乎成了我久久不散的心结。😜
2、“自动”的署光
当学到了 Linux 下的指令 curl 可以获取博文笔记源码文本时,看到了“自动”胜利在望的署光。😋
当我可以用 re.findall 方法剥离出笔记的阅读量、点赞、踩、收藏、打赏、评论等数据时(可以点按蓝色文字跳转,翻阅笔记),我想要的“自动”已经呼之欲出,初现端倪。😜
获取到的博文阅读量等信息格式化输出效果
(您可以跳转移步学习笔记了解更多)
3、“ AI ”算法
-
笔记 ID 准备
读取保存在本地磁盘的 csv 文本,解析出所有笔记的 ID 列表。 -
摘取笔记信息
遍历轮询 ID 列表,用 curl 指令拉取笔记页面源码文本, re.fall 方法剥离数据。 -
数据结构
我采用以字典 dict 的方式来存储采集到的笔记信息,阅读量为 key ,其余信息 info 为 value 。 -
格式化笔记信息
用 dict.keys() 方法取得阅读量列表 reads ,reads.sort(reserse=True) 方法对选取的阅读量列表排降序,遍历轮询 reads ,插值字符串格式化把笔记信息排列成自己想要的样子,用 HTML5 源码“模板”写入文本。 -
套用“笔记模板”
代码读入我的笔记头部 head 、body (笔记主体 body 就是一个超级“插值字符串格式化字符串”,她会把想说的变量所批对象,“插入”到模板指定的预设位置)、tail ,拼接成为“我的博文笔记总索引”笔记全篇源码文本。
“我的博文笔记总索引”笔记生成过程全程“自动”,可惜最后一步,我无能力调用手机剪贴板,还需手动 CV 文本发布笔记。
4、代码流程
通用模块和变量
# 本“工程”通用模块加载:
from os import system # 加载Python之Linux命令容器方法。
from re import findall # 加载正则表达式提取方法
from time import localtime # 加载当前系统时间“九”数组获取方法。
from time import time # 加载当前系统时间秒获取方法。# 通用路径:
mydata_path = '/sdcard/Documents/' # 本“项目”存储文件路径,可据实更改。
mycsdn_path = 'https://blog.csdn.net/m0_57158496/article/details/' # 我的CSDN博文笔记路径
4.1 笔记 ID 准备
↑↑↑ 磁盘存储的笔记 ID 文本及 csv 文本结构↑↑↑
读取保存在本地磁盘的 csv 文本,解析出所有笔记的 ID 列表。
ID 列表准备
year = localtime()[0] # 取当前时间年份整数。article_infos = {} # 笔记信息字典,以“阅读量”为key。ids = [] # 笔记ID列表。for year in range(21, year%100 + 1): # 读取CSDN博文笔记ID。从2021年起,依次读入已发csdn博文笔记ID存储csv,直到当年。ids += read_blogid(f"{mydata_path}CSDN笔记发布足迹20{year}.txt") # 模板生成保存CSDN笔记IDcsv文档名,并调用函数读取博文笔记ID。
读取 id 函数
def read_blogid(filename):''' 从文件读取博文地址 '''with open(filename) as f:return [line.split('\\')[2] for line in f.read().split('\n')[1:] if len(line.split('\\')) > 2]
4.2 摘取笔记信息
遍历轮询 ID 列表,用 curl 指令拉取笔记页面源码文本, re.fall 方法剥离数据。
拉取页面源码文本,并返回调用函数抽取的博文笔记阅读量等信息
def get_data(url):''' os.system('curl...')获取CSDN博文内容页面源码并提取数据 '''system(f"curl {url} > {mydata_path}csdn_get_bloghtml.txt") # 获取博文源码并保存到磁盘。with open(f'{mydata_path}csdn_get_bloghtml.txt') as f: # 读取保存的博文页面源码文本。text_html = f.read().split('<li class="tool-item tool-item-bar">')[0]if not html_error(text_html): # 获取博文页面源码错误,返回空白字符''。return # 拉取页面源码异常,返回空值 None 。return get_article_info(text_html) # 调用函数,从博文源码提取信息并返回提取到的博文笔记信息。
摘取博文笔记阅读量等信息函数
def get_article_info(blog):''' re.findall方法提取各项信息,返回各项信息格式化字符串元组 '''title = ''.join(findall(r'var articleTitle = "([\u2003 \S]+)"', blog)) # 提取标题。#articleDesc = ''.join(findall(r'var articleDesc = "([\u2003 \S]+)"', blog)).split('。')[0] # 提取摘要。read = ''.join(findall(r'<span class="read-count">(\d+)</span>', blog)).strip() # 提取阅读量。active = findall(r'(\d*)\s*</span>\s*</a>\s*<div class="tool-hover-tip', blog) # 提取“点赞、踩、打赏、收藏、评论”数。active = tuple(map(lambda x: f"{x[0]}:{x[1]}" if x[1] else f"{x[0]}:0", zip(('点赞', ' 踩 ', '收藏', '打赏', '评论'), active))) # “格式化”博文的点赞、踩、收藏、打赏、评论数据的“输出样式”。first = ''.join([''.join(i) for i in findall(r'>于 ([\S\s]+) \w*发布</span>', blog)]) # 提取首发时间。late = ''.join([''.join(i) for i in findall(r'<span class="time">\w+ ([\S\s]+) 修改</span>', blog)]) # 提取最后修改时间。if first and late: # 如有修改:拼接博文首发、最后编辑时间信息。edit = f"于 {first} 首发,最晚于 {late} 修改。"elif first and not late: # 不曾修改编辑过。edit = f"于 {first} 发布。"else:edit = '' # 如果提取不到时间信息,“编辑信息”字符串置空。return read, title, active, edit # 返回提取的信息数据元组。
4.3 数据结构
我采用以字典 dict 的方式来存储采集到的笔记信息,阅读量为 key ,其余信息 info 为 value 。
article_infos 博文笔记阅读量等信息字典打造代码
for myid in ids: # 遍历ID。print(myid)info = get_data(f"{mycsdn_path}{myid}") # 模板还原博文笔记地址url,调用函数获取博文笔记网页源码,并为您满星了哦哦,提取博文笔记信息。if info: # 阅读量信息不为空,以阅读量为key存入博文阅读量信息字典article-infos。info = list(info)info.insert(1, myid)article_infos[int(info[0])] = info[1:]else:input(f"\n{f'ID“{myid}”有误!':~^47}\n")continue # 提取博文笔记信息为空,继续下一轮遍历。
4.4 程序功用
代码“功用”采用双线——写入文本和打印屏蔽交替进行,也也算是“并行”操作了吧。😄
在默认的情况下,会先行更新“我的HOT博”(阅读量不小于 3k 的博文笔记索引列表),再生成“总索引”源码文本。
4.4.1 默认更新“我的HOT博”
默认输出全部博文笔记索引,即阅读量不小于 0 的博文笔记。
- 默认 n = 0
if __name__ == '__main__':while True: # 循环输入,直到正确输入。n = input(f"\n生成阅读量不小于n的博文笔记索引链接:\n{'':~^50}{'':>18}n = ").strip()if not n: # 默认不输入就输出全部处理的博文笔记。n = 0breaktry: # 输入排错。n = int(n)breakexcept Exception as error:print(f"\nErrorType:\n{error}\n{'':~^50}\n{'输入错误!请重新输入。':^39}\n{'':~^50}\n")print(f"\n我的所有CSDN笔记阅读量列表:\n{get_blogread(n)}\n") # 调用主程序,自动处理我的博文笔记。
- 默认更新热博,当 n != 0 ,提示更新
if n: # 当 n = 0 ,即全部列印时,自动更新“我的热博”;反则“询问”更新。if input(f"\n{'':>8}排序热博?(Y/N) ") in list('Yy'):write_bolgindex(reads, article_infos, start_s, 3000) # 写入热博排序。else:write_bolgindex(reads, article_infos, start_s, 3000) # 写入热博排序。
4.4.2 双线“并发”
同时将 HTML5 源码文本写入文本,博文笔记阅读量等信息格式化输出到屏幕。
with open(filename, 'w') as f:for read in reads:myid, title, active, edit = article_infos.get(read) # 博文笔记信息赋值,方便后续格式化输出。print(f"阅读量:{read}\nID:{myid}\n标题:{title}\n{' '.join(active)}\n{edit}\n\n") # 打印到屏幕。f.write(f"\n<li><a href='{mycsdn_path}{myid}' target=_blank>{title}</a><br>{read}<br><font color='gray' size=2>博文地址:<a href='{mycsdn_path}{myid}' target=_blank>{mycsdn_path}{myid}</a><br/>{'  '.join(active)}<br>本篇博文笔记{edit}</font></li>") # 写入博文笔记索引(源码)。
4.4.3 阅读量分级
设置阅读量等级菜单,用不同颜色标注博文笔记的阅读量。
- 分级标签打印代码
w_flag = th8_flag = th5_flag = th3_flag = th_flag = hun5_flag = True # 写入博文笔记索引列表分段标签开关“开”。for read in reads:flag_write = lambda x: f.write(f"\n</ol>\n<br />\n\n### <font color='gray' size=2><font color=#4F999F>◆</font> 阅读量小于<font color=#4F999F> {x} </font>的博文笔记<a href=#catalog>(回目录)</a></font>\n\n<ol reversed=reversed>")if not n:if 8000 < read < 10000 and w_flag and max_read > 10000:flag_write('1w')w_flag = False # 写入博文笔记索引列表分段标签开关“关”。elif 5000 < read < 8000 and th8_flag and max_read > 8000:flag_write(8000)th8_flag = Falseelif 3000 < read < 5000 and th5_flag and max_read > 5000:flag_write(5000)th5_flag = Falseelif 1000 < read < 3000 and th3_flag and max_read > 3000:flag_write(3000)th3_flag = Falseelif 500 < read < 1000 and th_flag and max_read > 1000:flag_write(1000)th_flag = Falseelif read < 500 and hun5_flag and max_read > 500:flag_write(500)hun5_flag = False
- 用不同颜色标注阅读量
# 在博文笔记索引页面用不同颜色区分打印不同高低的阅读量。if read > 10000:read = f"<font color='gold' size=5>( <b>{read}</b> 阅读)</font>" # 金色加粗特大。elif read > 9000:read = f"<font color='violet' size=4>( <b>{read}</b> 阅读)</font>" # 紫色加粗加大。elif read > 8000:read = f"<font color='red' size=4>( <b>{read}</b> 阅读)</font>" # 红色加粗加大。elif read > 7000:read = f"<font color=#4F999F size=3>( <i><b>{read}</b></i> 阅读)</font>" # “我的”绿。elif read > 6000:read = f"<font color='green' size=3>( <i><b>{read}</b></i> 阅读)</font>" # 绿色。elif read > 5000:read = f"<font color='deongaree'>( {read} 阅读)</font>" # 深蓝。elif read > 4000:read = f"<font color='blue'>( {read} 阅读)</font>" # 蓝色。elif read > 3000:read = f"<font color='cyan'>( {read} 阅读)</font>" # 青色。elif read > 2000:read = f"<font color='black' size=2>( {read} 阅读)</font>" # 黑色缩小。elif read > 1000:read = f"<font color='gray' size=2>( {read} 阅读)</font>" # 小灰。elif read < 1000:read = f"<font color='gray' size=1>( {read} 阅读)</font>" # 小小灰。
4.5 格式化笔记信息
用 dict.keys() 方法取得阅读量列表 reads ,reads.sort(reserse=True) 方法对选取的阅读量列表排降序,遍历轮询 reads ,插值字符串格式化把笔记信息排列成自己想要的样子,用 HTML5 源码“模板”写入文本。
- 博文笔记索引模板
- 代码
f"\n<li><a href='{mycsdn_path}{myid}' target=_blank>{title}</a><br>{read}<br><font color='gray' size=2>博文地址:<a href='{mycsdn_path}{myid}' target=_blank>{mycsdn_path}{myid}</a><br/>{'  '.join(active)}<br>本篇博文笔记{edit}</font></li>" # 博文笔记索引(源码)模板。
- 博文笔记索引模板
- 效果
- 效果
4.6 套用“笔记模板”
代码读入我的笔记头部 head 、body (笔记主体 body 就是一个超级“插值字符串格式化字符串”,她会把想说的变量所批对象,“插入”到模板指定的预设位置)、tail ,拼接成为“我的博文笔记总索引”笔记全篇源码文本。
- “笔记模板”代码
#!/usr/bin/nve python
# coding: utf-8mydata_path = '/sdcard/Documents/' # 本“项目”存储文件路径。# 读取上一篇博文标题、地址。
with open(f'{mydata_path}CSDN笔记发布足迹2023.txt') as f:f.readline() # 读取csv文本第一行字段行,让文件指针移到下一行。last_blog_title, last_blog_id, last_blog_summary = f.readline().split('\\')[1:4] # 解析上篇博文标题、地址。last_blog_url = f"https://blog.csdn.net/m0_57158496/article/details/{last_blog_id}"with open(f'{mydata_path}CSDN_my_hot_blog.txt') as f:myhotblog = f.read() # 读取“我的热博”。# 读取笔记源码主体body文档字符串。
with open(f'{mydata_path}CSDN_newblog_body.txt') as f:title1, title0, title2 = f.readline()[:-1].split('\\') # 获取标题文本。body = eval(f.read()) # 读取CSDN新撰笔记正文Markdown语法源码body字符串为“插值字符串格式”字符串,并用eval()函数激活为Python代码。all_text = '\n'.join([f"{title0},{title2}。", open(f'{mydata_path}CSDN笔记head.txt').read(), body, open(f'{mydata_path}CSDN笔记tail.txt').read()]) # 拼接CSDN新撰博文源码字符串。try:with open(f'{mydata_path}CSDNnewblog.txt', 'w') as f:f.write(all_text) # 将新撰博文笔记源码字符串写入文本文档。print(f"\n\n{' 文件保存成功!':~^43}\n")except Exceptions as error:print(f"\n\n{' 文件保存失败!':~^43}\n{error}\n")
5、效果截屏
(点击此处跳过“截屏图片”,点击此处跳转“学习笔记”翻阅页面效果)
-
代码运行效果
…
-
HTML5 源码文本
…
…
…
-
页面效果
…
…
…
(点击此处跳转“学习笔记”翻阅页面效果)
6、完整源码
(源码较长,点此跳过源码)
完整源码太长,有 254 行。
不适合在这里贴出来。
已经打包上传 CSDN ,如感兴趣,请前往我的主页下载。
(我 app 端弄不了上传资源链接,截个屏。试炼代码,需准备相应的 csv 文本的博文 ID ,或者下载我的 ID文本)
(如需试炼我的完整代码,需准备相应的 csv 文本的博文 ID ,或者去我的主页“上传资源”下载我的 ID文本)
__上一篇:__ 进制转换的黄金万能算法(单纯、混合进制整数通吃,真正的黄金万能算法)
__下一篇:__ 找出 1~1000中的所有完美数(再次练习查找完美数,找出 1-1000 中的所有完美数)
我的HOT博:
本次共计收集 197 篇博文笔记信息,总阅读量 31.29w,平均阅读量 1588。已生成 19 篇阅读量不小于 3000 的博文笔记索引链接。数据采集于 2023-04-21 05:34:28 完成,用时 4 分 41.41 秒。
- 让QQ群昵称色变的神奇代码
( 53034 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/122566500
点赞:22 踩 :0 收藏:74 打赏:0 评论:16
本篇博文笔记于 2022-01-18 19:15:08 首发,最晚于 2022-01-20 07:56:47 修改。 - ChatGPT国内镜像站初体验:聊天、Python代码生成等
( 45513 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/129035387
点赞:123 踩 :0 收藏:783 打赏:0 评论:73
本篇博文笔记于 2023-02-14 23:46:33 首发,最晚于 2023-03-22 00:03:44 修改。 - pandas 数据类型之 DataFrame
( 7883 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/124525814
点赞:6 踩 :0 收藏:23 打赏:0 评论:0
本篇博文笔记于 2022-05-01 13:20:17 首发,最晚于 2022-05-08 08:46:13 修改。 - 罗马数字转换器|罗马数字生成器
( 6312 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/122592047
点赞:0 踩 :0 收藏:1 打赏:0 评论:0
本篇博文笔记于 2022-01-19 23:26:42 首发,最晚于 2022-01-21 18:37:46 修改。 - Python字符串居中显示
( 5980 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/122163023
点赞:1 踩 :0 收藏:5 打赏:0 评论:1
本篇博文笔记于 2021-12-26 23:35:29 发布。 - 斐波那契数列的递归实现和for实现
( 5267 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/122355295
点赞:4 踩 :0 收藏:2 打赏:0 评论:8
本篇博文笔记于 2022-01-06 23:27:40 发布。 - 练习:字符串统计(坑:f‘string‘报错)
( 4842 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/121723096
点赞:0 踩 :0 收藏:1 打赏:0 评论:0
本篇博文笔记于 2021-12-04 22:54:29 发布。 - 练习:尼姆游戏(聪明版/傻瓜式•人机对战)
( 4556 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/121645399
点赞:14 踩 :0 收藏:42 打赏:0 评论:0
本篇博文笔记于 2021-11-30 23:43:17 发布。 - 个人信息提取(字符串)
( 4305 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/124244618
点赞:1 踩 :0 收藏:8 打赏:0 评论:0
本篇博文笔记于 2022-04-18 11:07:12 首发,最晚于 2022-04-20 13:17:54 修改。 - 回车符、换行符和回车换行符
( 4283 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/123109488
点赞:0 踩 :0 收藏:2 打赏:0 评论:0
本篇博文笔记于 2022-02-24 13:10:02 首发,最晚于 2022-02-25 20:07:40 修改。 - python清屏
( 4158 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/120762101
点赞:0 踩 :0 收藏:5 打赏:0 评论:0
本篇博文笔记于 2021-10-14 13:47:21 发布。 - 密码强度检测器
( 3833 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/121739694
点赞:1 踩 :0 收藏:4 打赏:0 评论:0
本篇博文笔记于 2021-12-06 09:08:25 首发,最晚于 2022-11-27 09:39:39 修改。 - 罗马数字转换器(用罗马数字构造元素的值取模实现)
( 3775 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/122608526
点赞:0 踩 :0 收藏:0 打赏:0 评论:0
本篇博文笔记于 2022-01-20 19:38:12 首发,最晚于 2022-01-21 18:32:02 修改。 - 练习:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)
( 3500 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/124424935
点赞:1 踩 :0 收藏:2 打赏:0 评论:0
本篇博文笔记于 2022-04-26 12:46:25 首发,最晚于 2022-04-27 21:22:07 修改。 - 练习:生成100个随机正整数
( 3451 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/122558220
点赞:1 踩 :0 收藏:3 打赏:0 评论:0
本篇博文笔记于 2022-01-18 13:31:36 首发,最晚于 2022-01-20 07:58:12 修改。 - 我的 Python.color() (Python 色彩打印控制)
( 3296 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/123194259
点赞:2 踩 :0 收藏:7 打赏:0 评论:0
本篇博文笔记于 2022-02-28 22:46:21 首发,最晚于 2022-03-03 10:30:03 修改。 - 练习:仿真模拟福彩双色球——中500w巨奖到底有多难?跑跑代码就晓得了。
( 3157 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/125415626
点赞:3 踩 :0 收藏:4 打赏:0 评论:3
本篇博文笔记于 2022-06-22 19:54:20 首发,最晚于 2022-06-23 22:41:33 修改。 - Python列表(list)反序(降序)的7种实现方式
( 3148 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/128271700
点赞:4 踩 :0 收藏:10 打赏:0 评论:8
本篇博文笔记于 2022-12-11 23:54:15 首发,最晚于 2023-03-20 18:13:55 修改。 - 聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )
( 3027 阅读)
博文地址:https://blog.csdn.net/m0_57158496/article/details/124539589
点赞:3 踩 :0 收藏:3 打赏:0 评论:3
本篇博文笔记于 2022-05-02 13:02:39 首发,最晚于 2022-05-21 06:10:42 修改。
精品文章:
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
-
全栈领域优质创作者——寒佬(还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是学习的两大利器。
-
【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
-
靠谱程序员的好习惯
CSDN实用技巧博文:
- 8个好用到爆的Python实用技巧
- python忽略警告
- Python代码编写规范
- Python的docstring规范(说明文档的规范写法)