精华内容
下载资源
问答
  • python爬虫,并将数据进行可视化分析,数据可视化包含饼图、柱状图、漏斗图、词云、另附源代码和报告书。
  • 本篇文章用到的模块:requests,re,os,jieba,glob,json,lxml,pyecharts,heapq,collection首先本文我们的目的抓取周杰伦的所有歌曲,歌词,以及评论直接在搜索框搜索周杰伦适用于Python入门者的爬虫数据可视化案例第...

    本篇文章适用于Python小白的教程篇,如果有哪里不足欢迎指出来,希望对你帮助。

    本篇文章用到的模块:

    requests,re,os,jieba,glob,json,lxml,pyecharts,heapq,collection

    首先

    本文我们的目的

    抓取周杰伦的所有歌曲,

    歌词,

    以及评论

    直接在搜索框搜索周杰伦

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    第一步:

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    在谷歌浏览器的抓包工具(F12)里面查看交互信息发现如下:

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    如图所示:是我们需要的信息,知道这些事情就变得简单了

    我们不需要用复杂的工具比如(selenium)去加载整个页面

    事实上,如果还没想到抓取歌曲的方法,我估计就得用它了

    我们再看header里面有什么

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    这里面的string就不用管了,因为它已经在我们的url里面了

    只需要看request headers 这个就是我们给服务器发送的东西,

    发送之后,服务器返回给我们的就是network里面的信息。

    好,接下来我们伪造浏览器发送请求。

    具体代码如下:

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    这里面用到了xpath来找到对应标签里面数据,

    代码不重要,思想懂了就行(代码单独执行可行)

    执行结果如下:

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    开始抓取歌曲信息

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    同样的道理我们通过伪造方式发送信息,获取歌曲信息!!

    直接上代码

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    上面需要注意:xpath来获取需要的信息,利用正则来获取ID(其实有很多方法)

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    一样的道理,我们分析network来获取我们需要的信息歌词,评论!!

    直接上代码

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    上面需要注意的是:利用json获取需要的数据(至少比正则快点)

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    数据分析,可视化

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    上面需要注意的是:我们合并数据的时候,可以选择性的删除一些无用数据

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    下面我们对周杰伦歌曲进行情绪化分析

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    下面完成数据词频各种分析

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    我们来看下结果

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    a3e244063003

    适用于Python入门者的爬虫和数据可视化案例

    怎么样,学到了吗?看完记得动手操作哦!

    展开全文
  • 今天主要是来说一下怎么可视化来监控你的爬虫的状态。相信大家在跑爬虫的过程中,也会好奇自己养的爬虫一分钟可以爬多少页面,多大的数据量,当然查询的方式多种多样。今天我来讲一种可视化的方法。关于爬虫数据在...

    好,开始今天的文章。

    今天主要是来说一下怎么可视化来监控你的爬虫的状态。

    相信大家在跑爬虫的过程中,也会好奇自己养的爬虫一分钟可以爬多少页面,多大的数据量,当然查询的方式多种多样。今天我来讲一种可视化的方法。

    关于爬虫数据在mongodb里的版本我写了一个可以热更新配置的版本,即添加了新的爬虫配置以后,不用重启程序,即可获取刚刚添加的爬虫的状态数据。

    1.成品图

    276ef18748f8

    这个是监控服务器网速的最后成果,显示的是下载与上传的网速,单位为M。爬虫的原理都是一样的,只不过将数据存到InfluxDB的方式不一样而已, 如下图。

    276ef18748f8

    可以实现对爬虫数量,增量,大小,大小增量的实时监控。

    2. 环境

    InfluxDb,是目前比较流行的时间序列数据库;

    Grafana,一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源

    Ubuntu

    influxdb(pip install influxdb)

    Python 2.7

    3. 原理

    获取要展示的数据,包含当前的时间数据,存到InfluxDb里面,然后再到Grafana里面进行相应的配置即可展示;

    4. 安装

    4.1 Grafana安装

    官方安装指导

    安装好以后,打开本地的3000端口,即可进入管理界面,用户名与密码都是admin。

    4.2 InfulxDb安装

    这个安装就网上自己找吧,有很多的配置我都没有配置,就不在这里误人子弟了。

    5. InfluxDb简单操作

    碰到了数据库,肯定要把增删改查学会了啊, 和sql几乎一样,只有一丝丝的区别,具体操作,大家可以参考官方的文档。

    influx 进入命令行

    CREATE DATABASE test 创建数据库

    show databases 查看数据库

    use test 使用数据库

    show series 看表

    select * from table_test选择数据

    DROP MEASUREMENT table_test 删表

    6. 存数据

    InfluxDb数据库的数据有一定的格式,因为我都是利用python库进行相关操作,所以下面将在python中的格式展示一下:

    276ef18748f8

    其中:

    measurement, 表名

    time,时间

    tags,标签

    fields,字段

    可以看到,就是个列表里面,嵌套了一个字典。其中,对于时间字段,有特殊要求,可以参考这里, 下面是python实现方法:

    276ef18748f8

    所以,到这里,如何将爬虫的相关属性存进去呢?以MongoDB为例

    276ef18748f8

    那么现在我们已经往数据里存了数据了,那么接下来要做的就是把存的数据展示出来。

    7.展示数据

    7.1 配置数据源

    以admin登录到Grafana的后台后,我们首先需要配置一下数据源。点击左边栏的最下面的按钮,然后点击DATA SOURCES,这样就可以进入下面的页面:

    276ef18748f8

    点击ADD DATA SOURCE,进行配置即可,如下图:

    276ef18748f8

    其中,name自行设定;Type 选择InfluxDB;url为默认的http://localhost:8086, 其他的因为我前面没有进行配置,所以默认的即可。然后在InfluxDB Details里的填入Database名,最后点击测试,如果没有报错的话,则可以进入下一步的展示数据了;

    在学习中有迷茫不知如何学习的朋友小编推荐一个学Python的学习裙[663033228]无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    7.2 展示数据

    点击左边栏的+号,然后点击GRAPH

    276ef18748f8

    接着点击下图中的edit进入编辑页面:

    276ef18748f8

    276ef18748f8

    从上图中可以发现:

    中间板块是最后的数据展示

    下面是数据的设置项

    右上角是展示时间的设置板块,在这里可以选择要展示多久的数据

    7.2.1 配置数据

    在Data Source中选择刚刚在配置数据源的时候配置的NAME字段,而不是database名。

    接着在下面选择要展示的数据。看着就很熟悉是不是,完全是sql语句的可视化。同时,当我们的数据放到相关的字段上的时候,双击,就会把可以选择的项展示出来了,我们要做的就是直接选择即可;

    设置右上角的时间,则可以让数据实时进行更新与展示

    因为下面的配置实质就是sql查询语句,所以大家按照自己的需求,进行选择配置即可,当配置完以后,就可以在中间的面板里面看到数据了。

    8. 总结

    到这里,本篇文章就结束了。其中,对于Grafana的操作我没有介绍的很详细,因为本篇主要讲的是怎么利用这几个工具完成我们的任务。

    同时,里面的功能确实很多,还有可以安装的插件。我自己目前还是仅仅对于用到的部分比较了解,所以大家可以查询官方的或者别的教程资料来对Grafana进行更深入的了解,制作出更加好看的可视化作品来。

    展开全文
  • Python爬虫数据可视化

    万次阅读 多人点赞 2019-06-12 20:57:09
    数据可视化这里特别强调,pyecharts包千万别装新版的,我这里装的是0.5.9版的其次如果要做地理坐标图,热力图啥的,必须安装地图包,比如世界地图包,中国地图包,城市地图包啥的 1.数据挖掘 代码所需包 # -*- ...

    之前写过篇爬取前程无忧职位信息并保存到Excel的博客,
    这里仔细的讲讲并且增加可视化内容

    1.数据挖掘

    代码所需包

    import urllib.request
    import xlwt
    import re
    import urllib.parse
    import time
    

    进入前程无忧官网
    我这里以搜索大数据职位信息
    在这里插入图片描述
    打开开发者模式
    Request Headers 里面是我们用浏览器访问网站的信息,有了信息后就能模拟浏览器访问
    这也是为了防止网站封禁IP,不过前程无忧一般是不会封IP的。
    在这里插入图片描述
    模拟浏览器

    header={
        'Host':'search.51job.com',
        'Upgrade-Insecure-Requests':'1',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }
    

    在这里插入图片描述
    这些基本数据都可以爬取:
    为了实现交互型爬取,我写了一个能够实现输入想了解的职位就能爬取相关内容的函数

    def getfront(page,item):       #page是页数,item是输入的字符串,见后文
         result = urllib.parse.quote(item)					#先把字符串转成十六进制编码
         ur1 = result+',2,'+ str(page)+'.html'
         ur2 = 'https://search.51job.com/list/000000,000000,0000,00,9,99,'
         res = ur2+ur1															#拼接网址
         a = urllib.request.urlopen(res)
         html = a.read().decode('gbk')          # 读取源代码并转为unicode
         return html
    
    def getInformation(html):
        reg = re.compile(r'class="t1 ">.*? <a target="_blank" title="(.*?)" href="(.*?)".*? <span class="t2"><a target="_blank" title="(.*?)" href="(.*?)".*?<span class="t3">(.*?)</span>.*?<span class="t4">(.*?)</span>.*?<span class="t5">(.*?)</span>.*?',re.S)#匹配换行符
        items=re.findall(reg,html)
        return items
    

    这里我除了爬取图上信息外,还把职位超链接后的网址,以及公司超链接的网址爬取下来了。
    这里先不讲,后面后面会说到,
    接下来就需要储存信息,这里使用Excel,虽然比较麻烦,不过胜在清晰直观

    #新建表格空间
    excel1 = xlwt.Workbook()
    # 设置单元格格式
    sheet1 = excel1.add_sheet('Job', cell_overwrite_ok=True)
    sheet1.write(0, 0, '序号')
    sheet1.write(0, 1, '职位')
    sheet1.write(0, 2, '公司名称')
    sheet1.write(0, 3, '公司地点')
    sheet1.write(0, 4, '公司性质')
    sheet1.write(0, 5, '薪资')
    sheet1.write(0, 6, '学历要求')
    sheet1.write(0, 7, '工作经验')
    sheet1.write(0, 8, '公司规模')
    sheet1.write(0, 9, '公司类型')
    sheet1.write(0, 10,'公司福利')
    sheet1.write(0, 11,'发布时间')
    

    爬取代码如下,这里就能利用双层循环来实现换页爬取与换行输出
    我这里为了获得大量数据所以爬取了1000页,调试时可以只爬取几页

    number = 1
    item = input()
    for j in range(1,1000):   #页数自己随便改
        try:
            print("正在爬取第"+str(j)+"页数据...")
            html = getfront(j,item)      #调用获取网页原码
            for i in getInformation(html):
                try:
                    url1 = i[1]          #职位网址
                    res1 = urllib.request.urlopen(url1).read().decode('gbk')
                    company = re.findall(re.compile(r'<div class="com_tag">.*?<p class="at" title="(.*?)"><span class="i_flag">.*?<p class="at" title="(.*?)">.*?<p class="at" title="(.*?)">.*?',re.S),res1)
                    job_need = re.findall(re.compile(r'<p class="msg ltype".*?>.*?&nbsp;&nbsp;<span>|</span>&nbsp;&nbsp;(.*?)&nbsp;&nbsp;<span>|</span>&nbsp;&nbsp;(.*?)&nbsp;&nbsp;<span>|</span>&nbsp;&nbsp;.*?</p>',re.S),res1)
                    welfare = re.findall(re.compile(r'<span class="sp4">(.*?)</span>',re.S),res1)
                    print(i[0],i[2],i[4],i[5],company[0][0],job_need[2][0],job_need[1][0],company[0][1],company[0][2],welfare,i[6])
                    sheet1.write(number,0,number)
                    sheet1.write(number,1,i[0])
                    sheet1.write(number,2,i[2])
                    sheet1.write(number,3,i[4])
                    sheet1.write(number,4,company[0][0])
                    sheet1.write(number,5,i[5])
                    sheet1.write(number,6,job_need[1][0])
                    sheet1.write(number,7,job_need[2][0])
                    sheet1.write(number,8,company[0][1])
                    sheet1.write(number,9,company[0][2])
                    sheet1.write(number,10,("  ".join(str(i) for i in welfare)))
                    sheet1.write(number,11,i[6])
                    number+=1
                    excel1.save("51job.xls")
                    time.sleep(0.3) #休息间隔,避免爬取海量数据时被误判为攻击,IP遭到封禁
                except:
                    pass
        except:
            pass
    

    结果如下:
    在这里插入图片描述
    在这里插入图片描述

    2.数据清洗

    首先要打开文件

    #coding:utf-8
    import pandas as pd
    import re
    #除此之外还要安装xlrd包
    
    data = pd.read_excel(r'51job.xls',sheet_name='Job')
    result = pd.DataFrame(data)
    

    清洗思路:
    1、出现有空值(NAN)得信息,直接删除整行

    a = result.dropna(axis=0,how='any')
    pd.set_option('display.max_rows',None)     #输出全部行,不省略
    

    2、职位出错(很多职位都是与大数据无关的职业)
    在这里插入图片描述

    b = u'数据'
    number = 1
    li = a['职位']
    for i in range(0,len(li)):
        try:
            if b in li[i]:
                #print(number,li[i])
                number+=1
            else:
                a = a.drop(i,axis=0)
        except:
            pass
    

    3、其他地方出现的信息错位,比如在学历里出现 ‘招多少人’
    在这里插入图片描述

    b2= u'人'
    li2 = a['学历要求']
    for i in range(0,len(li2)):
        try:
            if b2 in li2[i]:
                #print(number,li2[i])
                number+=1
                a = a.drop(i,axis=0)
        except:
            pass
    

    4、转换薪资单位
    如上图就出现单位不一致的情况

    b3 =u'万/年'
    b4 =u'千/月'
    li3 = a['薪资']
    #注释部分的print都是为了调试用的
    for i in range(0,len(li3)):
        try:
            if b3 in li3[i]:
                x = re.findall(r'\d*\.?\d+',li3[i])
                #print(x)
                min_ = format(float(x[0])/12,'.2f')              #转换成浮点型并保留两位小数
                max_ = format(float(x[1])/12,'.2f')
                li3[i][1] = min_+'-'+max_+u'万/月'
            if b4 in li3[i]:
                x = re.findall(r'\d*\.?\d+',li3[i])
                #print(x)
                #input()
                min_ = format(float(x[0])/10,'.2f')
                max_ = format(float(x[1])/10,'.2f')
                li3[i][1] = str(min_+'-'+max_+'万/月')
            print(i,li3[i])
    
        except:
            pass
    

    保存到另一个Excel文件

    a.to_excel('51job2.xlsx', sheet_name='Job', index=False)
    

    这里只是简单的介绍了一些数据清理的思路,并不是说只要清理这些就行了
    有时候有的公司网页并不是前程无忧类型的,而是他们公司自己做的网页,这也很容易出错
    不过只要有了基本思路,这些都不难清理

    3.数据可视化

    数据可视化可以说是很重要的环节,如果只是爬取数据而不去可视化处理,那么可以说数据的价值根本没有发挥
    可视化处理能使数据更加直观,更有利于分析
    甚至可以说可视化是数据挖掘最重要的内容

    同样的我们先看代码需要的包

    # -*- coding: utf-8 -*-
    import pandas as pd
    import re
    from pyecharts import Funnel,Pie,Geo
    import matplotlib.pyplot as plt
    

    在这里插入图片描述

    若找不到或者安装失败,可用源码安装的方式

    在这里插入图片描述
    https://github.com/pyecharts/pyecharts

    在这里插入图片描述
    接下来就是正戏
    一样的先要打开文件

    file = pd.read_excel(r'51job2.xls',sheet_name='Job')
    f = pd.DataFrame(file)
    pd.set_option('display.max_rows',None)
    

    1、创建多个列表来单独存放【‘薪资’】【‘工作经验’】【‘学历要求’】【‘公司地点’】等信息

    add = f['公司地点']
    sly = f['薪资']
    edu = f['学历要求']
    exp = f['工作经验']
    address =[]
    salary = []
    education = []
    experience = []
    for i in range(0,len(f)):
        try:
            a = add[i].split('-')
            address.append(a[0])
            #print(address[i])
            s = re.findall(r'\d*\.?\d+',sly[i])
            s1= float(s[0])
            s2 =float(s[1])
            salary.append([s1,s2])
            #print(salary[i])
            education.append(edu[i])
            #print(education[i])
            experience.append(exp[i])
            #print(experience[i])
        except:
           pass
    

    2、matploblib库生成 工作经验—薪资图 与 学历—薪资图

    min_s=[]							#定义存放最低薪资的列表
    max_s=[]							#定义存放最高薪资的列表
    for i in range(0,len(experience)):
        min_s.append(salary[i][0])
        max_s.append(salary[i][0])
    
    my_df = pd.DataFrame({'experience':experience, 'min_salay' : min_s, 'max_salay' : max_s})				#关联工作经验与薪资
    data1 = my_df.groupby('experience').mean()['min_salay'].plot(kind='line')
    plt.show()
    my_df2 = pd.DataFrame({'education':education, 'min_salay' : min_s, 'max_salay' : max_s})				#关联学历与薪资
    data2 = my_df2.groupby('education').mean()['min_salay'].plot(kind='line')
    plt.show()
    

    在这里插入图片描述
    在这里插入图片描述
    3、学历要求圆环图

    def get_edu(list):
        education2 = {}
        for i in set(list):
            education2[i] = list.count(i)
        return education2
    dir1 = get_edu(education)
    # print(dir1)
    
    attr= dir1.keys()
    value = dir1.values()
    pie = Pie("学历要求")
    pie.add("", attr, value, center=[50, 50], is_random=False, radius=[30, 75], rosetype='radius',
            is_legend_show=False, is_label_show=True,legend_orient='vertical')
    pie.render('学历要求玫瑰图.html')
    

    在这里插入图片描述
    在这里插入图片描述
    4、大数据城市需求地理位置分布图

    def get_address(list):
        address2 = {}
        for i in set(list):
            address2[i] = list.count(i)
        address2.pop('异地招聘')
        # 有些地名可能不合法或者地图包里没有可以自行删除,之前以下名称都会报错,现在好像更新了
        #address2.pop('山东')
        #address2.pop('怒江')
        #address2.pop('池州')
        return address2
    dir2 = get_address(address)
    #print(dir2)
    
    geo = Geo("大数据人才需求分布图", title_color="#2E2E2E",
              title_text_size=24,title_top=20,title_pos="center", width=1300,height=600)
    attr2 = dir2.keys()
    value2 = dir2.values()
    geo.add("",attr2, value2, type="effectScatter", is_random=True, visual_range=[0, 1000], maptype='china',symbol_size=8, effect_scale=5, is_visualmap=True)
    geo.render('大数据城市需求分布图.html')
    

    在这里插入图片描述
    在这里插入图片描述
    5、工作经验要求漏斗图

    def get_experience(list):
        experience2 = {}
        for i in set(list):
             experience2[i] = list.count(i)
        return experience2
    dir3 = get_experience(experience)
    #print(dir3)
    
    attr3= dir3.keys()
    value3 = dir3.values()
    funnel = Funnel("工作经验漏斗图",title_pos='center')
    funnel.add("", attr3, value3,is_label_show=True,label_pos="inside", label_text_color="#fff",legend_orient='vertical',legend_pos='left')
    funnel.render('工作经验要求漏斗图.html')
    

    在这里插入图片描述
    在这里插入图片描述
    当然,pyecharts里面的图还有很多种,就靠大家去自己发掘了。

    【反馈】

    接到部分人反应的乱码情况,主要可能是因为网站规则变动。我去重新更新了一下代码,并且改进了一些地方,如果遇到爬取过程中途停下的情况,可能是网络问题或者陷入阻塞,可以重新运行一次代码

    所有代码如下:

    # -*- coding:utf-8 -*-
    import urllib.request
    import xlwt
    import re
    import urllib.parse
    import time
    header={
        'Host':'search.51job.com',
        'Upgrade-Insecure-Requests':'1',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }
    def getfront(page,item):       #page是页数,item是输入的字符串
         result = urllib.parse.quote(item)					#先把字符串转成十六进制编码
         ur1 = result+',2,'+ str(page)+'.html'
         ur2 = 'https://search.51job.com/list/000000,000000,0000,00,9,99,'
         res = ur2+ur1															#拼接网址
         a = urllib.request.urlopen(res)
         html = a.read().decode('gbk')          # 读取源代码并转为unicode
         return html
    def getInformation(html):
        reg = re.compile(r'class="t1 ">.*? <a target="_blank" title="(.*?)" href="(.*?)".*? <span class="t2"><a target="_blank" title="(.*?)" href="(.*?)".*?<span class="t3">(.*?)</span>.*?<span class="t4">(.*?)</span>.*?<span class="t5">(.*?)</span>.*?',re.S)#匹配换行符
        items=re.findall(reg,html)
        return items
    #新建表格空间
    excel1 = xlwt.Workbook()
    # 设置单元格格式
    sheet1 = excel1.add_sheet('Job', cell_overwrite_ok=True)
    sheet1.write(0, 0, '序号')
    sheet1.write(0, 1, '职位')
    sheet1.write(0, 2, '公司名称')
    sheet1.write(0, 3, '公司地点')
    sheet1.write(0, 4, '公司性质')
    sheet1.write(0, 5, '薪资')
    sheet1.write(0, 6, '学历要求')
    sheet1.write(0, 7, '工作经验')
    sheet1.write(0, 8, '公司规模')
    sheet1.write(0, 9, '公司类型')
    sheet1.write(0, 10,'公司福利')
    sheet1.write(0, 11,'发布时间')
    number = 1
    item = input()
    for j in range(1,10000):   #页数自己随便改
        try:
            print("正在爬取第"+str(j)+"页数据...")
            html = getfront(j,item)      #调用获取网页原码
            for i in getInformation(html):
                try:
                    url1 = i[1]          #职位网址
                    res1 = urllib.request.urlopen(url1).read().decode('gbk')
                    company = re.findall(re.compile(r'<div class="com_tag">.*?<p class="at" title="(.*?)"><span class="i_flag">.*?<p class="at" title="(.*?)">.*?<p class="at" title="(.*?)">.*?',re.S),res1)
                    job_need = re.findall(re.compile(r'<p class="msg ltype".*?>.*?&nbsp;&nbsp;<span>|</span>&nbsp;&nbsp;(.*?)&nbsp;&nbsp;<span>|</span>&nbsp;&nbsp;(.*?)&nbsp;&nbsp;<span>|</span>&nbsp;&nbsp;.*?</p>',re.S),res1)
                    welfare = re.findall(re.compile(r'<span class="sp4">(.*?)</span>',re.S),res1)
                    print(i[0],i[2],i[4],i[5],company[0][0],job_need[2][0],job_need[1][0],company[0][1],company[0][2],welfare,i[6])
                    sheet1.write(number,0,number)
                    sheet1.write(number,1,i[0])
                    sheet1.write(number,2,i[2])
                    sheet1.write(number,3,i[4])
                    sheet1.write(number,4,company[0][0])
                    sheet1.write(number,5,i[5])
                    sheet1.write(number,6,job_need[2][0])
                    sheet1.write(number,7,job_need[1][0])
                    sheet1.write(number,8,company[0][1])
                    sheet1.write(number,9,company[0][2])
                    sheet1.write(number,10,("  ".join(str(i) for i in welfare)))
                    sheet1.write(number,11,i[6])
                    number+=1
                    excel1.save("51job.xls")
                    time.sleep(0.3) #休息间隔,避免爬取海量数据时被误判为攻击,IP遭到封禁
                except:
                    pass
        except:
            pass
    
    #coding:utf-8
    import pandas as pd
    import re
    
    data = pd.read_excel(r'51job.xls',sheet_name='Job')
    result = pd.DataFrame(data)
    
    a = result.dropna(axis=0,how='any')
    pd.set_option('display.max_rows',None)     #输出全部行,不省略
    
    b = u'数据'
    number = 1
    li = a['职位']
    for i in range(0,len(li)):
        try:
            if b in li[i]:
                #print(number,li[i])
                number+=1
            else:
                a = a.drop(i,axis=0)  #删除整行
        except:
            pass
    
    b2 = '人'
    li2 = a['学历要求']
    for i in range(0,len(li2)):
        try:
            if b2 in li2[i]:
                # print(number,li2[i])
                number += 1
                a = a.drop(i, axis=0)
        except:
            pass
    
    b3 =u'万/年'
    b4 =u'千/月'
    li3 = a['薪资']
    #注释部分的print都是为了调试用的
    for i in range(0,len(li3)):
        try:
            if b3 in li3[i]:
                x = re.findall(r'\d*\.?\d+',li3[i])
                #print(x)
                min_ = format(float(x[0])/12,'.2f')              #转换成浮点型并保留两位小数
                max_ = format(float(x[1])/12,'.2f')
                li3[i][1] = min_+'-'+max_+u'万/月'
            if b4 in li3[i]:
                x = re.findall(r'\d*\.?\d+',li3[i])
                #print(x)
                #input()
                min_ = format(float(x[0])/10,'.2f')
                max_ = format(float(x[1])/10,'.2f')
                li3[i][1] = str(min_+'-'+max_+'万/月')
            print(i,li3[i])
    
        except:
            pass
    a.to_excel('51job2.xls', sheet_name='Job', index=False)
    #############################################################################################
    import pandas as pd
    import re
    from pyecharts import Funnel,Pie,Geo
    import matplotlib.pyplot as plt
    
    file = pd.read_excel(r'51job2.xls',sheet_name='Job')
    f = pd.DataFrame(file)
    pd.set_option('display.max_rows',None)
    
    add = f['公司地点']
    sly = f['薪资']
    edu = f['学历要求']
    exp = f['工作经验']
    address =[]
    salary = []
    education = []
    experience = []
    for i in range(0,len(f)):
        try:
            a = add[i].split('-')
            address.append(a[0])
            #print(address[i])
            s = re.findall(r'\d*\.?\d+',sly[i])
            s1= float(s[0])
            s2 =float(s[1])
            salary.append([s1,s2])
            #print(salary[i])
            education.append(edu[i])
            #print(education[i])
            experience.append(exp[i])
            #print(experience[i])
        except:
           pass
    
    min_s=[]							#定义存放最低薪资的列表
    max_s=[]							#定义存放最高薪资的列表
    for i in range(0,len(experience)):
        min_s.append(salary[i][0])
        max_s.append(salary[i][0])
    #matplotlib模块如果显示不了中文字符串可以用以下代码。
    plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
    plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
    
    my_df = pd.DataFrame({'experience':experience, 'min_salay' : min_s, 'max_salay' : max_s})				#关联工作经验与薪资
    data1 = my_df.groupby('experience').mean()['min_salay'].plot(kind='line')
    plt.show()
    my_df2 = pd.DataFrame({'education':education, 'min_salay' : min_s, 'max_salay' : max_s})				#关联学历与薪资
    data2 = my_df2.groupby('education').mean()['min_salay'].plot(kind='line')
    plt.show()
    
    def get_edu(list):
        education2 = {}
        for i in set(list):
            education2[i] = list.count(i)
        return education2
    dir1 = get_edu(education)
    # print(dir1)
    
    attr= dir1.keys()
    value = dir1.values()
    pie = Pie("学历要求")
    pie.add("", attr, value, center=[50, 50], is_random=False, radius=[30, 75], rosetype='radius',
            is_legend_show=False, is_label_show=True,legend_orient='vertical')
    pie.render('学历要求玫瑰图.html')
    
    def get_address(list):
        address2 = {}
        for i in set(list):
            address2[i] = list.count(i)
        address2.pop('异地招聘')
        # 有些地名可能不合法或者地图包里没有可以自行删除,之前以下名称都会报错,现在好像更新了
        #address2.pop('山东')
        #address2.pop('怒江')
        #address2.pop('池州')
        return address2
    dir2 = get_address(address)
    #print(dir2)
    
    geo = Geo("大数据人才需求分布图", title_color="#2E2E2E",
              title_text_size=24,title_top=20,title_pos="center", width=1300,height=600)
    attr2 = dir2.keys()
    value2 = dir2.values()
    geo.add("",attr2, value2, type="effectScatter", is_random=True, visual_range=[0, 1000], maptype='china',symbol_size=8, effect_scale=5, is_visualmap=True)
    geo.render('大数据城市需求分布图.html')
    
    def get_experience(list):
        experience2 = {}
        for i in set(list):
             experience2[i] = list.count(i)
        return experience2
    dir3 = get_experience(experience)
    #print(dir3)
    
    attr3= dir3.keys()
    value3 = dir3.values()
    funnel = Funnel("工作经验漏斗图",title_pos='center')
    funnel.add("", attr3, value3,is_label_show=True,label_pos="inside", label_text_color="#fff",legend_orient='vertical',legend_pos='left')
    funnel.render('工作经验要求漏斗图.html')
    
    

    在这里插入图片描述
    HTML文件最好用谷歌浏览器打开,如果点开没反应可以在文件夹里找到该文件然后打开
    在这里插入图片描述

    最近比较多人说爬取数据没有动静,我去看了下,其实不是什么问题,就是网页源码有更改,之前python爬取到的信息是用HTML写的,而现在数据那里是JavaScript写的,这样的话正则肯定就不匹配了。我也花时间改了改。有些东西也去的去,加的加,不过不影响后面数据可视化。

    # -*- coding:utf-8 -*-
    import urllib.request
    import xlwt
    import re
    import urllib.parse
    import time
    header={
        'Host':'search.51job.com',
        'Upgrade-Insecure-Requests':'1',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }
    def getfront(page,item):       #page是页数,item是输入的字符串
         result = urllib.parse.quote(item)					#先把字符串转成十六进制编码
         ur1 = result+',2,'+ str(page)+'.html'
         ur2 = 'https://search.51job.com/list/000000,000000,0000,00,9,99,'
         res = ur2+ur1    #拼接网址
         a = urllib.request.urlopen(res)
         html = a.read().decode('gbk')      # 读取源代码并转为unicode
         html = html.replace('\\','')       # 将用于转义的"\"替换为空
         html = html.replace('[', '')
         html = html.replace(']', '')
         #print(html)
         return html
    
    def getInformation(html):
        reg = re.compile(r'\{"type":"engine_search_result","jt":"0".*?"job_href":"(.*?)","job_name":"(.*?)".*?"company_href":"(.*?)","company_name":"(.*?)","providesalary_text":"(.*?)".*?"updatedate":"(.*?)".*?,'
                         r'"companytype_text":"(.*?)".*?"jobwelf":"(.*?)".*?"attribute_text":"(.*?)","(.*?)","(.*?)","(.*?)","companysize_text":"(.*?)","companyind_text":"(.*?)","adid":""},',re.S)#匹配换行符
        items=re.findall(reg,html)
        print(items)
        return items
    
    #新建表格空间
    excel1 = xlwt.Workbook()
    # 设置单元格格式
    sheet1 = excel1.add_sheet('Job', cell_overwrite_ok=True)
    sheet1.write(0, 0, '序号')
    sheet1.write(0, 1, '职位')
    sheet1.write(0, 2, '公司名称')
    sheet1.write(0, 3, '公司地点')
    sheet1.write(0, 4, '公司性质')
    sheet1.write(0, 5, '薪资')
    sheet1.write(0, 6, '学历要求')
    sheet1.write(0, 7, '工作经验')
    sheet1.write(0, 8, '公司规模')
    #sheet1.write(0, 9, '公司类型')
    sheet1.write(0, 9,'公司福利')
    sheet1.write(0, 10,'发布时间')
    number = 1
    item = input()
    
    for j in range(1,10):   #页数自己随便改
        try:
            print("正在爬取第"+str(j)+"页数据...")
            html = getfront(j,item)      #调用获取网页原码
            for i in getInformation(html):
                try:
                    #url1 = i[1]          #职位网址
                    #res1 = urllib.request.urlopen(url1).read().decode('gbk')
                    #company = re.findall(re.compile(r'<div class="com_tag">.*?<p class="at" title="(.*?)"><span class="i_flag">.*?<p class="at" title="(.*?)">.*?<p class="at" title="(.*?)">.*?',re.S),res1)
                    #job_need = re.findall(re.compile(r'<p class="msg ltype".*?>.*?&nbsp;&nbsp;<span>|</span>&nbsp;&nbsp;(.*?)&nbsp;&nbsp;<span>|</span>&nbsp;&nbsp;(.*?)&nbsp;&nbsp;<span>|</span>&nbsp;&nbsp;.*?</p>',re.S),res1)
                    #welfare = re.findall(re.compile(r'<span class="sp4">(.*?)</span>',re.S),res1)
                    #print(i[0],i[2],i[4],i[5],company[0][0],job_need[2][0],job_need[1][0],company[0][1],company[0][2],welfare,i[6])
                    sheet1.write(number,0,number)
                    sheet1.write(number,1,i[1])
                    sheet1.write(number,2,i[3])
                    sheet1.write(number,3,i[8])
                    sheet1.write(number,4,i[6])
                    sheet1.write(number,5,i[4])
                    sheet1.write(number,6,i[10])
                    sheet1.write(number,7,i[9])
                    sheet1.write(number,8,i[12])
                    #sheet1.write(number,9,i[7])
                    sheet1.write(number,9,i[7])
                    sheet1.write(number,10,i[5])
                    number+=1
                    excel1.save("51job.xls")
                    time.sleep(0.3) #休息间隔,避免爬取海量数据时被误判为攻击,IP遭到封禁
                except:
                    pass
        except:
            pass
    

    顺便放上源码:https://github.com/haohaizhi/51job_spiders

    因为有了自己的博客网站,后续若有修改将在新的链接中体现
    https://blog.mehoon.com/107.html

    展开全文
  • Python爬虫以及数据可视化分析

    万次阅读 多人点赞 2020-12-25 17:43:30
    Python爬虫以及数据可视化分析之B站动漫排行榜信息爬取分析 简书地址:https://www.jianshu.com/u/40ac87350697 简单几步,通过Python对B站番剧排行数据进行爬取,并进行可视化分析 源码文件可以参考Github上传的...

    Python爬虫以及数据可视化分析之Bilibili动漫排行榜信息爬取分析

    简书地址:https://www.jianshu.com/u/40ac87350697

    简单几步,通过Python对B站番剧排行数据进行爬取,并进行可视化分析

    源码文件可以参考Github上传的项目:https://github.com/Lemon-Sheep/Py/tree/master

    下面,我们开始吧!

    PS: 作为Python爬虫初学者,如有不正确的地方,望各路大神不吝赐教[抱拳]

    本项目将会对B站番剧排行的数据进行网页信息爬取以及数据可视化分析
    image.png

    首先,准备好相关库

    requests、pandas、BeautifulSoup、matplotlib等

    因为这是第三方库,所以我们需要额外下载
    下载有两种方法(以requests为例,其余库的安装方法类似):

    (一)在命令行输入

    前提:装了pip( Python 包管理工具,提供了对Python 包的查找、下载、安装、卸载的功能。 )

    pip install requests

    (二)通过PyCharm下载

    第一步:编译器左上角File–>Settings…
    image.png
    第二步:找到Project Interpreter 点击右上角加号按钮,弹出界面上方搜索库名:requests,点击左下角Install ,当提示successfully时,即安装完成。
    2.png

    image.png

    准备工作做好后,开始项目的实行

    一、获取网页内容

    def get_html(url):
        try:
            r = requests.get(url)             # 使用get来获取网页数据
            r.raise_for_status()              # 如果返回参数不为200,抛出异常
            r.encoding = r.apparent_encoding  # 获取网页编码方式
            return r.text                     # 返回获取的内容
        except:
            return '错误'
    

    我们来看爬取情况,是否有我们想要的内容:

    def main():
        url = 'https://www.bilibili.com/v/popular/rank/bangumi'    # 网址
        html = get_html(url)                                       # 获取返回值
        print(html)                                              # 打印
    
    if __name__ == '__main__':                        #入口
        main()
    

    爬取结果如下图所示:
    image.png
    成功!

    二、信息解析阶段:

    第一步,先构建BeautifulSoup实例

    soup = BeautifulSoup(html, 'html.parser') # 指定BeautifulSoup的解析器
    

    第二步,初始化要存入信息的容器

    # 定义好相关列表准备存储相关信息
        TScore = []  # 综合评分
        name = []  # 动漫名字
        play= []  # 播放量
        review = []  # 评论数
        favorite= []  # 收藏数
    

    第三步,开始信息整理
    我们先获取番剧的名字,并将它们先存进列表中

    # ********************************************  动漫名字存储
        for tag in soup.find_all('div', class_='info'):
            # print(tag)
            bf = tag.a.string
            name.append(str(bf))
        print(name)
    

    此处我们用到了beautifulsoup的find_all()来进行解析。在这里,find_all()的第一个参数是标签名,第二个是标签中的class值(注意下划线哦(class_=‘info’))。

    我们在网页界面按下F12,就能看到网页代码,找到相应位置,就能清晰地看见相关信息:
    image.png

    接着,我们用几乎相同的方法来对综合评分、播放量,评论数和收藏数来进行提取

    # ********************************************  播放量存储
        for tag in soup.find_all('div', class_='detail'):
            # print(tag)
            bf = tag.find('span', class_='data-box').get_text()
            # 统一单位为‘万’
            if '亿' in bf:
                num = float(re.search(r'\d(.\d)?', bf).group()) * 10000
                # print(num)
                bf = num
            else:
                bf = re.search(r'\d*(\.)?\d', bf).group()
            play.append(float(bf))
        print(play)
        # ********************************************  评论数存储
        for tag in soup.find_all('div', class_='detail'):
            # pl = tag.span.next_sibling.next_sibling
            pl = tag.find('span', class_='data-box').next_sibling.next_sibling.get_text()
            # *********统一单位
            if '万' not in pl:
                pl = '%.1f' % (float(pl) / 10000)
                # print(123, pl)
            else:
                pl = re.search(r'\d*(\.)?\d', pl).group()
            review.append(float(pl))
        print(review)
        # ********************************************  收藏数
        for tag in soup.find_all('div', class_='detail'):
            sc = tag.find('span', class_='data-box').next_sibling.next_sibling.next_sibling.next_sibling.get_text()
            sc = re.search(r'\d*(\.)?\d', sc).group()
            favorite.append(float(sc))
        print(favorite)
        # ********************************************  综合评分
        for tag in soup.find_all('div', class_='pts'):
            zh = tag.find('div').get_text()
            TScore.append(int(zh))
        print('综合评分', TScore)
    

    其中有个.next_sibling是用于提取同级别的相同标签信息,如若没有这个方法,当它找到第一个’span’标签之后,就不会继续找下去了(根据具体情况来叠加使用此方法);
    还用到了正则表达式来提取信息(需要导入库‘re’)

    最后我们将提取的信息,存进excel表格之中,并返回结果集

    # 存储至excel表格中
        info = {'动漫名': name, '播放量(万)': play, '评论数(万)': review,'收藏数(万)': favorite, '综合评分': TScore}
        dm_file = pandas.DataFrame(info)
        dm_file.to_excel('Dongman.xlsx', sheet_name="动漫数据分析")
        # 将所有列表返回
        return name, play, review, favorite, TScore
    

    我们可以打开文件看一看存储的信息格式(双击打开)
    image.png
    image.png
    成功!

    三、数据可视化分析

    我们先做一些基础设置
    要先准备一个文件: STHeiti Medium.ttc [注意存放在项目中的位置]
    image.png

    my_font = font_manager.FontProperties(fname='./data/STHeiti Medium.ttc')  # 设置中文字体(图表中能显示中文)
    
     # 为了坐标轴上能显示中文
        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.rcParams['axes.unicode_minus'] = False
    
        dm_name = info[0]  # 番剧名
        dm_play = info[1]  # 番剧播放量
        dm_review = info[2]  # 番剧评论数
        dm_favorite = info[3]  # 番剧收藏数
        dm_com_score = info[4]  # 番剧综合评分
        # print(dm_com_score)
    

    然后,开始使用matplot来绘制图形,实现数据可视化分析
    文中有详细注释,这里就不再赘述了,聪明的你一定一看就懂了~

    # **********************************************************************综合评分和播放量对比
        # *******综合评分条形图
        fig, ax1 = plt.subplots()
        plt.bar(dm_name, dm_com_score, color='red')  #设置柱状图
        plt.title('综合评分和播放量数据分析', fontproperties=my_font)  # 表标题
        ax1.tick_params(labelsize=6)  
        plt.xlabel('番剧名')  # 横轴名
        plt.ylabel('综合评分')  # 纵轴名
        plt.xticks(rotation=90, color='green')  # 设置横坐标变量名旋转度数和颜色
    
        # *******播放量折线图
        ax2 = ax1.twinx()  # 组合图必须加这个
        ax2.plot(dm_play, color='cyan')  # 设置线粗细,节点样式
        plt.ylabel('播放量')  # y轴
    
        plt.plot(1, label='综合评分', color="red", linewidth=5.0)  # 图例
        plt.plot(1, label='播放量', color="cyan", linewidth=1.0, linestyle="-")  # 图例
        plt.legend()
    
        plt.savefig(r'E:1.png', dpi=1000, bbox_inches='tight')  #保存至本地
    
        plt.show()
    

    来看看效果

    有没有瞬间就感觉高~大~上~~了(嘿嘿~)

    然后我们用相同的方法来多绘制几个对比图:

    # **********************************************************************评论数和收藏数对比
        # ********评论数条形图
        fig, ax3 = plt.subplots()
        plt.bar(dm_name, dm_review, color='green')
        plt.title('番剧评论数和收藏数分析')
        plt.ylabel('评论数(万)')
        ax3.tick_params(labelsize=6)
        plt.xticks(rotation=90, color='green')
    
        # *******收藏数折线图
        ax4 = ax3.twinx()  # 组合图必须加这个
        ax4.plot(dm_favorite, color='yellow')  # 设置线粗细,节点样式
        plt.ylabel('收藏数(万)')
    
        plt.plot(1, label='评论数', color="green", linewidth=5.0)
        plt.plot(1, label='收藏数', color="yellow", linewidth=1.0, linestyle="-")
        plt.legend()
        plt.savefig(r'E:2.png', dpi=1000, bbox_inches='tight')
    
        # **********************************************************************综合评分和收藏数对比
        # *******综合评分条形图
        fig, ax5 = plt.subplots()
        plt.bar(dm_name, dm_com_score, color='red')
        plt.title('综合评分和收藏数量数据分析')
        plt.ylabel('综合评分')
        ax5.tick_params(labelsize=6)
        plt.xticks(rotation=90, color='green')
    
        # *******收藏折线图
        ax6 = ax5.twinx()  # 组合图必须加这个
        ax6.plot(dm_favorite, color='yellow')  # 设置线粗细,节点样式
        plt.ylabel('收藏数(万)')
        plt.plot(1, label='综合评分', color="red", linewidth=5.0)
        plt.plot(1, label='收藏数', color="yellow", linewidth=1.0, linestyle="-")
        plt.legend()
    
        plt.savefig(r'E:3.png', dpi=1000, bbox_inches='tight')
    
        # **********************************************************************播放量和评论数对比
        # *******播放量条形图
        fig, ax7 = plt.subplots()
        plt.bar(dm_name, dm_play, color='cyan')
        plt.title('播放量和评论数 数据分析')
        plt.ylabel('播放量(万)')
        ax7.tick_params(labelsize=6)
        plt.xticks(rotation=90, color='green')
    
        # *******评论数折线图
        ax8 = ax7.twinx()  # 组合图必须加这个
        ax8.plot(dm_review, color='green')  # 设置线粗细,节点样式
        plt.ylabel('评论数(万)')
        plt.plot(1, label='播放量', color="cyan", linewidth=5.0)
        plt.plot(1, label='评论数', color="green", linewidth=1.0, linestyle="-")
        plt.legend()
        plt.savefig(r'E:4.png', dpi=1000, bbox_inches='tight')
    
        plt.show()
    

    我们来看看最终效果
    image.png
    image.png

    Nice!很完美~ 大家可以根据自己的想法按照相同的方法进行数据组合分析。

    最后,附上全部代码

    import re
    import pandas
    import requests
    from bs4 import BeautifulSoup
    import matplotlib.pyplot as plt
    from matplotlib import font_manager
    
    
    def get_html(url):
        try:
            r = requests.get(url)  # 使用get来获取网页数据
            r.raise_for_status()  # 如果返回参数不为200,抛出异常
            r.encoding = r.apparent_encoding  # 获取网页编码方式
            return r.text  # 返回获取的内容
        except:
            return '错误'
    
    
    def save(html):
        # 解析网页
        soup = BeautifulSoup(html, 'html.parser')  # 指定Beautiful的解析器为“html.parser”
    
        with open('./data/B_data.txt', 'r+', encoding='UTF-8') as f:
            f.write(soup.text)
    
        # 定义好相关列表准备存储相关信息
        TScore = []  # 综合评分
        name = []  # 动漫名字
        bfl = []  # 播放量
        pls = []  # 评论数
        scs = []  # 收藏数
    
        # ********************************************  动漫名字存储
        for tag in soup.find_all('div', class_='info'):
            # print(tag)
            bf = tag.a.string
            name.append(str(bf))
        print(name)
    
        # ********************************************  播放量存储
        for tag in soup.find_all('div', class_='detail'):
            # print(tag)
            bf = tag.find('span', class_='data-box').get_text()
            # 统一单位为‘万’
            if '亿' in bf:
                num = float(re.search(r'\d(.\d)?', bf).group()) * 10000
                # print(num)
                bf = num
            else:
                bf = re.search(r'\d*(\.)?\d', bf).group()
            bfl.append(float(bf))
        print(bfl)
        # ********************************************  评论数存储
        for tag in soup.find_all('div', class_='detail'):
            # pl = tag.span.next_sibling.next_sibling
            pl = tag.find('span', class_='data-box').next_sibling.next_sibling.get_text()
            # *********统一单位
            if '万' not in pl:
                pl = '%.1f' % (float(pl) / 10000)
                # print(123, pl)
            else:
                pl = re.search(r'\d*(\.)?\d', pl).group()
            pls.append(float(pl))
        print(pls)
        # ********************************************  收藏数
        for tag in soup.find_all('div', class_='detail'):
            sc = tag.find('span', class_='data-box').next_sibling.next_sibling.next_sibling.next_sibling.get_text()
            sc = re.search(r'\d*(\.)?\d', sc).group()
            scs.append(float(sc))
        print(scs)
        # ********************************************  综合评分
        for tag in soup.find_all('div', class_='pts'):
            zh = tag.find('div').get_text()
            TScore.append(int(zh))
        print('综合评分', TScore)
    
        # 存储至excel表格中
        info = {'动漫名': name, '播放量(万)': bfl, '评论数(万)': pls, '收藏数(万)': scs, '综合评分': TScore}
        dm_file = pandas.DataFrame(info)
        dm_file.to_excel('Dongman.xlsx', sheet_name="动漫数据分析")
        # 将所有列表返回
        return name, bfl, pls, scs, TScore
    
    
    def view(info):
        my_font = font_manager.FontProperties(fname='./data/STHeiti Medium.ttc')  # 设置中文字体(图标中能显示中文)
        dm_name = info[0]  # 番剧名
        dm_play = info[1]  # 番剧播放量
        dm_review = info[2]  # 番剧评论数
        dm_favorite = info[3]  # 番剧收藏数
        dm_com_score = info[4]  # 番剧综合评分
        # print(dm_com_score)
    
        # 为了坐标轴上能显示中文
        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.rcParams['axes.unicode_minus'] = False
    
        # **********************************************************************综合评分和播放量对比
        # *******综合评分条形图
        fig, ax1 = plt.subplots()
        plt.bar(dm_name, dm_com_score, color='red')  #设置柱状图
        plt.title('综合评分和播放量数据分析', fontproperties=my_font)  # 表标题
        ax1.tick_params(labelsize=6)
        plt.xlabel('番剧名')  # 横轴名
        plt.ylabel('综合评分')  # 纵轴名
        plt.xticks(rotation=90, color='green')  # 设置横坐标变量名旋转度数和颜色
    
        # *******播放量折线图
        ax2 = ax1.twinx()  # 组合图必须加这个
        ax2.plot(dm_play, color='cyan')  # 设置线粗细,节点样式
        plt.ylabel('播放量')  # y轴
    
        plt.plot(1, label='综合评分', color="red", linewidth=5.0)  # 图例
        plt.plot(1, label='播放量', color="cyan", linewidth=1.0, linestyle="-")  # 图例
        plt.legend()
    
        plt.savefig(r'E:1.png', dpi=1000, bbox_inches='tight')  #保存至本地
    
        # plt.show()
    
        # **********************************************************************评论数和收藏数对比
        # ********评论数条形图
        fig, ax3 = plt.subplots()
        plt.bar(dm_name, dm_review, color='green')
        plt.title('番剧评论数和收藏数分析')
        plt.ylabel('评论数(万)')
        ax3.tick_params(labelsize=6)
        plt.xticks(rotation=90, color='green')
    
        # *******收藏数折线图
        ax4 = ax3.twinx()  # 组合图必须加这个
        ax4.plot(dm_favorite, color='yellow')  # 设置线粗细,节点样式
        plt.ylabel('收藏数(万)')
    
        plt.plot(1, label='评论数', color="green", linewidth=5.0)
        plt.plot(1, label='收藏数', color="yellow", linewidth=1.0, linestyle="-")
        plt.legend()
        plt.savefig(r'E:2.png', dpi=1000, bbox_inches='tight')
    
        # **********************************************************************综合评分和收藏数对比
        # *******综合评分条形图
        fig, ax5 = plt.subplots()
        plt.bar(dm_name, dm_com_score, color='red')
        plt.title('综合评分和收藏数量数据分析')
        plt.ylabel('综合评分')
        ax5.tick_params(labelsize=6)
        plt.xticks(rotation=90, color='green')
    
        # *******收藏折线图
        ax6 = ax5.twinx()  # 组合图必须加这个
        ax6.plot(dm_favorite, color='yellow')  # 设置线粗细,节点样式
        plt.ylabel('收藏数(万)')
        plt.plot(1, label='综合评分', color="red", linewidth=5.0)
        plt.plot(1, label='收藏数', color="yellow", linewidth=1.0, linestyle="-")
        plt.legend()
    
        plt.savefig(r'E:3.png', dpi=1000, bbox_inches='tight')
    
        # **********************************************************************播放量和评论数对比
        # *******播放量条形图
        fig, ax7 = plt.subplots()
        plt.bar(dm_name, dm_play, color='cyan')
        plt.title('播放量和评论数 数据分析')
        plt.ylabel('播放量(万)')
        ax7.tick_params(labelsize=6)
        plt.xticks(rotation=90, color='green')
    
        # *******评论数折线图
        ax8 = ax7.twinx()  # 组合图必须加这个
        ax8.plot(dm_review, color='green')  # 设置线粗细,节点样式
        plt.ylabel('评论数(万)')
        plt.plot(1, label='播放量', color="cyan", linewidth=5.0)
        plt.plot(1, label='评论数', color="green", linewidth=1.0, linestyle="-")
        plt.legend()
        plt.savefig(r'E:4.png', dpi=1000, bbox_inches='tight')
    
        plt.show()
    
    
    def main():
        url = 'https://www.bilibili.com/v/popular/rank/bangumi'  # 网址
        html = get_html(url)  # 获取返回值
        # print(html)
        info = save(html)
        view(info)
    
    
    if __name__ == '__main__':
        main()
    

    关于图表的分析和得出的结论,这里就不描述了,一千个读者就有一千个哈姆雷特,每个人有每个人的分析描述方法,相信你们能有更加透彻的见解分析。

    以上就是关于爬虫以及数据可视化分析的内容,希望能帮到你们!
    伙伴们可以到github上查看源码文件:https://github.com/Lemon-Sheep/Py/tree/master

    喜欢记得点个赞哦~

    展开全文
  • python 爬虫之selenium可视化爬虫

    万次阅读 多人点赞 2020-08-05 19:52:11
    之所以把selenium爬虫称之为可视化爬虫 主要是相较于前面所提到的几种网页解析的爬虫方式 selenium爬虫主要是模拟人的点击操作 selenium驱动浏览器并进行操作的过程是可以观察到的 就类似于你在看着别人在帮你操纵你...
  • python 爬虫数据可视化

    千次阅读 2020-07-08 11:37:12
    python 爬虫数据可视化 1.引言 Web已经成为日新月异迅速发展的网络信息技术中的信息载体,如何有效地提取和利用搜索引擎获得互联网最有用的、可以免费公开访问的数据集,查找用户所需的价值数据或者相近的价值...
  • 大学计算机课程报告-Python爬虫可视化.pdf
  • python爬虫数据可视化分析

    千次阅读 多人点赞 2021-01-07 09:46:58
    对于刚开始学习编程的小伙伴来说,肯定都对爬虫有一定的兴趣,对于新手来说,从Python爬虫如入门应该是简单易懂的。Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向...
  • python网络爬虫,爬取某网站景点信息,使用scrapy框架,存入excel,并实现可视化,内含有含有文档,原创,可以作为课程设计使用。(19年的代码,需要自己在调试一下爬虫部分)
  • 豆瓣Top250Python爬虫+数据可视化.zip
  • python爬虫及其可视化

    千次阅读 2020-12-26 11:08:43
    使用pyarm中的flask框架搭建可视化平台,使用sqlite数据库的数据制作简单的网页,并制作折线图、柱状图、散点图等等。 二、数据爬取 1.引入库 代码如下: from bs4 import BeautifulSoup import re import urllib....
  • 豆瓣Top250:Python爬虫+数据可视化

    千次阅读 2021-02-10 16:39:21
    文章目录豆瓣Top250:Python爬虫+数据可视化前言数据爬取测试类库1.urllib.request( 获取网页HTML源代码)2.re(匹配HTML源代码)3.bs4(HTML/XML的解析器)搜索文档树CSS选择器4.xlwt(解析出的数据保存到Excel)5....
  • python爬虫+可视化GitHub上标星最高的python项目 大三,刚开始学习python,把学习过程都记录下来,今天第一次写博客,利用一点时间做了这个项目,话不多说直接上图上代码。 ` import requests import pygal ...
  • 简单几步,通过Python对B站番剧排行数据进行爬取,并进行可视化分析 源码文件可以参考Github上传的项目:https://github.com/Lemon-Sheep/Py/tree/master 下面,我们开始吧! PS: 作为Python爬虫初学者,如有不...
  • 1.股票的数据采集 2.数据可视化 3.自动化
  • Python爬虫数据可视化总结

    千次阅读 2021-09-15 19:43:41
    工具: Python,Flask,JS,CSS,HTML,WordCloud 爬取数据并存入数据库 一.导入需要的包 from bs4 import BeautifulSoup # 网页解析,获取数据 import re # 正则表达式,进行文字匹配 import xlwt # 进行excel操作 import ...
  • Python爬虫&可视化第1季-城市旅游数据分析

    千次阅读 多人点赞 2019-09-17 17:14:21
    前言:本着跟大家一同探讨学习的态度,今后几期文章会更新一些用python实现爬虫&可视化的文章。Python对于本人来讲也是一个在逐渐学习掌握的过程,这次的内容就...
  • 好不容易找到的爬虫可视化的教程 分享给大家
  • 基于Python爬虫的电影数据可视化分析.pdf
  • python爬虫+数据可视化项目

    万次阅读 多人点赞 2019-07-05 15:18:31
    爬取内容:全国实时温度最低的十个城市气温排行榜 使用工具:requests库实现发送请求、获取响应。...pyechart模块实现数据可视化 爬取结果:柱状图可视化展示: 直接放代码 from bs4 import Beautifu...
  • Python数据分析第12周 DATAGURU专业数据分析社区 Python数据分析讲师何翠仪 时间序列 时间序列分析(Time series analysis)是一种动态数据处理的统计方法该方法基于随机 过程理论和数理统计学方法研究随机数据序列所...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,550
精华内容 10,220
关键字:

python爬虫数据可视化

python 订阅
爬虫 订阅