一次不算愉悦的爬虫与可视化之旅

2023-12-26 17:10

本文主要是介绍一次不算愉悦的爬虫与可视化之旅,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方“超哥的杂货铺”,轻松关注

本文用一个实例“还原”爱奇艺指数的两幅图表,带你学习pyecharts可视化。目录安排如下:
两个目标效果与数据来源分析目标1:绘制播放地域分布图    数据获取    数据处理    图形绘制    优化参数    遗留问题目标2:绘制明星看点曲线图    数据获取    数据处理    图形绘制    单个明星看点    全部明星看点    遗留问题总结


以上是截取自pyecharts官方github上的介绍,来源:

https://github.com/pyecharts/pyecharts。相比于基础的Matplotlib绘图库,pyecharts的图形更加好看,支持交互式,使用也非常简便。

本文使用了爱奇艺指数工具,选取了前段时间比较火的电视剧《小欢喜》为参照,使用pyecharts,尝试一步一步还原该剧的看点和播放地域分布的实际效果图,使用的pyecharts版本为0.5x,(注意和最新的1.0不兼容)。在开始之前请安装该版本,并安装相应的中国地图包。

pip install pyecharts==0.5.11
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg

本次的目标站点为http://index.iqiyi.com,我们首先搜索关键词“小欢喜”,通过浏览器抓包的方式,获取数据,然后把这些数据进行一定的加工,方便pyecharts进行调用,之后通过设置一些参数,达到理想的效果,我会详细说明每个参数对应的实际含义。后台回复“小欢喜”获取全部代码。

两个目标效果与数据来源分析

目标数据是通过json方式存储的,我们只需要使用requests库模拟请求,就可以很容易得到网站的源数据。本次的绘图目标主要是两个:①热度tab下的播放地域分布;② 看点tab下的明星看点分布。见下图。


我们从chrome开发者模式的network选项卡中找到这两个数据,并用下面的代码获取初始数据。
目标1:绘制播放地域分布图
数据获取

输出province的结果如下图

可以看出结构还是非常简单的。我们需要的数据正是data里的name和value。

数据处理

在正式开始引入pyecharts之前,需要说明一个小坑(别问我怎么知道的,简直太折磨人了):这里的省份名不能直接使用,pyecharts能够识别的地名是:北京,上海,内蒙古等形式的,不能带有后面的省,市等字,上面的数据直接绘制是没有效果的(台湾是有结果的,因为它没有“省”这个字)。数据处理的代码如下:

图形绘制

我们的目标是一个中国地图的样式,所以需要用到pyecharts的Map图形,下面是Map的文档说明:

这样我们就绘制出了基本的图形,如果用鼠标在地图上移动,已经能够正确显示数值了。但显然这样的图形和我们的目标差距还很大,接下来我们进行一些参数的调整。

优化参数

首先是将地图着色,需要用到参数:is_visualmap=True,效果如下:

虽然颜色是有了,但是只有一种颜色,这是因为默认的颜色数值是从0-100,表示从浅到深的颜色,并且是连续的,而我们这里的“value”值显然是远大于100的。因此我们需要指定颜色的范围。使用visual_range=[21508, 76318672]即可,该列表的值分别为province_values的最大和最小值。修改代码如下:可以看到,颜色的填充已经出来了,不同省份有了不同的颜色。

进一步我们注意到,目标图形中并不是每个省份一个颜色,而是好多省份显示同一种颜色,由高到低显示5种级别的绿色,颜色越深,数值越大。例如,北京是第一级别,颜色最深,江苏上海浙江是第二级别,显示同样的第二级别绿色,以此类推。读者可以在源网站上通过点击左下角的色块进行查看。

那么pyecharts如何将颜色分为不同的等级呢?答案是使用is_piecewise=True设置为分段型(默认为连续),并且使用visual_split_num设置分段个数,如这里需要设置为5。效果如下:


分段的效果是出来了,但是颜色不是我们想要的,我们需要使用

visual_range_color 指定颜色的值。

指定了visual_range_color后,分段效果出来了 ,现在的问题是,它用浅色表示值大的,深色表示值小的,所以我们可以在指定颜色的时候进行一个反转,即:

visual_range_color=['#3DC768', '#57D284', '#7ADDA0', '#A0E7BC', '#C9F1D9'][::-1]#表示将列表倒序

另外,目前的分段值是自动计算出的,我们还可以使用pieces参数指定每一分段的颜色范围。max值是本段的最大值,min为本段的最小值,我这里设定min为低一级段的最大值加1。label可以指定色块右侧的标签,好像去不掉,如果不指定的话就会显示数值。

pieces=[{"max": 76318672, "min": 54372809, "label": "高"},{"max": 54372808, "min": 46136120, "label": "中高"},{"max": 46136119, "min": 30790974, "label": "中"},{"max": 30790973, "min": 15530879, "label": "中低"},{"max": 15530878, "min": 21508, "label": "低"}]

左下角的图例里low和High的值也可以通过visual_range_text来指定,可以指定为空,也可以指定为“高”和“低”

我们继续把图中每个省的红点去掉一起看效果。参数is_map_symbol_show控制是否显示红点,默认为Ture,我们改为False即可。最终代码和效果如下:


对了,你可能会问我怎么知道这些颜色的16进制值的,我告诉你,我一个一个量的(捂脸…为了此文操碎了心...),用了一个软件叫“屏幕任意取色器”,可以将鼠标经过的点的颜色取下来,告诉你数值。

遗留问题

目标图形里,移动鼠标到相应的省份会显示其省份名字和排名,这个我查了一些资料,但是还不太明白怎么做。好像是应该通过label_formatter回调函数解决,但试了一下没有成功,如果你知道怎么做,欢迎与我交流~

