最近突然有点迷上攒博客,没有什么比有人看、排名上升更让人兴奋的了。可是日常总不能老盯着看增加了多少访问量,像排名这种也没办法记住变化,故粗浅调查了一下beautifulsoup4这个python写的html文件解析模块,写了一个小工具用来统计每篇原创文章的访问量变化,在电脑上跑crontab,定时向公司邮箱发送报告。
# filename:CSDNvisitReport.py
# Author: BaoJunxian
# Date: 6/11/2018
import requests, bs4, json
from logging import info, basicConfig, INFO
basicConfig(level=INFO)
def infoGet(url, mainSelector, detailSelector, oldDic):
response = requests.get(url).text
soup = bs4.BeautifulSoup(response, 'html.parser')
visit = int(soup.select('.grade-box dd[title]')[0].get('title'))
rank = int(soup.select('.grade-box dl[title]')[0].get('title'))
fileName = []
fileVisit = []
for i in soup.select(' '.join([mainSelector, detailSelector[0]])):
text = i.getText()
fileName.append(text.split('\n')[3].strip())
temp = []
for i in soup.select(' '.join([mainSelector, detailSelector[1]])):
temp.append(int(i.getText().split(':')[1].strip()))
for i in range(0, len(temp), 2):
fileVisit.append(temp[i])
dic = {fileName[i]: [fileVisit[i]] for i in range(len(fileName))}
dic['visit'] = [visit]
dic['rank'] = [rank]
for i in dic.keys():
if i in oldDic.keys():
dic[i].append(dic[i][0] - oldDic[i][0])
else:
dic[i].append(dic[i][0])
dic['rank'][1] = -dic['rank'][1]
#排名数值增加,实际排名降低
return dic
def reportGen(newDict):
with open('visitReport.txt', 'w') as target:
content = '''**************************
Today's summary is below:
*Total Visit: %s %s
*Rank: %s %s
**************************
Details:
''' % (newDict['visit'][0], newDict['visit'][1], \
newDict['rank'][0], newDict['rank'][1])
target.write(content)
target.write('\n')
for i in newDict.keys():
if i != 'visit' and i != 'rank':
target.write(''.join([i.strip().ljust(45, ' '), \
str(newDict[i][0]).ljust(5), \
str(newDict[i][1]).ljust(7), '\n']))
def main():
url = 'https://blog.csdn.net/qq_31331027?t=1'
#对于CSDN获取原创访问量,直接修改url为自己文章列表主页即可
detailSelector = ['h4 a', '.read-num']
mainSelector = 'main .article-list'
oldInfo = {}
try:
with open('visitData', 'r')as target:
oldInfo = json.load(target)
except:
pass
newDict = infoGet(url, mainSelector, detailSelector, oldInfo)
reportGen(newDict)
with open('visitData', 'w') as target:
json.dump(newDict, target)
if __name__ == '__main__':
main()
这是主要的运行程序,会生成当天的统计数据,主要记录数据为:总阅读量、总排名、每篇原创的阅读量以及这几个数据跟前一天对比的涨幅(跌幅)。在对这几类数据进行处理时,将数据名称作为key,数值value用list表示,list[0]表示当前数量,list[1]表示跟前一天list[0]数值上的差值。运行程序生成两个文件,一个是当日统计数据的字典,json形式保存(visitData),还有一个直接是visitReport.txt,记录报表内容,直接用于crontab发送邮件的文本内容(crontab的执行目录默认是从cron计划用户的家目录下面的,因此这两个visitX文件默认生成在用户家目录下面)。
其次,编写脚本自动执行程序以及发送邮件的命令(发送邮件我用的是linux,安装sendemail):
# filename:autoReport.py
import os,time
os.system('python /home/stanpao/python/CSDNreport/CSDNvisitReport.py')
time.sleep(120)
os.system('sendemail -s smtp.qq.com -f [email protected]\
-t [email protected] -u "CSDN Daily Report" -xu [email protected]\
-xp password -o message-content-type=text\
message-file=visitReport.txt message-charset=utf-8')
值得说明sendemail中几个参数:-s 是smtp服务器域名,如果qq就是smtp.qq.com,如果是163就是smtp.163.com;-f 发件人; -t 收件人; -u 邮件标题; -xu 发件人邮箱 ; -xp 发件邮箱密码 ; -o指定一些邮件内容参数: message-content-type – 邮件文本类型,message-file – 文本文件,message-charset – 邮件内容编码形式。至此,已经能够进行正常的report。
但是,要完全自动化发送每日报道,还需要地址crontab由系统自行完成:
0 9 * * * python /home/stanpao/python/CSDNreport/autoReport.py
以上,完全告终。收到邮件效果如下。其中,第一个数字为当前值,后一个数字为对比前一天的浮动数值。
代码略有粗糙,也没什么复用价值,重构也没啥必要,图个实用好玩,还望客官轻点~我还是个孩子~