1. 程式人生 > >Python自動提取生成部落格園年度報告

Python自動提取生成部落格園年度報告

## 小狼的世界 的部落格園年度報告 Hi 小狼的世界 你在部落格園已經發表了**373**篇文章 2020年你一共寫了**24**篇文章 你在部落格園中的文章已經獲得了**2525064**次閱讀 **460**評論以及**208**次推薦 你閱讀量最高的一篇文章是 **Crontab的格式**,共有 **253792** 次閱讀 **YUI學習筆記 – CSS Rest、Base、Font以及Grid** 是你在 **02:03** 寫下的,夜已深注意休息 新的一年,希望你繼續筆耕不輟,在部落格園發表更多的文章 -------------------------------------------- 最近各個APP和網站都在搞年度總結,尋思著既然部落格園官方沒提供,就自己用Python寫一個吧。上面這些內容,是通過 Python 指令碼自動生成的。程式碼在後面可以看到,也可以參考我的 [GitHub](https://github.com/cocowool/py-cnblogs)。當然現在統計的內容還不太完善,畢竟是用一天時間擼出來的,如果大家有更好的想法,歡迎提交程式碼。 只需要本機安裝了Python環境就可以執行,如果沒有Python環境也沒關係,裝上Docker幫你快速搭建開發環境,可以參考我的 [利用Docker快速構建開發環境](http://edulinks.cn/2020/11/12/20201111-build-java-devlopment-env-with-docker/) ```python 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)) p