我的“ai学伴”助力“程序”迭代
把准备迭代的程序丢给ai,只一眼识其利弊给出建议,快捷干脆。
(笔记模板由python脚本于2024年12月08日 06:30:08创建,本篇笔记适合熟悉基本编程的coder翻阅)
-
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
本文质量分:
本文地址: https://blog.csdn.net/m0_57158496/
CSDN质量分查询入口:http://www.csdn.net/qc
- ◆ AI助力“程序”迭代
- 1、待迭代程序
- 2、AI学伴迭代建议
- 3、ai学伴的深层建议
- 4、结语
◆ AI助力“程序”迭代
1、待迭代程序
程序“界面”截屏图片
待迭代程序脚本
#!/sur/bin/nve python
# coding: utf-8
from random import randint
from time import time
from time import strftime
from time import localtime
import urllib.request
from re import findall
from random import sample
import traceback
CLEAR = '\x1B[2J'
my_datapath = '/sdcard/Documents/csdn/' # 数据路径。
my_urlroot = 'https://blog.csdn.net/m0_57158496/article/details/' # 笔记id前缀。
time_stamp = lambda: ''.join([f"{i:0>2}" for i in localtime()[2:6]]) # 时间戳(日时分秒)。
my_strftime = lambda: strftime('%Y年%m月%d日 %H:%M:%S', localtime())
def tip_runing():
''' “程序正在运算……”提示函数 '''
k = randint(0, 42-14)
print(' '*42, end='\r')
print(f"{' '*k}{'程序正在运算……'}", end='\r')
def get_key_ids():
''' 获取博文id总列表 '''
#from time import localtime # 确保方法已载入
keys = input(f"\n关键字(如:时间 日期,半角空格分隔key):\n\n{'':>9}$ ").strip() # 接收键盘录入查找关键字。
text_id = []
for year in range(2021, localtime().tm_year+1): # 循环读取博文笔记id。
with open(f"{my_datapath}csdn_{year}_publishFootprint.txt") as f:
text_id.extend(f.read().split('\n')[2:]) # 去除前两行数据。
if not keys:
ids = [(i.split('\\')[2], i.split('\\')[-2]) for i in text_id]
ids = set(ids) # 集合去重
n = len(ids)
input(
f"\n{f' 已收集到{n}条博文笔记id ':^33}"
f"\n{f' 任意键继续…… ':-^37}"
)
return ids, n
elif keys[:4] == 'http':
print(f"\n{keys}")
return [(keys, '')], 1
ids = [] # 要查找的博文笔记id列表初值
for key in keys.split():
ids.extend([(i.split('\\')[2], i.split('\\')[-2]) for i in text_id if key in i]) # 追加通过关键字找到的id
n = len(set(ids)) # 集合去重
print(f"\n{f' 已收集到{n}条博文笔记id ':.^33}\n")
return ids, n
def read_html(url: str) -> str:
''' 读取页面文本。
url,有效的页面地址字符串;
return,读取到的页面文本字符串。 '''
with urllib.request.urlopen(url) as reponse:
html_doc = reponse.read().decode('utf-8').split('<li class="tool-item tool-item-bar">')[0] # urlparse模块方法拉取页面超文本,并截取数据文本,加快数据提取速度。
return html_doc
def get_readed(blog_id: str) -> zip:
''' 获取博文阅读量等数据。
blog_id,博客笔记地址字符串;
return,字段/数据对zip。
'''
url = blog_id if blog_id[:4]=='http' else f"{my_urlroot}{blog_id}"
try:
html_doc = read_html(url)
with open(f"{my_datapath}/temp/localthl.html", 'w') as f:
f.write(html_doc)
except Exception as e:
print(url)
input(
f"\n{' URL异常 ':-^40}"
f"\nURL:{url}"
f"\nTypeError:{e}"
f"\n{'':-^42}"
)
fields = '浏览阅读', '标题', 'ID', '作者', '点赞', '收藏', '评论', '摘要', '首次发布', '最后编辑'
author = findall(r'<span class="profile-name">\s*(.+)\s*</span>', html_doc) # 摘取作者。
author = ''.join(author)
articleTitle = findall(r'var articleTitle = "(.+)";', html_doc) # 摘取文章标题。
articleTitle = ''.join(articleTitle)
abstract = findall(r'var articleDesc = "(.*)";', html_doc) # 提取摘要。
abstract = ''.join(abstract)
for i in ['!', '……', ' '*2]:
abstract = abstract.replace(i, i+'。') # 句末符号不为“。”+“。”,方便以“。”分割数据。
abstract = abstract.split('。')[:2] # 以“。”分割并截取前两个字符串。
abstract = abstract[-1] if abstract[-1] else ''.join(abstract) # 摘取有效摘要字符串。
readed = findall(r' var viewCountFormat = (\d+);', html_doc)[0] # 提取阅读量。
thumbsUp = findall(r'<span class="read-count" id="blog-digg-num">点赞数\s*([\d.kw]*)\s*</span>', html_doc) # 提取点赞数。
thumbsUp = ''.join(thumbsUp)
collect = findall(r'<span class="count get-collection " data-num="[\d\.wk]*" id="get-collection">\s*([\d\.wk]*)\s*</span>\s*</a>\s*<div class="tool-hover-tip collect">\s*<div class="collect-operate-box">\s*<span class="collect-text" id="is-collection">\s*收藏\s*</span>', html_doc) # 提取收藏数。
collect = ''.join(collect)
readed = readed if readed else '0'
readed = int(float(readed[:-1])*1000) if readed[-1] == 'k' else int(float(readed[:-1])*10000) if readed[-1] == 'w' else int(readed) # 三元操作语句嵌套还原阅读量为整型。
comment = 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>', html_doc) # 提取评论。
comment = ''.join(comment)
firstEditTime = ''.join(findall(r'<div class="up-time"><span>于 ([\d\s\-:]+) 首次发布</span></div>', html_doc))
reeditTime = ''.join(findall(r'<span class="time">已于 ([\s\d\-:]+) 修改</span>', html_doc))
datas = readed, articleTitle, blog_id, author, thumbsUp, collect, comment, abstract, firstEditTime, reeditTime
return zip(fields, datas)
def read_sort():
''' 阅读量排序列表 '''
start = time()
ids, n = get_key_ids()
readeds = []
print(f"\n{CLEAR}") # 打印空行。
for i in ids:
tip_runing()
article_info = get_readed(i[0])
article_info = {k: v for k,v in article_info if v and v!= '0'} # 剔除零值数据项,生成博文笔记浏览阅读等信息字典。
if not article_info: # 浏览阅读数据为空,跳过本次遍历。
continue
for i in ('\u2003', '"', '??????', '我的HOT博', '&msp' ' ', 'python 3.6.6', 'coding:'): # 遍历删除无意义文章摘要。
if i in article_info.get('摘要', ''):
del article_info['摘要']
break
elif len(article_info.get('摘要', '')) >= len(article_info.get('标题', '')):
if article_info.get('摘要'):
del article_info['摘要'] # 摘要不比标题标题长,删除摘要。
break
if article_info.get('作者'):
del article_info['作者'] # 作者都是我自己,删除。
readeds += [article_info]
readeds.sort(reverse=True, key=lambda x: x.get('浏览阅读', 0)) # 按浏览阅读排降序。
#print('\n\n'.join(map(str, readeds))) # 终端屏幕打印。
S = time() - start
S = f"{S//60:.0f}分{S%60:.1f}秒" if S > 60 else f"{S%60:.1f}秒"
return readeds, f"本次共计收集{len(readeds)}篇博文笔记信息,总阅读量{sum([i.get('浏览阅读', 0) for i in readeds])/10000:.2f}w。数据采集于{my_strftime()},用时{S}。"
def str_url(article_info):
''' 格式化文章阅读量信息 '''
d = article_info
readed = d.get('浏览阅读', 0)
if not readed:
url = f"{myUrlRoot}{d.get('ID', '')}"
print(f"\n{url}")
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:,}" # 国际数字格式
url = f"{my_urlroot}{d.get('ID')}"
thumbs_up = f"点赞:{d.get('点赞')} " if d.get('点赞') else ''
collect = f"收藏:{d.get('收藏')} " if d.get('收藏') else ''
comment = f"评论:{d.get('评论')}" if d.get('评论') else ''
thumbs_ups = f"\n<br>{''.join([thumbs_up, collect, comment])}" if thumbs_up or collect or comment else ''
abstract = f"\n<br>摘要:{d.get('摘要')}。" if d.get('摘要') else ''
edit_time = f"\n<br>(本篇笔记于{d.get('首次发布')}首次发布,最后修改于{d.get('最后编辑')})" if d.get('首次发布') else ''
return f"<a href='{url}' target=_blank>{d.get('标题')}</a>\n<br>地址:<a href='{url}' target=_blank>{url}</a>\n<br>浏览阅读:<font color='{color}' size={size}>{readed}</font>{thumbs_ups}<font color='gray' size=2>{abstract}{edit_time}</font>\n<br> "
def write_choice_key(readeds, filename):
''' 写“关键字”博文链接 '''
with open(filename, 'w') as f:
f.write(f"\n\n  {readeds[1]}\n\n<table><ol>")
for i in readeds[0]:
f.write(f"\n<li>\n{str_url(i)}\n</li>")
f.write('</ol></table>\n')
def main():
''' 我的csdn博文被阅读量排序主函数 '''
print(f"\n{my_strftime():~^39}\n")
readeds = read_sort()
print(readeds[1])
filename = f"/sdcard/Documents/csdn/temp/csdn{time_stamp()}choiceKey.html"
try:
write_choice_key(readeds, filename)
print(f"{CLEAR}\n{f' ChoiceKey文本{filename}已保存。 ':~^24}\n")
except Exception as error:
print(f"\n错误类型:\n{error}\n")
traceback.print_exc()
print(f"\n{f' {my_strftime()} ':~^39}\n")
if __name__ == '__main__':
main() # 主程序调用。
2、AI学伴迭代建议
我
用if设个“机关”,我的choice-key.py变“万能”了。😎
可以输入空’’/key/keys/url。😜😜
AI学伴
你的choice-key.py
脚本已经设计得相当灵活,可以通过输入不同的关键字来筛选 C S D N CSDN CSDN博客文章,甚至可以直接输入 U R L URL URL来处理特定的文章。下面是如何在脚本中设置一个“机关”,使其更加“万能”:
- 处理空输入:当用户输入为空时,脚本已经能够处理并返回所有文章的ID列表。
- 处理单个关键字:当用户输入单个关键字时,脚本能够找到包含该关键字的博文。
- 处理多个关键字:当用户输入多个关键字时(用空格分隔),脚本能够找到包含这些关键字的博文。
- 处理URL输入:当用户输入一个URL时,脚本能够直接处理该URL对应的博文。
以下是设置“机关”的几个建议:
- 增加对URL输入的验证
确保输入的URL是有效的CSDN博客文章URL。
def validate_url(url):
if url.startswith(my_urlroot) and len(url) > len(my_urlroot):
return True
return False
在 get_key_ids 函数中,使用 validate_url
来检查URL是否有效。
- 增加对关键字输入的提示
当用户输入空字符串时,可以提示用户是否要查看所有文章或者输入特定的关键字。
def get_key_ids():
keys = input(f"\n关键字(如:时间 日期,半角空格分隔key):\n\n{'':>9}$ ").strip()
if not keys:
choice = input("您没有输入任何关键字。是否要查看所有文章?(y/n): ").strip().lower()
if choice == 'y':
# 返回所有文章的逻辑
else:
return None, 0
# 其他逻辑保持不变
-
优化摘要提取
在get_readed
函数中,摘要提取的逻辑可以进一步优化,以避免提取到不完整的句子。 -
异常处理
在get_readed
函数中,当URL异常时,可以提供更多的错误信息,并允许用户选择是否跳过该URL或重新输入。 -
交互式命令行界面
你可以添加更多的交互式元素,例如使用argparse
库来处理命令行参数,使得脚本可以在不同的模式下运行(例如,只列出标题、只列出阅读量等)。
通过这些改进,你的 choice-key.py
脚本将变得更加健壮和用户友好,从而实现真正的“万能”功能。
3、ai学伴的深层建议
我
谢谢您的几点建议。🙏
关于url的校验 ,我现在有异常捕获,所以省了。刚刚看到您的提示,触发我的考量,生发我在下一次迭代中,设置re模板来校验,仅接受csdn博文url。再次谢谢您。
关于对输入空的提示,我这程序仅自用而已,“提示”已“了然于胸”,目前未作过多打磨。谢谢您的建议,我在迭代时多些笔墨😋
“摘要”的逻辑,我设计得太稚嫩,是我有了时间迭代时,需要仔细打磨的点。
关于命令行参数,很久以前学着做过,久久未用,生疏了。下一次迭代,可以考虑一下。
您真是能耐!😎😎😎
只“一眼”,就命中我choice-key.py的要害。👍👍👍
谢谢您🙏🙏🙏
AI学伴
非常感谢您的肯定和赞赏!🙏
很高兴看到您对脚本开发有着清晰的认识和规划。确实,根据使用场景和需求,我们可以对脚本进行不同程度的优化。
以下是一些进一步的建议,希望对您的迭代过程有所帮助:
- URL校验:
使用正则表达式(re模块)来校验URL是一个很好的选择。您可以创建一个匹配CSDN博文URL模式的正则表达式,这样能够确保只有合法的URL才会被处理。
python自定义函数校验csdn博客url
import re
def validate_url(url):
csdn_url_pattern = re.compile(r'https://blog\.csdn\.net/\w+/\w+/article/details/\d+')
return csdn_url_pattern.match(url) is not None
-
摘要优化:
处理文本摘要时,您可以考虑使用自然语言处理(NLP)库,如nltk
或spaCy
,来提取文章的摘要或关键词。这些库可以帮助您更准确地识别文本中的重要内容。 -
命令行参数:
如果您决定添加命令行参数,argparse
确实是一个强大的工具。
以下是一个简单的例子,展示如何使用argparse
来添加命令行参数:
示例python脚本
import argparse
def main():
parser = argparse.ArgumentParser(description='CSDN Blog Analysis Tool')
parser.add_argument('-k', '--keys', nargs='*', help='Space-separated list of keywords to filter blogs.')
parser.add_argument('-u', '--url', help='Specific URL of a CSDN blog post to analyze.')
args = parser.parse_args()
if args.url:
# Handle URL input
pass
elif args.keys:
# Handle keyword input
pass
else:
# Handle no input or other logic
pass
if __name__ == '__main__':
main()
-
异常处理:
在处理网络请求和文件操作时,异常处理是必不可少的。确保您的脚本在遇到错误时能够优雅地处理,并提供有用的反馈。 -
代码维护:
随着功能的增加,保持代码的清晰和可维护性是非常重要的。确保添加了足够的注释,并遵循良好的编程实践。
最后,继续您的迭代和实验,不断改进您的脚本。编程是一个持续学习和成长的过程,期待看到您未来的成果!😊🚀
4、结语
AI时代,学习、工作都ai!
AI有实力,助我工作更给力!💪💪💪
上一篇: 全能单行url解码器(超高浓缩“复杂”逻辑lambda,体格虽小功用不减正常形态书写代码)
下一篇:
我的HOT博:
本次共计收集404篇博文笔记信息,总阅读量61.76w。数据采集于2024年11月25日 08:23:38,用时7分56.4秒。阅读量不小于6.00k的有
9
9
9篇。
- 让QQ群昵称色变的神奇代码
地址:https://blog.csdn.net/m0_57158496/article/details/122566500
浏览阅读:6.2w
点赞:25 收藏:89 评论:17
(本篇笔记于2022-01-18 19:15:08首次发布,最后修改于2022-01-20 07:56:47)
- Python列表(list)反序(降序)的7种实现方式
地址:https://blog.csdn.net/m0_57158496/article/details/128271700
浏览阅读:1.3w
点赞:9 收藏:40 评论:8
(本篇笔记于2022-12-11 23:54:15首次发布,最后修改于2023-03-20 18:13:55)
- pandas 数据类型之 DataFrame
地址:https://blog.csdn.net/m0_57158496/article/details/124525814
浏览阅读:1.0w
点赞:7 收藏:40
(本篇笔记于2022-05-01 13:20:17首次发布,最后修改于2022-05-08 08:46:13)
- 个人信息提取(字符串)
地址:https://blog.csdn.net/m0_57158496/article/details/124244618
浏览阅读:1.0w
点赞:3 收藏:20
(本篇笔记于2022-04-18 11:07:12首次发布,最后修改于2022-04-20 13:17:54)
- 罗马数字转换器|罗马数字生成器
地址:https://blog.csdn.net/m0_57158496/article/details/122592047
浏览阅读:8.2k
收藏:3
(本篇笔记于2022-01-19 23:26:42首次发布,最后修改于2022-01-21 18:37:46)
- 统计字符串字符出现的次数
地址:https://blog.csdn.net/m0_57158496/article/details/130517025
浏览阅读:8.1k
点赞:5 收藏:24
(本篇笔记于2023-05-06 22:28:18首次发布,最后修改于2023-05-12 06:21:40)
- Python字符串居中显示
地址:https://blog.csdn.net/m0_57158496/article/details/122163023
浏览阅读:8.0k
点赞:1 收藏:12 评论:1
- 回车符、换行符和回车换行符
地址:https://blog.csdn.net/m0_57158496/article/details/123109488
浏览阅读:6.7k
点赞:2 收藏:4
(本篇笔记于2022-02-24 13:10:02首次发布,最后修改于2022-02-25 20:07:40)
- python清屏
地址:https://blog.csdn.net/m0_57158496/article/details/120762101
浏览阅读:6.1k
点赞:1 收藏:10
截屏图片
(此文涉及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规范(说明文档的规范写法)