背景
前面通过selenium爬取了微信公众号“新世相”的所有文章链接,详见使用Selenium获取微信公众号的所有文章。获取到的信息有:文章发表的时间、标题以及对应的url。那么根据时间可以绘制出文章发表情况的图表,先上结果图:
思路
读取csv
1
df_ori = pd.read_csv('articles.csv', sep=';', header=None)
筛选数据
我们获取到的源数据如下:
1
2
3"2019-03-02;看到44岁潘粤明的脸,我发现面对痛苦的最好方式是温柔";http://mp.weixin.qq.com/s?__biz=MzI2OTA3MTA5Mg==&mid=2651791151&idx=1&sn=d24b36c7af7f3a13e8ab9b8d4d11143f&chksm=f11e58b4c669d1a2fe70afe9fd2f2fdfe3cc1a17d0c48d8efa51ae8e10d17239c7ff0f8649b4&scene=21#wechat_redirect
"2019-03-01;“同时被3个男人追求,我选了最丑的”:看完这些70岁老人的遗憾,我啥都想开了";http://mp.weixin.qq.com/s?__biz=MzI2OTA3MTA5Mg==&mid=2651791096&idx=1&sn=eb68116d46fddf0e827475d9b26941b0&chksm=f11e5963c669d075ec8716073bec685f819df8c2dbc03b87f23347ba5b01ea4219864877b4a0&scene=21#wechat_redirect
"2019-02-28;在同学会上遇见初恋:他盯了我 5 秒,说出我等了 10 年的那句话";http://mp.weixin.qq.com/s?__biz=MzI2OTA3MTA5Mg==&mid=2651790909&idx=1&sn=f642cd31fbc8d41d0b4fbe949b51425a&chksm=f11e59a6c669d0b0e5e7ee12cece0a4afaa995aa123b8e993f8ec10d8ba38cccdcf5290de25a&scene=21#wechat_redirect| 第一列 | 第二列 |
| ——— | —— |
| 日期;标题 | url |那么我们只要获取第一列,并根据分隔符
;
进行拆分就可以得到日期与标题的对应关系:1
2
3# 取第一列并分割日期与标题
df = df_ori.iloc[:, 0]
df = df.str.split(';', expand=True)格式化数据
现在给数据设置列别名并进行格式化操作
1
2
3
4# 格式化日期,设置column,并将日期设置为index
df.columns = ['date', 'title']
df.date = pd.to_datetime(df.date)
df = df.set_index('date')数据统计
我们需要计算每个月新世相公众号发表的文章数,那么需要按月重新取样,并汇总统计文章数
1
2# 按月统计文章数"MS"为月初
cacu = df.resample("MS").count()画图
配置画布大小
由于时间跨度从2015年至今比较长,我们需要先配置一下画布大小。
1
2# 画图
fig, ax = plt.subplots(figsize=[20, 5])配置线条展示:值处用圆点加粗
1
2# 线条
ax.plot(cacu, 'o-')配置中文展示
1
2
3
4
5# 通过设置中文字体方式解决中文展示问题
font = FontProperties(fname='../font/PingFang.ttc')
ax.set_title("新世相文章统计", fontproperties=font)
ax.set_xlabel("日期", fontproperties=font)
ax.set_ylabel("文章数", fontproperties=font)配置横轴展示
由于按月画图,我们横轴显示为
年-月
,我们这里对横轴设置两层坐标,第一层仅展示月份,第二层展示年份,这样可以防止因为横轴字符挤在一起。第二层坐标格式中增加\n\n
用于换行,给第一层月份留出空间。1
2
3
4
5
6
7# 设置时间轴
formater = mdate.DateFormatter('%Y-%m')
ax.xaxis.set_major_formatter(formater)
ax.xaxis.set_minor_locator(mdate.MonthLocator())
ax.xaxis.set_minor_formatter(mdate.DateFormatter('%m'))
ax.xaxis.set_major_locator(mdate.YearLocator())
ax.xaxis.set_major_formatter(mdate.DateFormatter('\n\n%Y'))显示数值
1
2
3# 显示数值
for a,b in zip(cacu.index, cacu.values):
ax.text(a, b, b[0])显示图片
1
plt.show()
结论
最后画图如下:
可见,新世相也是从16年开始逐步兴起,基本上保持每天一篇的频率一致稳定发展至今。
完整代码参考:https://github.com/keejo125/web_scraping_and_data_analysis/tree/master/weixin