我相信对于很多爱好和习惯写博客的人来说, 如果自己的博客有很多人阅读和评论的话, 自己会非常开心, 但是你发现自己用心写的博客却没什么人看, 多多少少会觉得有些伤心吧? 我们今天就来看一下为什么你的博客没人看呢?
一, 页面分析
首先进入博客园首页, 可以看到一页有 20 篇博客简介, 然后有 200 页, 也就是说总共有 20*200=4000 篇博客. 这时我们点击下一页, 可以看到网页上的链接变成了 https://www.cnblogs.com/#p2, 看起来好像很简单 -- 只需要改变 #p 后面的数字就好了, 真的是这样吗? 打开开发者工具, 刷新页面, 可以找到如下链接:
所携带的参数是这样的:
我们很容易就知道只需要改变 PageIndex 的数值就能实现翻页了.
二, 解析网页
返回的结果如下图:
我们可以很方便的使用 xpath 来解析, 相关代码如下:
- et = etree.html(HTML)
- title_list = et.xpath('//*[@class="post_item_body"]/h3/a/text()') # 标题
- author_list = et.xpath('//*[@class="post_item_foot"]/a/text()') # 作者
- time_list = et.xpath('//*[@class="post_item_foot"]/text()') # 发布时间
- read_list = et.xpath('//*[@class="post_item_foot"]/span[2]/a/text()') # 阅读数
- comment_list = et.xpath('//*[@class="post_item_foot"]/span[1]/a/text()') # 评论数
这里得到的数据都是 "发布于 2019-01-23 14:16","评论 (0)","阅读 (86)" 这种, 这样显然不利于我们对数据进行分析, 所以还需要进行一下处理, 相关代码如下:
- # 处理数据
- time_list = [i.strip().lstrip('发布于') for i in time_list if i.strip() != '']
- comment_list = [int(i.strip().strip('评论 (').rstrip(')')) for i in comment_list]
- read_list = [int(i.strip().strip('阅读 (').rstrip(')')) for i in read_list]
三, 存储数据
这次我使用的数据库是 MySQL 数据库, 首先创建一个数据表 blogs,SQL 代码如下:
- create table if not exists blogs(
- title varchar(100) not null,
- author varchar(30) not null,
- rtime varchar(30) not null,
- readnum int(6) not null,
- commentnum int(6) not null);
然后就可以把爬取的数据都保存到数据库里, 最后进入数据库查看一下:
四, 数据分析
大家都是几点写博客的呢? 什么时候写的博客会被更多人看到呢? 这里我们可以建一个字典 dic1, 一个数字代表一个小时, 其对应的值就是这个小时里发布的博客的数量之和, 如下:
- dic1 = {
- 0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0,
- 13: 0, 14: 0, 15: 0, 16: 0, 17: 0, 18: 0, 19: 0, 20: 0, 21: 0, 22: 0, 23: 0,
- }
同理还可以建立一个一样的字典 dic2, 但是 dic2 中每个键的值是这个小时里发布的博客的阅读量之和.
由于一天的数据量比较小, 也不能说明问题, 然后通过查看数据库中的数据, 可以知道最近的一篇博客是 2019 年 1 月 22 日写的, 而最早的一篇的博客是 2018-11-22 日写的, 所以我们可以把 2018 年 12 月整个月的数据提取出来进行分析, 这样的话数据量不算少, 得到的结果也就更有说服力. 相关代码如下:
- # 查看 2018 年 12 月的数据
- day_list = ["2018-12-{}".format(str(i).zfill(2)) for i in range(1, 32)]
- for day in day_list:
- results = [i for i in all_data if day in i[0]]
- for result in results:
- t = int(result[0].split('')[1].split(':')[0])
- dic1[t] += 1
- dic2[t] += result[1]
最后根据结果绘制柱状图.
每小时发布的博客篇数:
每小时发布的博客阅读数:
从第一张图可以看到在早上 9 点 - 11 点和下午 3 点 - 5 点是发布博客的高峰期, 在中晚饭时段也有不少人发博客, 还有很多人选择在晚上下班之后写博客, 比较意外的是凌晨三四点的时候也有人写博客, 可以说是很厉害了. 根据第二张图可以知道在早上 8 点 - 10 点发的博客比较容易得到高阅读量, 下午 2 点 - 5 点也是比较不错的写博客的时间, 而凌晨写博客的话就比较难被大家看到了, 毕竟这个时候大多数人还在梦乡之中. 要想你的博客被更多人看到和喜欢, 除了选择一个合适的写博客的时间, 最重要的就是用心写出一篇好的博客!
完整代码已上传到 GitHub!
来源: https://www.cnblogs.com/TM0831/p/10308894.html