Python自动提取生成博客园年度报告
2023-09-11 14:15:06 时间
小狼的世界 的博客园年度报告
Hi 小狼的世界 你在博客园已经发表了373篇文章
2020年你一共写了24篇文章
你在博客园中的文章已经获得了2525064次阅读
460评论以及208次推荐
你阅读量最高的一篇文章是 Crontab的格式,共有 253792 次阅读
YUI学习笔记 – CSS Rest、Base、Font以及Grid 是你在 02:03 写下的,夜已深注意休息
新的一年,希望你继续笔耕不辍,在博客园发表更多的文章
最近各个APP和网站都在搞年度总结,寻思着既然博客园官方没提供,就自己用Python写一个吧。上面这些内容,是通过 Python 脚本自动生成的。代码在后面可以看到,也可以参考我的 GitHub。当然现在统计的内容还不太完善,毕竟是用一天时间撸出来的,如果大家有更好的想法,欢迎提交代码。
只需要本机安装了Python环境就可以运行,如果没有Python环境也没关系,装上Docker帮你快速搭建开发环境,可以参考我的 利用Docker快速构建开发环境
import os, sys, getopt
import re
import requests
import json
from bs4 import BeautifulSoup
class generate():
blog_title = ''
def __init__(self, blog_url, year = 2020):
self.blog_url = blog_url
self.year = year
# 从列表页获取所有文章相关信息
def _get_post_lists(self):
blog_data = []
html = requests.get(self.blog_url).text
soup = BeautifulSoup(html, 'html.parser')
self.blog_title = soup.find('a', attrs={'id':'Header1_HeaderTitle'}).text.strip()
# 获取下一页链接地址
next_page = soup.find('div', attrs={'id':'nav_next_page'})
next_page_link = next_page.a['href']
# 保存本页的文章信息
blog_data += soup.find_all('div', attrs={'class':'day'})
while True:
next_html = requests.get(next_page_link).text
next_soup = BeautifulSoup(next_html, 'html.parser')
blog_data += next_soup.find_all('div', attrs={'class':'day'})
next_pager = next_soup.find('div', attrs={'id':'homepage_bottom_pager'})
if "下一页" in next_pager.text:
next_page_link = next_pager.find_all('a')[-1]['href']
else:
break
return blog_data
# 将抓取的数据准备统计所需的格式
def _prepare_data(self, blog_data):
stat_data = []
post_data = {}
for item in blog_data:
# print(item)
post_data['post_title'] = item.find('div', attrs={'class':'postTitle'}).text.strip()
# post_data['post_desc'] = item.find('div', attrs={'class':'c_b_p_desc'}).text.strip()
post_data['post_date'] = re.search(r'\d{4}-\d{2}-\d{2}', item.find('div', attrs={'class':'postDesc'}).contents[0]).group()
post_data['post_time'] = re.search(r'\d{2}:\d{2}', item.find('div', attrs={'class':'postDesc'}).contents[0]).group()
post_data['view_count'] = int(re.search(r'\d+', item.find('span', attrs={'class':'post-view-count'}).text.strip()).group())
post_data['digg_count'] = int(re.search(r'\d+', item.find('span', attrs={'class':'post-digg-count'}).text.strip()).group())
post_data['comment_count'] = int(re.search(r'\d+', item.find('span', attrs={'class':'post-comment-count'}).text.strip()).group())
stat_data.append(post_data)
post_data = {}
return stat_data
# 计算统计指标
# 报告的指标
# * 文章总数量
# * 文章阅读总量
# * 最高阅读量
# * 推荐总量
# * 最高推荐的文章
# * 评论的数量
# * 最多评论的文章
# * 最晚发文的时间与文章名称
def _calc_stat(self, blog_data):
stat_data = {}
stat_data['total_post'] = len(blog_data)
stat_data['year_post'] = 0
stat_data['total_view'] = 0
stat_data['total_comment'] = 0
stat_data['total_digg'] = 0
stat_data['max_view'] = {"view_count":0,"post_title":""}
stat_data['max_comment'] = {"comment_count":0,"post_title":""}
stat_data['max_digg'] = {"digg_count":0,"post_title":""}
# stat_data['early_post'] = {}
stat_data['late_post'] = {"post_time":"00:00", "post_title":""}
for item in blog_data:
stat_data['total_view'] += item['view_count']
stat_data['total_comment'] += item['comment_count']
stat_data['total_digg'] += item['digg_count']
if item['view_count'] > stat_data['max_view']['view_count']:
stat_data['max_view']['view_count'] = item['view_count']
stat_data['max_view']['post_title'] = item['post_title']
if item['comment_count'] > stat_data['max_comment']['comment_count']:
stat_data['max_comment']['comment_count'] = item['comment_count']
stat_data['max_comment']['post_title'] = item['post_title']
if item['digg_count'] > stat_data['max_digg']['digg_count']:
stat_data['max_digg']['digg_count'] = item['digg_count']
stat_data['max_digg']['post_title'] = item['post_title']
if item['post_date'] > '2019-12-31':
stat_data['year_post'] += 1
# 只考虑了0点以后发文的问题
if item['post_time'] < '05:00' and item['post_time'] > stat_data['late_post']['post_time']:
stat_data['late_post']['post_time'] = item['post_time']
stat_data['late_post']['post_title'] = item['post_title']
return stat_data
def _render_md(self, stat_data):
md_string = "## " + self.blog_title + " 的博客园年度报告\n"
md_string += "Hi " + self.blog_title + ' '
md_string += "你在博客园已经发表了**" + str(stat_data['total_post']) + "**篇文章\n"
md_string += "2020年你一共写了**" + str(stat_data['year_post']) + "**篇文章\n"
md_string += "\n"
md_string += "你在博客园中的文章已经获得了**" + str(stat_data['total_view']) + "**次阅读\n"
md_string += "**" + str(stat_data['total_comment']) + "**评论以及**" + str(stat_data['total_digg']) + "**\n"
md_string += "\n"
md_string += "你阅读量最高的一篇文章是 **" + stat_data['max_view']['post_title'] + "**,共有 **" + str(stat_data['max_view']['view_count']) + "** 次阅读\n"
md_string += "\n"
md_string += "**" + stat_data['late_post']['post_title'] + "** 是你在 **" + stat_data['late_post']['post_time'] + "** 写下的,夜已深注意休息\n"
md_string += "\n"
md_string += "新的一年,希望你继续笔耕不辍,在博客园发表更多的文章\n"
return md_string
def run(self):
blog_data = self._get_post_lists()
blog_data = self._prepare_data(blog_data)
stat_data = self._calc_stat(blog_data)
print(self._render_md(stat_data))
pass
相关文章
- python自动生成excel(xlwt库)
- pycharm中python模板代码自动生成
- python:pip升级pip本身和setuptools(Python 3.7.15)
- 不通用版(从SVN取版本,通过MAVEN生成JAVA包,通过SALTSTACK传送到远程服务器并自动重启TOMCAT服务)PYTHON代码
- pycharm中python模板代码自动生成
- python: easyocr的安装和使用(easyocr 1.6.2 / Python 3.7.15 )
- 华为校招机试 - 工单调度策略(Java & JS & Python)
- Python和Excel的完美结合:常用操作汇总(案例详析)
- Python编程语言学习:基于python各种库(matplotlib、Image)利用多种方法展示图片或进行图片可视化之详细攻略
- Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法
- Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名、合并两个不同路径下图片文件名等目录/路径案例、正确加载图片路径)之详细攻略
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Listbox/Scrollbar)
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Canvas)
- Python的IDE:基于Eclipse/MyEclipse软件的PyDev插件配置python的开发环境(不同python项目加载不同版本的python)—从而实现Python编程图文教程之详细攻略
- Python语言学习之文件格式后缀那些事:python和常见各种文件格式后缀介绍、使用方法之详细攻略
- 已解决2.Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and wi
- 已解决2. Set PROTOCOL_BUPFERS_PYTHON_iMPLEMENTATION=python (but this will use pure-Python parsing and w
- 已解决Visit python.org to download an earlier version of Python.
- 〖Python自动化办公篇⑲〗 - python实现邮件自动化 - 邮件发送
- Python实现点选验证码识别, 模拟登陆小破站并自动发弹幕
- 又一个 Jupyter 神器,操作 Excel 自动生成 Python 代码
- Python实现GWO智能灰狼优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战
- Python自动化测试自动生成测试用例,超厉害技能get
- python 闭包变量不允许write,要使用nonlocal
- python基础===利用PyCharm进行Python远程调试(转)
- 手把手教你用Python网络爬虫获取壁纸图片
- 【异常】前端ERR! stack Error: Can‘t find Python executable “python“, you can set the PYTHON env variable.
- Python可视化数据分析01、python环境搭建
- 〖Python全栈白宝书-免费版⑭〗 - Python中的元组
- 【Python实战】 ---- python 实现 CSDN 的定时自动签到
- Python练习