☞ ░ 前往老猿Python博文目录 ░
一、引言
最近几天老猿博客的访问量出现了比较大的增长,从常规的1000-3000之间波动的范围一下子翻了将近一倍,粉丝增长从日均10-40人也增长了差不多一倍,下面是csdn提供的博文访问量数据图和粉丝增长数据图:
突然增长的情况让人始料不及,老猿非常想弄清楚这些访问量和粉丝是什么文章带来的。但看了下不是最新发布博文,而以前的博文又不记得阅读量是否增长,如果要自己去翻非常麻烦,因为老猿博客文章有点多,自己写的加转发的有900多篇,因此想既然好歹学了爬虫,还是自己写个程序去CSDN获取和记录数据吧。
二、背景知识
- 为了从CSDN爬取数据,本文用到了爬虫程序常用的urllib.request和BeautifulSoup,相关内容介绍请参考老猿《爬虫专栏》的介绍。但要说明一下,该专栏中介绍的爬取CSDN文章的处理方式,由于CSDN网站后来进行了一次全面的升级,大部分使用urllib.request爬取CSDN的案例已经不适用,老猿暂时也没想重新去研究和更新,但其原理完全可以用于其他网站;
- 爬取下来的信息记录到excel文件中,使用了xlwings的excel操作方法,相关内容介绍请参考《Python中高级知识(非专题部分)学习随笔》的介绍。
三、爬取文章阅读量使用的CSDN博文内容结构介绍
爬取CSDN博文阅读量,与CSDN博文相关的网页内容包括两部分,一是博文列表的翻页机制,一是每页显示博文列表的内容。
3.1、CSDN博文翻页机制
CSDN博文的翻页机制是基于每页都在相同目录下,目录名为:
“https://blog.csdn.net/LaoYuanPython/article/list/
”,
如第一页的url地址为:https://blog.csdn.net/LaoYuanPython/article/list/1
。
后续每下翻一页序号加1,但要说明的是,该翻页数字可以不停增长,如果对应页面序号超出了所有博文数,对应页面会显示如下信息:
3.2、每页文章列表的识别
通过按页向CSDN发起请求后,CSDN会返回对应页的页面内容,在页面内容中与博文列表的数据都在<div class="article-list">
这个起始标签及其结束标签对应的块内,这部分中每篇文章的标题、URL和阅读量信息都包含在起始标签<div class="article-item-box csdn-tracking-statistics" data-articleid="xxxxx">
和其结束标签之间的块内。
下面就是一个典型的页面包含的文章内容的块:
<div class="article-item-box csdn-tracking-statistics" data-articleid="106533164">
<h4 class="">
<a href="https://blog.csdn.net/LaoYuanPython/article/details/106533164" target="_blank">
<span class="article-type type-1 float-none">原创</span> moviepy音视频剪辑:视频剪辑基类VideoClip详解 <span class="plan-icon">
<img class="article-plan-img article-heard-img" src="https://csdnimg.cn/release/phoenix/template/new_img/planImg.png" alt="">
<div class="plan-tip">原力计划</div>
</span>
</a>
</h4>
<p class="content">
<a href="https://blog.csdn.net/LaoYuanPython/article/details/106533164" target="_blank">
本文是笔者基于moviepy.video.VideoClip.py的文档字符串以及源代码,结合查阅资料和验证测试,断断续续持续了一个多星期探索的结果。详细介绍了视频剪辑基类VideoClip的构造方法、属性和相关处理方法,其中很多方法如save_frame、write_videofile、writ... </a>
</p>
<div class="info-box d-flex align-content-center">
<p>
<span class="date">
2020-06-11 00:05:41</span>
<span class="read-num"><img src="https://csdnimg.cn/release/phoenix/template/new_img/readCountWhite.png" alt="">145</span>
<span class="read-num"><img src="https://csdnimg.cn/release/phoenix/template/new_img/commentCountWhite.png" alt="">0</span>
</p>
</div>
<div class="opt-box">
<button class="btn-opt" data-type="top">置顶</button>
<a class="btn-opt" href="https://editor.csdn.net/md?articleId=106533164">编辑</a>
<button class="btn-opt" data-type="delete">删除</button>
</div>
</div>
其中文章的标题和URL地址在如下标签路径内:div div h4 a
,阅读量在起始标签:<span class="read-num">
对应的标签内,不过有2个‘read-num’,只有第一个是阅读量,第二个是评价量,我们不关注。
一个页面有多个文章列表,通常为40个。
四、excel的操作
本案例内,是通过保存不同时间点的阅读量,有了不同时刻的阅读量数据,通过对比就可以知道某段时间内热门博文是哪些。本文仅实现了博文数据的excel记录,对比可以通过人手工对比。
为了实现这些功能,对excel的功能包括判断文件是否存在、读入上次记录、查找博文是否在excel中存在、将最新记录更新到对应博文或插入一个新的博文数据,每次访问的时间点记录在excel的第一行作为标题栏。
由于excel的操作性能并不高,比python列表慢,因此博文内容的查找和更新都是通过列表进行的,excel的操作只进行了初始运行时读入文件到列表、最后将内存列表中的内容输出到excel对象、将excel对象的数据保存到excel文件中这几步。
五、实现代码
5.1、二维列表的行列位置交换函数
下面的函数是将二维列表的行和列进行交换,可以将一个如a[100][3]的数组变成b[3][100],其目的是为了提高excel对象更新的效率,具体可参考《一个使用xlwings操作excel数据优化60倍处理效率的案例》的介绍。
def exchangeLineColumn(array):
columncount = len(array[0])
rowcount = len(array)
columnData = []
for i in range(columncount):
columnData.append([])
for line in array:
columnPos = 0
for column in line:
columnData[columnPos].append(column)
columnPos += 1
return columnData
5.2、构建http请求头函数