【爬虫+数据可视化】Python爬取CSDN博客访问量数据并绘制成柱状图

以下内容为本人原创,欢迎大家观看学习,禁止用于商业及非法用途,谢谢合作!

·作者:@Yhen
·原文网站:CSDN
·原文链接:https://blog.csdn.net/Yhen1/article/details/105931210

转载请说明此出处,侵权必究!谢谢合作!

  大噶好!我是Yhen 算了下,我接触python已经将近两个月了,而我写博客也有一个月的时间了。我的粉丝数量从0增加到了现在的30,访问量也已经突破了3000,这些对于大佬们可能不算什么,但是对于我这种无名小辈,这样的数据我已经很欣慰了。感谢大家的一路陪伴和支持!大家的一个点赞,一个关注,都是我创作的极大动力,有你们的支持,我会更加有动力去尽我最大的努力创作更多有趣有价值的文章!谢谢大家的支持!
在这里插入图片描述

这么有意义的日子,所以我决定抓取我写博客以来每天的博客访问量,绘制成柱状图,回顾下这一路上大家的陪伴!

最后会把源码给大家

一.前期准备

今天会用到两个第三方库

requests     必备爬虫库
pyecharts    今天的主角 强大的绘图库

二.思路分析

今天的首要目标是把我博客中的访问量数据从这个列表中爬取下来

https://mp.csdn.net/console/dataWatch/analysis/allarticle

在这里插入图片描述
在这里插入图片描述
那么怎么爬取下来呢?

我们首先要判断这个页面是静态页面还是动态页面

我们先在控制台看看这个网址栏url对应的响应是不是就是网页的源代码
首先F12打开控制台,找到点击doc ,点击第一个接口。点到response,看看里面的数据

在这里插入图片描述
然后再点击Elements,和网页的源代码做个比较
在这里插入图片描述
可以发现网址栏上得到的响应的并不是我们的源代码

所以我们可以得知,这是一个动态页面

那要得到动态页面的数据,就不能用简单的数据提取的方法了
有以下的方法 :
一. 用selenium获取网页的源代码数据,然后进行数据解析提取
二.分析网页的json数据,找到想要数据的接口

selenium我之前在讲爬取海贼王图片的时候已经讲过了,所以这次就来讲讲找数据接口的方法

对selenium用法感兴趣的同学可以去看看我之前的文章
【selenium爬虫】Yhen手把手带你用selenium自动化爬虫爬取海贼王动漫图片

那么要怎么找到这个接口呢?
  首先,我要获取的是4月6日(我第一篇博客发表的日期)至5月4日的访问量数据,而页面默认是显示近7天的

我们要先在数据页面打开检查工具
然后点击日历按钮
点击4月6,再点击5月5
在这里插入图片描述
这样就可以得到我的全部历史数据啦

然后再来看看右边network里面的XHR的数据
找到一个all_article?page=1的数据接口
在这里插入图片描述
可以看到里面有很多的数据,逐个点开后,看到第0个接口pdate对应的是日期5月4,而viewcount对应的就是5月4号的访问量337.

由此可知这个就是我们要找的接口啦。

但是这个只有第一页的

我点击第二页的按钮
于是多了一个all_article?page=2的接口
我点进去,发现这就是第二页数据的接口!

在这里插入图片描述
而这个接口的url的在这里
在这里插入图片描述
而这两页url的最大区别在于page后面的参数

所以我们只需要设置一个循环,让它输出1,2,并代入到url中去,就可以得到两页的数据啦

得到访问量的数据后,再用pyecharts绘图就完成啦!

思路分析好了,接下来就是用代码来实现啦
准备起飞啦!安全带系好哦!

三. 代码实现

  首先是导包操作
  因为我们今天要画的是一个柱状图
所以我们要从pyecharts中导入柱状图Bar

# 导入爬虫库
import  requests
# 导入引擎
from pyecharts import options
# 导入柱状图
from  pyecharts.charts import Bar

接下来就是对刚刚的接口发送请求啦

刚刚说到,我们要获取两页的数据
所以我们设置一个for 循环 ,让他输出1,2,并赋值到page
然后用.format代入到url中去,这样就可以构造出两页的url 了

接下来带着请求头:浏览器类型和cookies对接口发送请求
PS:这里的cookies请代入自己的cookies

# 设置一个循环,输出1,2
for page in range(1,3):
    # 数据观星的网址
    url ='https://blog-console-api.csdn.net/v1/data/all_article?page={}&size=20&start=1586102400&end=1588608000&type=date&action=down'.format(page)
    # 请求头:用户信息 浏览器类型
    headers ={'cookie':自己账号的cookies,
              'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0'
             }

    res =requests.get(url , headers=headers).json()

因为我们这个接口数据是json数据,所以要用.json()

我们来看看能否正常得到数据
在这里插入图片描述
OK。没毛病

接下来就是从这些数据提取我们的访问量数据啦
我们再来看看那这个页面

在这里插入图片描述
先不要晕,下面我带你们去剖析它
我们反过来看一下

我们要的日期和访问量数据分别在一个字典的pdate和viewcount键下
这个字典的外层是一个列表
这个列表的外层又是一个字典,对应的键是list
而这个字典的外层还是一个字典,对应的键是data

那么

  我们就可以通过取接口数据中的data键和list键取出字典里的数据

  然后对列表进行遍历
  再通过pdate和viewcount键就可以得到我们要的日期和访问量数据啦!

接下来看看代码