到此,我们基本完成了播放地域的还原(虽然没有100%)。篇幅较长,但代码不多,希望对您有所帮助。

目标2:绘制明星看点曲线图
数据获取

该图形共涉及10位明星在一共49集的看点,我们主要使用pyecharts的Line图形来实现,先实现1位明星的,再进行堆叠。从图中可以看出,如果仅显示黄磊的曲线,发现它不是简单的按照数值的曲线,而是沿着X对称的,这是需要注意的。

数据处理

和目标1一样,首先我们需要准备数据,原始的数据中,10个明星的值是放在一起的,每49个一组,一共490个。

我们把它整理成key-value的形式,其中key是明星的名字,value是一个list,包含他每一集对应的数值。

图形绘制

接下来绘图,我直接给出最终的代码,并附上各个参数的含义,读者可以像上面那样一步一步的进行添加,看看这个过程中的变化。我们用到的Line图的文档说明如下:

单个明星看点

单独列一些几个重要的参数:

is_smooth=True, #曲线平滑显示,默认是False
is_fill=True, #是否用颜色填充,设置为True时,需要指定area_color
area_color=colors[index], #同上文,也是使用软件测量出来的
symbol=None, #去掉曲线上的数据点,否则在拐点处会有一个小圈
area_opacity=0.4, #设置透明度,不设置的话,出不来填充效果
is_datazoom_show=True, #设置横轴组件可缩放
line_opacity=0, #设置曲线的透明度,0为完全透明,表示无轮廓
datazoom_range=[0, 49], #设置缩放的范围
is_splitline_show=False,#去掉默认的网格线,更接近于原图
is_yaxis_show=False, #不显示y轴
xaxis_interval=9,#设置X轴标签的显示间隔,即1,11,21...
xaxis_min=0,#X轴的最小值
xaxis_max=49,#X轴的最大值

我们用上面的代码画出了黄磊的看点曲线图,可以看到与目标图大体上是一致的,但也有一些细节的差距,比如横轴显示的设置,逢10处虚线的设置,拖动条颜色的设置等。这几点我没有找到好的解决方案,读者朋友可以思考尝试一下。

全部明星看点

我们只需要把上面代码的break去掉,并加上颜色的配置(同样是一个一个测量出来的),就可以显示全部的曲线。效果如下面图所示:

需要指出的是,我之前考虑过添加is_stack参数为True,但是发现它会进行累加(可以通过设置显示Y轴来验证),这样出来的数值是不正确的,而如果不设置这个参数,又会在重叠时显示多种颜色,暂时还没想到好的解决方案。

你可能发现最终的图形形状轮廓和目标图形不一样,这个我也不知道是什么原因,但检查数据过后是没问题的。不过原网站似乎是存在bug的,例如,黄磊在37集和49集的数值分别为1628和1322,但是在原网站的图形中,却是49集的图形更高一些(不过单独显示黄磊的时候,没有问题,形状也和我的代码结果一致,其他明星也是正确的)。也许还存在其他我没有发现的点,这可能也是造成差异的原因吧。如果你有更好的想法,欢迎与我交流。

遗留问题

拖动轴的颜色和标签设置,逢整十的数值虚线绘制,如何在颜色重叠时显示一种颜色(颜色堆叠)

总结

至此我们尝试还原了爱奇艺指数上小欢喜这部剧的播放区域图和明星看点图,虽然没有做到100%的还原,也有很多问题没有解决,所以我觉得“不算愉悦”。但在这个过程中学习了pyecharts的使用,理解了其参数的含义。可以看到pyecharts虽然已经十分强大了希望对看到这里的你有所启发!

以清净心看世界;

用欢喜心过生活。

超哥的杂货铺,你值得拥有~

长按二维码关注我们

推荐阅读:

左手pandas右手Excel,带你学习数据透视表

实例讲解利用python进行数据获取与数据预处理

《向往的生活3》弹幕爬取与分析

我所理解的互联网数据分析师

这篇关于一次不算愉悦的爬虫与可视化之旅的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/540208

相关文章

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、

Golang网络爬虫框架gocolly/colly(三)

熟悉了《Golang 网络爬虫框架gocolly/colly 一》和《Golang 网络爬虫框架gocolly/colly 二》之后就可以在网络上爬取大部分数据了。本文接下来将爬取中证指数有限公司提供的行业市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio) 定义数据结构体: type Zhj

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

(function() {})();只执行一次

测试例子: var xx = (function() {     (function() { alert(9) })(); alert(10)     return "yyyy";  })(); 调用: alert(xx); 在调用的时候,你会发现只弹出"yyyy"信息,并不见弹出"10"的信息!这也就是说,这个匿名函数只在立即调用的时候执行一次,这时它已经赋予了给xx变量,也就是只是

基于SSM+Vue+MySQL的可视化高校公寓管理系统

系统展示 管理员界面 宿管界面 学生界面 系统背景   当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前,不接受信息改革带来的信息技术的企业随时面临被淘汰,被取代的风险。所以当今,各个行业领域,不管是传统的教育行业

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

urllib与requests爬虫简介

urllib与requests爬虫简介 – 潘登同学的爬虫笔记 文章目录 urllib与requests爬虫简介 -- 潘登同学的爬虫笔记第一个爬虫程序 urllib的基本使用Request对象的使用urllib发送get请求实战-喜马拉雅网站 urllib发送post请求 动态页面获取数据请求 SSL证书验证伪装自己的爬虫-请求头 urllib的底层原理伪装自己的爬虫-设置代理爬虫coo