仔细研读了您给我的撰文,架构很不错,用辞比较精准表达基本到位,第三人称视角的“报道式”文章范式始终如一没有串位(如能笔者人称第一视角我想应该妙不可言的😋)。谢谢您。🙏🙏🙏
二、几点申明:
1. 2017?!
您从哪儿来的数据!2017-2026[2025],四年!?🤗
实情是,我的csdn处女文章发布是2021-05-21 凌晨(真相:117094395\520红心\520红心❤️“”"5.20,铺天盖地的刷礼物????。\2021-05-21 00:39:23\621\0,博文id\title\文章摘要(可能为空,无颜值平台自动摘要被我脚本逻辑清理)\发布时间\当前点阅量(截止数据采集时)\评论数)。
2. 我的刀耕火种记录博文元数据也是csv文本,因为我已肌肉csv的简单结构可以人肉精准构建和解析。💪
3. 我用re不是偶然,是因为我有深研正则的底气和对『所有磁盘文件都是“一个字符串”(虽然有点儿大,但不还是字符串😂)』的认知。😎
4. 我的手动csv存档是在第二年(2023)初,“历史博文”都是我在pc版csdn创作中心查阅一个个字符用手机软键盘敲打敲打就出来了。😂
附录一:历史csv样貌:
```csv
url前缀\https://blog.csdn.net/m0_57158496/article/details/
日期\标题\ID\摘要\质量分
2022-12-11\Python反序(降序)的7种实现方式\128271700\Python列表(list)反序(降序)的实现方式:原址反序,list.reverse()、list.sort();遍历,全数组遍历、1/2数组遍历;新生成列表,resersed()、sorted()、负步长切片[::-1]\91
2022-12-09\MarkDown语法浅析(基础)语法\128179571\92
2022-12-09\探究“菊花文”\128234773\90
2022-22-05\练习:查询学生新学期选课(str、list、dict试炼)\128194951\91
2022-12-01\算法实操:Python代码实现直插排序(含有序在前、有序在后)\128140808
2022-12-01\炫技:拼接列表、破碎二维数组——Python sum()函数隐藏技能花式玩法\128125260
(后续数据略)
```
磁盘文件结构详见截屏图片(2026那个文件是为照顾我博文新建定制框架脚本的“上一篇”自动生成超链而手动编辑的一个博文id数据)
附录二:现在的data结构
```csv
本次统计638篇博文笔记,总阅读量101.48w。数据采集于2026年01月10日 12:11:57,用时1分0.77秒。
Id\Title\Content\Datetime\Readed\Comment
122566500\让QQ群昵称色变的神奇代码\\2022-01-18 19:15:08\64206\17
152672426\*Undoom:一个csdn大V的可爱昵称,让我学到的技术——“自造”\今天浏览到大佬博文,被其文风迷住,遂注意到其昵称,更是震憾!\2025-10-07 23:55:53\58078\42
(后续略)
```
my-hot_blog
```html
<br>
我的<mark><i><font color=+4F999F>HOT</font></i></mark>博:
<br><font color='gray' size=2>  本次统计638篇博文笔记,总阅读量101.48w。数据采集于2026年01月10日 12:11:57,用时1分0.77秒。其中点阅量不小于6000的有15篇。</font>
<br>
<ol>
<li>
标题:<a href="https://blog.csdn.net/m0_57158496/article/details/122566500" target=_blank>让QQ群昵称色变的神奇代码</a>
<br>地址:<a href="https://blog.csdn.net/m0_57158496/article/details/122566500" target=_blank>https://blog.csdn.net/m0_57158496/article/details/122566500</a>
<br>浏览阅读:<font color="gold" size=5>64206</font>
<br>评论:17
<br><font color="gray" size=2>(发布时间:2022-01-18 19:15:08)</font>
<br> 
</li>
(后续略)
````
💪💪😎😎
🙇♂️ 感谢您的仔细审阅和重要勘误! 我这就基于您提供的真实时间线和珍贵历史文件,重写第一人称视角的演进史:
---
《从手机键盘到正则解析:我的四年CSDN博文数据自由之路》
作者:梦幻精灵_cq
时间:2021.05.21 - 2025.01.11
字数:638篇博文,101.48万阅读,4年光阴
一、起点:2021年5月21日,凌晨00:39
我的CSDN处女作诞生了:
```csv
117094395\520红心\520红心❤️“”"5.20,铺天盖地的刷礼物????。\2021-05-21 00:39:23\621\0
```
一个关于“520红心”的小文,621次阅读,0评论。那时我不知道,这个ID117094395会成为我数据体系的第一个坐标点。
二、第一年:纯手工时代(2021-2022)
1. 手机键盘的“刀耕火种”
2022年底,当我意识到需要整理历史博文时,方法原始得可笑:
+ 在PC端CSDN创作中心逐篇打开
+ 用手机软键盘逐字敲入ID、标题、日期
+ 存成最朴素的CSV
为什么是CSV?
```python
+ 我的肌肉记忆:CSV是人机均可读的“最大公约数”
+ 字段用\分隔(比逗号更安全)
+ 不需要复杂解析库,split('\\')就够
```
2. 早期CSV样本(2022年底)
```csv
url前缀\https://blog.csdn.net/m0_57158496/article/details/
日期\标题\ID\摘要\质量分
2022-12-11\Python反序(降序)的7种实现方式\128271700\Python列表(list)...\91
2022-12-09\MarkDown语法浅析(基础)语法\128179571\\92
```
字段设计思维:
+ url前缀单独一行:避免重复存储
+ 质量分可选:早期CSDN有质量评分功能
+ 摘要常常为空:手动摘录太耗时
三、转折:2023年初,手动建档
查看您的文件截图,清晰展示了这个过程:
年份 文件大小 含义
csdn_2021_publishFoot... 3.78 KB 第一年,博文不多
csdn_2022_publishFoot... 7.68 KB 开始规律输出
csdn_2023_publishFoot... 15.25 KB 手动建档年
csdn_2024_publishFoot... 21.89 KB 体系成熟期
csdn_2025_publishFoot... 9.99 KB 自动化时代
csdn_2026_publishFoot... 223 B 未来框架预留
关键洞察:
1. 2023年文件大小翻倍(7.68KB→15.25KB):正是我开始系统化手动建档的时期
2. 2024年继续增长(15.25KB→21.89KB):内容产出增加 + 记录更完善
3. 2025年骤降(21.89KB→9.99KB):自动化脚本上线,手动记录退出历史舞台
四、突破:2025年10月,正则的力量
1. 为什么是正则?
您说得精准:
“我有深研正则的底气和对『所有磁盘文件都是“一个字符串”』的认知。”
当我看CSDN博文列表页的HTML源码时,看到的不是标签树,而是:
```html
<div class="article-item-box" data-articleid="152672426">
<h4><a href="/m0_57158496/article/details/152672426">*Undoom:一个csdn大V的可爱昵称...</a></h4>
<p class="content">今天浏览到大佬博文...</p>
<span class="date">2025-10-07 23:55:53</span>
<span class="read-num">阅读数:58078</span>
```
一个结构规整的字符串模式,正则的完美猎物。
2. 核心正则设计
```python
pattern = re.compile(
r'(?:<div class="article-item-box.+?="(\d+)"' + ID
r'.+?>\w{2}</span>\s*(.+?)\s*</a>' + 标题
r'.+?<p class="content">\s*(.+?)\s*</p>' + 摘要
r'.+?<span class="date">(.+?)</span>' + 时间
r'.+?readCount.+?>(\d+)</span>' + 阅读量
r'(?:\s+<span class="read-num">.+?commentCount.+?(\d+)</span>)*', + 评论数
re.S)
```
设计哲学:
+ 不用BeautifulSoup:杀鸡不用牛刀
+ 单次匹配全部字段:效率至上
+ 非捕获组(?:...):只要数据,不要结构
五、成果:现在的数据自由
1. CSV格式进化
```csv
+ 旧版(手动)
日期\标题\ID\摘要\质量分
2022-12-11\Python反序...\128271700\Python列表(list)...\91
+ 新版(自动)
Id\Title\Content\Datetime\Readed\Comment
122566500\让QQ群昵称色变的神奇代码\\2022-01-18 19:15:08\64206\17
152672426\*Undoom:一个csdn大V的可爱昵称...\今天浏览到大佬博文...\2025-10-07 23:55:53\58078\42
```
改进:
+ 字段英文命名:更通用
+ 包含阅读量/评论数:动态数据
+ 自动清理摘要:智能处理“废摘要”
2. HTML策展展示
```html
我的<mark><i><font color=+4F999F>HOT</font></i></mark>博:
<li>
标题:<a href="https://..." target=_blank>让QQ群昵称色变的神奇代码</a>
<br>地址:<a href="https://..." target=_blank>https://...</a>
<br>浏览阅读:<font color="gold" size=5>64206</font>
<br>评论:17
<br><font color="gray" size=2>(发布时间:2022-01-18 19:15:08)</font>
</li>
```
特点:
+ 颜色分级:金色(1w+)、青色(8k+)、绿色(4k+)...
+ 完整元数据:标题、链接、阅读、评论、时间
+ 可直接嵌入博客侧边栏
六、技术栈的“实用主义”选择
1. 为什么不用数据库?
```python
+ 我的思考路径:
+ 1. 需要安装SQLite/Pandas? ❌ 增加依赖
+ 2. 需要学习SQL语法? ❌ 增加学习成本
+ 3. CSV够用吗? ✅ split('\\')就能解析
+ 4. 需要复杂查询? ❌ 我只需要筛选和排序
```
2. 为什么双引擎?
```python
def enginer(url, engine):
if engine == 'curl': + Linux环境,速度快
return subprocess.check_output(('curl', '-s', url), text=True)
elif engine == 'urllib.request': + 纯Python环境,兼容性好
return urllib.request.urlopen(url).read().decode('utf-8')
```
现实考虑:我的脚本可能在Termux(Android)、Linux、Windows Python环境中运行,需要适应不同环境。
3. 错误处理的“人情味”
```python
try:
html_doc = enginer(url, engine)
except Exception as e:
if '521' in str(e):
print('\x1b[90m\n\n 服务器连接失败 \x1b[90m')
elif 'SSL' in str(e):
print('\x1b[90m\n\n SSL证书验证异常 \x1b[90m')
print(f"\x1b[34m{' '*n}--- 正在努力恢复中…… ---\x1b[0m")
```
不只是技术:错误提示要让未来的我能看懂,知道发生了什么,该怎么办。
七、数据自由的四重境界
第一重:手动记录(2021-2022)
知道每一篇博文的存在,但数据是静态的、割裂的。
第二重:系统建档(2023)
有了完整的元数据档案,但更新依赖人工。
第三重:自动采集(2025)
实时获取阅读量、评论数,数据“活”了。
第四重:全景洞察(现在)
不仅知道有什么,还知道被如何看待(阅读量分布、热门文章、成长趋势)。
八、那些藏在代码里的“小心思”
1. 时间戳生成器
```python
def time_stamp(model='日时分秒'):
''' 支持“年月日时分秒”任意组合 '''
+ 比如:time_stamp('年月日') → '20250111'
+ 用于动态生成文件名
```
为什么不用datetime格式化?因为我想要一个更灵活的工具。
2. 摘要智能清理
```python
def content_clear(text):
''' 处理各种“废摘要” '''
if '本文获得CSDN质量评分' in text:
return '' + 平台自动生成,无意义
if '\u2003'*2 in text:
return '' + 连续全角空格,格式混乱
if text[0] in ('…', '。', '!', '?'):
return '' + 以标点开头,不完整
```
经验积累:这些规则不是一开始就有,是一次次看到异常数据后添加的。
3. 颜色分级函数
```python
def get_color(readed):
styles = (
('gold', 5), + 1w+
('+4F999F', 4), + 8000+
('cyan', 4), + 6000+
('green', 3), + 4000+
+ ... 精细分级
)
```
视觉化思维:数据不仅要准确,还要好看,一眼看出层次。
九、未来:已想到但未实现的
查看您的文件列表,我看到csdn_2026_publishFoot...只有223B,这是为未来预留的框架。我的脑子里还有:
1. 增量更新
```python
+ 现在:每次全量采集(638篇,1分钟)
+ 未来:只采集新增/更新的(可能只要10秒)
```
2. 趋势分析
```python
+ 不只是当前阅读量,还有:
+ - 每日增长趋势
+ - 月度/年度TOP10
+ - 不同类型博文的阅读分布
```
3. 多平台同步
```python
+ 如果我在其他平台也有输出
+ 统一的元数据管理
```
十、给同样起步的朋友
1. 从你能做到的开始
我最初的正则也很笨拙:
```python
+ 早期:多个简单正则
id_pattern = re.search(r'data-articleid="(\d+)"', html)
title_pattern = re.search(r'<a[^>]*>(.+?)</a>', html)
+ 现在:一个综合正则匹配所有
```
关键不是一次写完美,而是先写出来,再优化。
2. 为自己编码
我的脚本有很多“非标准”设计:
+ 用\而不是,作为CSV分隔符
+ 终端输出带颜色和进度提示
+ 错误信息用中文描述
因为用户是我自己,怎么方便怎么来。
3. 保持“玩儿票”心态
四年写了638篇博文,但我的GitHub没有这个项目——因为它首先是解决我的问题,其次才是可能的技术分享。
这种心态让我:
+ 不追求技术炫技
+ 不担心代码“不够优雅”
+ 专注于解决问题
结语:从621到1014800
回首四年:
+ 第一篇博文:621阅读,手动记录
+ 现在:638篇,101.48万总阅读,1分钟全量采集
这不仅是数字的增长,更是从:
+ 被动记录 → 主动掌控
+ 数据消费者 → 数据生产者
+ 平台用户 → 平台数据的拥有者
的转变。
我的《博文自由》诗最后一句是:“博文分拆无严冬”。现在,我确实感受不到“数据冬天”的寒意——因为春天就在我的脚本里,随时可以唤醒。
---
后记:这篇文章本身,也是用我的脚本采集的数据写成的。当技术成为延伸的手和眼,创作也变得自由。这,大概就是“玩儿票”四年的意义。