#通过data键和list键取值
a =(res['data']['list'])
# 对列表进行循环遍历
    for x in a :
        # 通过viewcount键取的访问量的值
        viewcount =x['viewcount']
        # 通过pdate取得日期的值
        pdate =x['pdate']
        
        print(pdate)
        print(viewcount)

我们来看看打印结果在这里插入图片描述
是可以成功得到我们想要的数据的

但是有没有发现这个日期是反过来的?而且我只想要日期中月日的数据,不需要年份

那么接下来对数据进行列表的反转和字符串的切片

# 对列表进行循环遍历
    for x in a :
        # 通过viewcount键取的访问量的值
        viewcount =x['viewcount']
        # 通过pdate取得日期的值 通过字符串的切片,取后5个数据
        pdate =x['pdate'][5:]

        # 把访问量数据添加到list
        list.append(viewcount)
        # 把日期的数据添加到list2
        list2.append(pdate)

fangwen =list[::-1]
date =list2[::-1]

首先新建两个列表用于储存年份和访问量数据(注意必须要在最外部的for循环上面新建,如下图所示)
在这里插入图片描述
然后通过字符串的切片[5:]取到日期中的月日数据

接下来把日期和访问量分别装进list2和list
然后通过[::-1]进行列表的反转,并分别赋值给fangwen 和date列表

我们来打印下美化后的数据
在这里插入图片描述
没有毛病吧!成功得到我们想要的效果啦!

下面就是激动人心的时刻:绘制柱状图

下面是一些绘图的配置,除了数据需要自己自定义外,其他都是固定的操作

大家根据自己的实际修改即可

最后通过render渲染成html文件

c =Bar()
# xaxis_rotate
c.add_xaxis(date)

c.add_yaxis('访问量',fangwen)

# 添加主标题和副标题
c.set_global_opts(title_opts=options.TitleOpts(title='Yhen访问量柱状图',subtitle='2020年04月06日-2020年05月04日'))

c.render('Yhen访问量柱状图.html')
print('图形绘制完毕')

我们运行一下
在这里插入图片描述
运行结束后,生成了一个Yhen访问量柱状图.html ,右键点击,
找到open in Browser ,选择想要用来打开的浏览器,然后点击

在这里插入图片描述
看看打开后的效果
在这里插入图片描述
登登登登!是不是很神奇!
就这样简简单单的几行代码就生成了一个这个美观的柱状图
而且还是交互式的,当我鼠标移到某一根柱子时,它会自动给我反馈详细信息!
在这里插入图片描述
但是有没有发现
x轴上的数据是隔3天显示的
在这里插入图片描述
那么有没有办法让日期全部显示出来呢?
当然是有的

它之所以没有全部显示出来,是因为横着放不下全部的日期数据,所以它自动进行了一个处理

那么,我们只需要改变x轴数据的倾斜程度,让它斜着显示,不就可以全部显示出来了么?

具体怎么操作呢?
咱也不知道【摊手】
但是我可以查官方文档啊哈哈哈

在这里插入图片描述
文档中说到,可以通过这一行代码实现x轴的旋转
rotate=-15 这个是旋转角度的设置
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15))

文档url:
http://gallery.pyecharts.org/#/Bar/bar_rotate_xaxis_label?id=pyecharts-%e4%bb%a3%e7%a0%81-%e6%95%88%e6%9e%9c

我在绘图配置添加了配置,设置了旋转角度为-40

# 添加主标题和副标题 ,设置x轴旋转角度为-40度
c.set_global_opts(title_opts=options.TitleOpts(title='Yhen访问量柱状图',subtitle='2020年04月06日-2020年05月04日'),xaxis_opts=options.AxisOpts(axislabel_opts=options.LabelOpts(rotate=-40)))

再来看看现在的生成的统计图
在这里插入图片描述
完美啦!日期全都显示出来啦!

撒花完结!
大家如果觉得我写的还可以的话,可以点个赞鼓励下小弟嘛,点个关注就更好啦!你们的支持是我创作的最大动力!
谢谢大家

最后把源码给大家

四.源代码

扫码关注我的微信公众号Yhen杂文铺后台回复关键词访问量数据可视化即可获取哦.
在这里插入图片描述

五.【往期文章回顾】

Yhen带你趣味入门Python①—Windows下Python下载及安装

【python热搜爬虫+定时发送邮件操作①】不会吧不会吧!不会2020了还有人需要用软件看微博热搜吧?

【python微博爬虫+定时发送邮件操作②】不会吧不会吧!不会2020了还有人需要用软件看微博热搜吧?

【爬虫+数据可视化】Yhen手把手带你爬取CSDN博客访问量数据并绘制成柱状图

【爬虫】Yhen手把手带你爬取去哪儿网热门旅游信息(并打包成旅游信息查询小工具

【爬虫】Yhen手把手带你用python爬小说网站,全网打尽,想看就看!(这可能会是你看过最详细的教程)

【实用小技巧】用python自动判断并删除目录下的空文件夹(超优雅)

【爬虫+数据库操作】Yhen手把手带你用pandas将爬取的股票信息存入数据库!

【selenium爬虫】
Yhen手把手带你用selenium自动化爬虫爬取海贼王动漫图片

【爬虫】秀才不出门,天下事尽知。你也能做到!Yhen手把手带你打造每日新闻资讯速达小工具。

【爬虫】Yhen手把手带你用python爬取知乎大佬热门文章

【爬虫】Yhen手把手教你爬取表情包,让你成为斗图界最靓的仔

【前端】学过一天的HTML+CSS后,能做出什么有趣的项目?

  希望大家能够喜欢这篇文章
  如果可以的话,可以点个赞鼓励下嘛?加个关注更好呦!
  我是Yhen,下次见~

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值