猿人学Python

Python 教你动态展示微博热搜排名变化

本篇为读者投稿,还是来自帅锅锅,本篇稿费是400。 帅锅锅已连续投稿3篇啦,他的动手能力貌似不错,目前在郑州大学四年级,有看上的老板可以联系我噢。

最近发现动态排名视频很火,看的我心痒痒,总想用 python 也做个微博热搜排名动态变化视频,动态看到微博排名变化,好让我那每天恨不得趴在微博热搜排名变化上的女朋友从手机上解脱出来,经过一下午的实践终于用 python 把这个视频做出来了,效果如下:

下面我将一步步详细介绍实现过程。

总体大概分为2个过程:

第一步是定时采集微博热搜排名数据;

第二步是用 matplotlib 画出动态排名图。

第一步:requests 模拟请求,定时采集微博热搜排名数据

1.直接从网页版微博下手,找到热搜所在页

Image

2.打开浏览器自带流量分析工具,刷新网页,找到传输热搜排名数据的 url

Image

第一个就是哦,只要定时模拟向这个 url 请求,就会返回最新数据,非常简单。

3. requests 模拟请求,要带着自己的 cookie 值哦,否则是无法返回正确数据的。

Image

4.解析返回网页,取出微博热搜内容、热度值等数据

Image

每条数据都存在这样的数据结构中,用 BeautifulSoup 很轻易的就解析出来了

Image

5.用 schedule 模块每1分钟爬一次数据

Image

其中 run 为爬取微博排名的程序。最后再存入表格中备用。

第二步:根据爬取用matplotlib.animation画出动图

1.先画出一张简单排名图

首先用panda读取第一步保存在表格中的数据

Image

传入3个参数,第一个表格文件名,第二个是解码方式(只有gbk格式可以,utf-8格式会出错),第三个数据相当于给表格中的每列数据命名,例如我要取微博排名内容就可以用df[‘title’]表示,取热度信息可以用df[‘num’]表示。

然后将某时刻的微博排名信息展示到直方图中

Image

效果如下

Image

接着将热搜内容和热度按排名顺序放置到直方图中,将排名第一的内容放到图的上端,再将时间戳放到右下角位置

Image

ax.text的参数介绍,前2个表示x和用y坐标,第3个表示要显示的文本,size表示字体大小,color表示字体颜色,transform=ax.transAxe表示文本在图片中的先对位置,还有其他参数,这里没有用到,感兴趣的可以自行研究。

效果如下

Image

2.渲染元素

首先设置x坐标轴,给x轴坐标刻度科学技术,然后将坐标数据放置到顶端,接着设置整个坐标轴可以缩放,以便后续动态展示数据,最后画x轴网格虚线,并设置网格虚线在图形后方展示

Image

效果如下

Image

设置y轴坐标

Image

效果如下

Image

给柱状图设置颜色

Image

给每个排名的柱形图设置1个不同的颜色,效果如下:

Image

3.用animation.FuncAnimation画出动图

第一张图已经做好了,从上我们可以看出,我们是根据时间戳选择数据的,上面的静态图是由1个时间戳的数据做出来的,想要图形动起来,根据时间流动态展示数据,就要定期用时间戳来调动上述数据,这时就用到matplotlib.animation函数

Image

draw是画单张图的程序组成的函数,frames是传入的参数,interval是时间间隔,其中为了取出所有时间戳并保证顺序不变,我加了个sortTime函数,这个很好实现。

微博排名动图展示到此已经做完,还有很多可以优化的地方,主要是美观渲染方面,感兴趣的可以深入研究一下。

公众号后台回复:wb 有该篇文章完整代码。

继续接受投稿中,300-500/篇。详情可看这篇:

来通过写技术文章挣钱

近期好文:

APP爬虫之-Protobuf协议逆向解析

爬虫之-某生鲜APP加密参数逆向分析