开门见山,我是个俗人,俗不可耐的那种。
几天前开始日更,至今已有9篇或流水账或菜鸡技术篇问世,论钻石,我仰望大佬,论评论,我仰望大佬,论点赞,我仰望大佬,论浏览量,我依旧仰望大佬。人都说,写文章嘛,记录生活就好了,何必那么在意。我也这么想,但总感觉没人看的时候,自己会好受挫。我承认我俗了。每天打开简书刷新文章页面的时间占我玩手机的百分之80以上。文章少的时候,我还能靠我超(普)强(通)的记忆力,记住每篇文章的阅读数,并与上次记忆时作比较,嘴角露出一丝猥琐的笑。如今不行了,文章越来越多,人也越来越俗。那么,咱就来想办法解决解决。
昨天刚开始学爬虫,爬了最好大学网,实在有趣至极。心里实在痒得不行,我们今天就来爬简书。并且,我们将爬出来的数据进行可视化,输出至图片,曲线总是比图片好看不是嘛。说干就干,它来了。
先来看看我们的主页:

接下来查看网站源码:

可以十分清晰的看到,我们需要的浏览量,还有标题都被
<a class="title" target="_blank" href="/p/96fc3adaf818">北方人的面食生活</a> 类似的标签包裹,那就好办多了。
下面直接上代码:
代码部分1:导入需要的库,此处并未使用高级爬虫框架,依然采用的是requests,使用了正则表达式re来匹配我们要查找的字段,使用了time来实现每过20分钟查询一次功能的实现,以及每次查询时间的记录等等,最最生涩的库matplotlib图表库,来实现数据的可视化
import requests
import re
import time
import matplotlib.pyplot as plt
代码部分2:此为低级爬虫获取网站源码的框架。
def getHTMLText(url):
try:
kv = {"user-agent": "Mozilla/5.0"}
r = requests.get(url, headers=kv, timeout=30) # 设置代理才能进入
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print("异常")
return ""
代码部分3: 构造正则表达式,查询我们需要的浏览量和标题
def parsePage(uList, html):
titlelist = re.findall(r'<a class="title" target="_blank" href=".+">(.+)</a>', html)
viewcountlist = re.findall(r'<i class="iconfont ic-list-read"></i>(.+)', html)
for i in range(len(titlelist)):
uList.append([viewcountlist[i], titlelist[i]])
代码部分4: 输出到文件,为了达到与上次浏览量的对比,我们将每次的记录追加至csv文件中
def printGoodsList(uList):
with open("D://textdata.csv", "a") as file:
for g in uList:
file.write(",".join(g) + "," + str(time.strftime("%H:%M", time.localtime())))
file.write("\n")
可以看到csv文件如下图:

代码部分5: 读取并处理数据,将所有数据从文件中读出,并进行格式处理。
格式如:{“北方人的面食生活”:[[163,164,165],[16:47,16:48,16:48]]}以字典形式进行保存,键为标题,值的第一字段为浏览量列表,第二字段为记录时间列表
def getDatafromfile():
with open("D://textdata.csv", "rt") as file:
datalines = file.readlines()
datadict = {}
for line in datalines:
linelist = line.strip().split(",")
datadict.setdefault(linelist[1], [[], []])[0].append(linelist[0])
datadict.setdefault(linelist[1], [[], []])[1].append(linelist[2])
linechart(datadict) # 数据处理完毕,调用画图函数
代码部分6:数据可视化。
def linechart(datadict):
datalist = list(datadict.items())
colors = ["red", "green", "gray", "black", "gold", "blue"]
plt.figure(figsize=(20, 10))
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
for i in range(len(datalist)):
plt.subplot(len(datalist) // 3+1, 3, i + 1) # 分成几行几列 最后一位为几张图
plt.plot(datalist[i][1][1], datalist[i][1][0], color=colors[i % 6])
plt.xlabel(datalist[i][0])
plt.tight_layout()
plt.savefig('C://Users//rookie//Desktop//textdata.png')
plt.show()
代码部分7:定义主函数,并进行定时处理。
def main():
infolist = []
url = "https://www.jianshu.com/u/a264a2c4184f"
html = getHTMLText(url)
parsePage(infolist, html)
printGoodsList(infolist)
getDatafromfile()
# 每n秒执行一次
def timer(n):
while True:
main()
time.sleep(n)
timer(1200) #20分钟
结果令人舒适,轻松加愉快:

事后烟:
丑是丑了点,但是妈妈再也不用担心我每天盯着手机记浏览量了。下一步准备生成可执行文件,放在服务器执行。可怜的浏览量。一起加油!!!
更新:
使用如下命令打包成exe文件,发送到桌面快捷方式,双击执行即可。


网友评论