淦,老底被人揭了
晚上好,我是小五
刚收到这个文档的时候
我是懵逼的
心惊胆战打开一看
还好还好
其实是一位读者帮我和『凹凸数据』做的年终总结,不过这标题也太吓人了吧
正好今天大年初一
咱们一起看看
一、前言
听到获取深扒『凹凸数据』这个公众号,啪的一下就点进来了,很快啊。
通过百度和谷歌发现现在大家爬微信公众号历史文章信息的思路基本都是下面两种:
通过搜狗搜索微信公众号然后拿到链接 通过 Fiddler 检测手机微信拿到链接
经过考虑,首先放弃了搜狗,因为初步看了一下搜狗的公众号搜到的那里只有前十篇文章的链接,用 Fiddler 抓包的办法又比较复杂,下面采用一种更简单的办法。
二、获取历史文章信息
注册一个自己的微信公众号,想一个好听的名字,先占一个位。
注册链接:https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CN&token=
登陆自己的微信公众号,进入新建图文素材界面
点击超链接,选择其他公众号,搜索凹凸数据,可以看到历史文章信息。
Request URL后面的链接复制下来,在新的网页中打开可以看到数据
最简单的办法:复制粘贴大法,首先创建 80 个txt,因为查看历史文章信息知道凹凸数据有 80 页的历史文章信息。
将每一页返回的响应里的 Response 里的内容复制粘贴到对应的txt里,全选中,Ctrl+C—>Ctrl+V—>Ctrl+S,Alt + Tab 切界面要快,手速要快,80个,几分钟的事儿。
现在微信公众号历史信息真不好爬,手动翻个几十页,中间还有复制粘贴数据停歇,都会被控制访问频率,被封了,不给你返回内容了。等个一两个小时再来看看。读者可以自行尝试构造 URL 然后写爬虫去请求,两个关键参数 fakeid 和 token 是你公号的标识,begin参数控制翻页,但没爬取到多少就会被封了。
https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=(your fakeid)&type=9&query=&token=(your token)&lang=zh_CN&f=json&ajax=1
https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=5&count=5&fakeid=(your fakeid)&type=9&query=&token=(your token)&lang=zh_CN&f=json&ajax=1
https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=15&count=5&fakeid=(your fakeid)&type=9&query=&token=(your token)&lang=zh_CN&f=json&ajax=1
三、提取和查看数据
所有历史文章信息在本地 txt 里,利用 python 将想要的数据提取出来
title:文章标题 link:文章链接 update_time:文章更新时间 cover:文章封面配图
# -*- coding: UTF-8 -*-
import json
import time
import os
import openpyxl
wb = openpyxl.Workbook() # 创建工作簿对象
sheet = wb.active # 获取活动的工作表
# 添加列名
sheet.append(['文章标题', '更新时间', '文章链接', '文章封面图'])
# 获取所有txt 并提取数据
files = os.listdir('./数据')
for item in files:
path = os.path.join('./数据', item)
# print(path)
with open(path, encoding='utf-8') as f:
con = f.read()
data = json.loads(con)['app_msg_list']
for item in data:
title = item['title'] # 文章标题
# 更新时间的时间戳转换为格式化的时间
create_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(item['update_time']))
link = item['link'] # 文章链接
cover_pic = item['cover'] # 文章封面图
sheet.append([title, create_time, link, cover_pic])
print([title, create_time, link, cover_pic])
wb.save(filename='凹凸数据历史文章信息.xlsx')
print('====== Done! ======')
需要注意的是:"update_time": 1609515129,更新时间是以时间戳格式给出的,需要将其转换为格式化的时间再保存。
凹凸数据到现在已经发了 700 多篇文章,第一篇文章在 2019-04-22 00:44:58 首发,2020年里共发了 705 篇文章,爬虫、数据分析、可视化、方法论,一条龙服务!业务范围:Python、SQL、Excel......,分享了很多有用的知识,帮助读者学有所获和解决技术问题,当然,还有许许多多的送书活动,给小五点赞。
四、数据可视化
先来看看凹凸数据的文章标题关键词
# -*- coding: UTF-8 -*-
import pandas as pd
import jieba
import collections
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_excel('凹凸数据历史文章信息.xlsx')
title = df['文章标题']
# 获取停用词的集合
with open('stop_words.txt', 'r', encoding='utf-8') as f:
stop_words = set(f.read().split())
# print(stop_words)
word = []
for item in title: # 滤除停用词和单个词
words = jieba.cut(item, cut_all=False)
for i in words:
if len(i) > 1 and i not in words:
word.append(i)
# 统计词频
word_counts = collections.Counter(word)
# WordCloud绘制词云
my_cloud = WordCloud(
background_color='white', # 设置背景颜色 默认是black
width=800, height=550,
max_words=200,
font_path='simhei.ttf', # 设置字体 显示中文
max_font_size=160, # 设置字体最大值
min_font_size=15, # 设置字体最小值
random_state=120 # 设置随机生成状态,即多少种配色方案
).generate_from_frequencies(word_counts)
# 显示生成的词云图片
plt.imshow(my_cloud, interpolation='bilinear')
# 显示设置词云图中无坐标轴
plt.axis('off')
plt.show()
运行效果如下:
Python、数据分析、数据、可视化、Excel、干货等词语出现频率很高,SQL、Pandas、matplotlib、统计学也很显眼,这很凹凸数据。
分析凹凸数据 2020 年每月发文情况
# -*- coding: UTF-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import collections
import random
# 读取数据
df = pd.read_excel('凹凸数据历史文章信息.xlsx')
# 取2020年的文章信息
update_time = df[df['更新时间'].str[:4] == '2020']['更新时间']
month_count = update_time.str.split('-', expand=True)[1]
month_count = collections.Counter(month_count).most_common()
print(month_count)
counts = sorted(month_count, key=lambda x: x[0]) # 按月份排好序
print(counts)
month, nums = [], []
for item in counts:
month.append(f'{item[0][1]}月' if item[0][0] == '0' else f'{item[0]}月')
nums.append(item[1])
# 颜色列表 随机打乱
colors = ['#FF0000', '#0000CD', '#00BFFF', '#008000', '#FF1493', '#FFD700', '#FF4500', '#00FA9A', '#191970', '#4682B4', '#2F4F4F', '#000000']
random.shuffle(colors)
# 设置中文显示
mpl.rcParams['font.family'] = 'SimHei'
# 设置大小 像素
plt.figure(figsize=(9, 6), dpi=120)
# 绘制柱形图 配置x y轴 标题
plt.bar(month, nums, width=0.75, color=colors)
plt.xlabel('月份')
plt.ylabel('发文数量')
plt.title('凹凸数据2020年每月发文数量对比', fontsize=16)
plt.savefig('柱形图.png')
plt.show()
运行效果如下:
2020年1、2月发文数量较少,小五可能在为年终绩效而忙碌和准备回家过年,肝文章的时间较少,3月份发文数量一下蹭蹭上涨,发文数量接近 80 篇,之后发文数量每月有所波动,9月到 12 月发文数量稳定,波动不大。
小五更爱在什么时间段发文?
# -*- coding: UTF-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import collections
# 读取数据
df = pd.read_excel('凹凸数据历史文章信息.xlsx')
# 取2020年的文章信息
update_time = df[df['更新时间'].str[:4] == '2020']['更新时间']
time_count = update_time.str.split(' ', expand=True)[1]
time_count = time_count.apply(lambda x: x[:2]) # 取小时
# print(time_count)
hour_count = collections.Counter(time_count).most_common()
print(hour_count)
counts = sorted(hour_count, key=lambda x: x[0]) # 按小时时间排好序
print(counts)
hour, nums = [], []
for item in counts:
hour.append(f'{item[0][1]}点' if item[0][0] == '0' else f'{item[0]}点')
nums.append(item[1])
print(hour)
print(nums)
# 使用风格样式
plt.style.use("ggplot")
# 设置中文显示
mpl.rcParams['font.family'] = 'SimHei'
# 设置大小 像素
plt.figure(figsize=(9, 6), dpi=120)
# 绘制柱形图 配置x y轴 标题
plt.bar(hour, nums, color='red')
plt.xlabel('时间')
plt.ylabel('发文数量')
plt.title('凹凸数据2020年不同时间段发文数量对比', fontsize=16)
plt.savefig('柱形图02.png')
plt.show()
运行效果如下:
# -*- coding: UTF-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib import cm
import collections
import mplcyberpunk
# 读取数据
df = pd.read_excel('凹凸数据历史文章信息.xlsx')
# 取2020年的文章信息
update_time = df[df['更新时间'].str[:4] == '2020']['更新时间']
time_count = update_time.str.split(' ', expand=True)[1]
time_count = time_count.apply(lambda x: x[:2]) # 取小时
# print(time_count)
hour_count = collections.Counter(time_count).most_common()
print(hour_count)
counts = sorted(hour_count, key=lambda x: x[0]) # 按小时时间排好序
print(counts)
hour, nums = [], []
for item in counts:
hour.append(f'{item[0][1]}点' if item[0][0] == '0' else f'{item[0]}点')
nums.append(item[1])
print(hour)
print(nums)
# 使用风格样式 赛博朋克风格
plt.style.use("cyberpunk")
# 设置中文显示
mpl.rcParams['font.family'] = 'SimHei'
# 设置大小 像素
plt.figure(figsize=(9, 6), dpi=120)
# 绘制折线图 配置x y轴 标题
plt.plot(hour, nums, color=cm.spring(2))
plt.xlabel('时间')
plt.ylabel('发文数量')
plt.title('凹凸数据2020年不同时间段发文数量', fontsize=16)
# 设置线条发光+面积图
mplcyberpunk.add_glow_effects()
plt.savefig('折线图02.png')
plt.show()
# 运行结果
[('21', 226), ('20', 167), ('13', 130), ('12', 35), ('09', 30), ('08', 19), ('11', 16), ('17', 15), ('18', 14), ('19', 13), ('16', 10), ('10', 9), ('14', 7), ('22', 7), ('23', 5), ('15', 2)]
[('08', 19), ('09', 30), ('10', 9), ('11', 16), ('12', 35), ('13', 130), ('14', 7), ('15', 2), ('16', 10), ('17', 15), ('18', 14), ('19', 13), ('20', 167), ('21', 226), ('22', 7), ('23', 5)]
['8点', '9点', '10点', '11点', '12点', '13点', '14点', '15点', '16点', '17点', '18点', '19点', '20点', '21点', '22点', '23点']
[19, 30, 9, 16, 35, 130, 7, 2, 10, 15, 14, 13, 167, 226, 7, 5]
小五发文时间:8点到 23 点各个时间段都有,主要集中在中午 1 点,可能利用上班时午休时间写文章,然后就是晚上8、9点,记得以前是晚上 9 点,我们不见不散来着,晚上 9 点这个时间段发文数量最多,共有有 226 篇。
最后要感谢一下这位读者,帮小五总结了一下『凹凸数据』的基本情况。
有些文章Flag没完成,小五一定尽快补上。『凹凸数据』作为一个数据号,去年的文章中Python占比有些过多。那么明年一些Python技术类,但不涉及数据分析的文章,就会主要发在『快学Python』上了,还没关注的小伙伴可以来关注一下👇
最最后公布一下昨天文章的奖励情况,本来小五想抽出几位送出拜年红包。后来看着大家的祝福词,心想干脆就都送吧,不过微信红包一个一个发太麻烦,小五将在后台为每位留言祝福的小伙伴送出188凹凸币,谐音“要发发”!
我是小五,明天见!