精华内容
下载资源
问答
  • python爬虫与数据可视化
    千次阅读 多人点赞
    2020-09-21 19:40:44

           计算机技术日新月异,编程语言众多,每种编程语言又有自己的特点和适用场景,究竟应该如何选择呢?众说纷纭。我们可以参考编程语言的热度排名,了解世界范围内,各种编程语言的热度及发展趋势

           TIOBE编程语言排行榜根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎以及Wikipedia、Amazon、YouTube统计出排名数据,能够较好反映某个编程语言的热门程度,TIOBE排行榜每个月更新一次,网址为:https://www.tiobe.com/tiobe-index/。下面我们就 通过Python抓取2001年5月至今,TIOBE编程语言排行榜上编程语言的热度数据,并绘制成动态的效果图,最终效果如下。

    1、数据抓取和保存

           首先打开TIOBE排行榜首页:https://www.tiobe.com/tiobe-index/,查看源代码,可发现源代码中就直接包含了排名前十的编程语言在各个时期的热度值,源代码部分截图如下:

           接下来可直接获取网页内容,然后通过正则表达式进行解析获取每一部分信息。首先,获取每一种编程语言的信息;然后循环解析这些信息,获取每一个月份的热度值;最后,将解析的结果保存到文件中去。关键代码参考如下:

    2、绘制动态变化图

            首先,使用Pandas库中相关方法,直接读取csv文件,得到DataFrame类型对象,获取所有的不重复的时间信息;然后,循环遍历每一个时间信息,获取该时间下所有编程语言的热度,并根据热度值对数据以及编程语言进行排序,使得热度最高放在最上面;接着,根据排好序的热度值以及编程语言名称,绘制水平的条形图;最后,每个图停留0.05秒,清空图上的内容,继续绘制下一个时间对应的图。参考到代码如下:

     注意:代码中使用到了一些第三方库,要保证相关库已安装并且已导入,否则无法执行。相关导入内容如下:   

     
         

    源代码及相关资源,可关注 Python资源分享 微信公众号,回复rank 即可获取。

    更多相关内容
  • 这里先不讲,后面后面会说到,接下来就需要储存信息,这里使用Excel,虽然比较麻烦,不过胜在清晰直观爬取代码如下,这里就能利用双层循环来实现换页爬取换行输出我这里为了获得大量数据所以爬取了1
  • python 爬虫与数据可视化

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

    python 爬虫与数据可视化

    1.引言
    Web已经成为日新月异迅速发展的网络信息技术中的信息载体,如何有效地提取和利用搜索引擎获得互联网最有用的、可以免费公开访问的数据集,查找用户所需的价值数据或者相近的价值信息。网络爬虫具有诸多优势,可根据用户的实际需求,对网页数据信息进行爬取,获取整个网页,且具备很强的自定义性特点。本文通过利用python进行数据爬取与分析,python是近几年比较热门的语言,python入门简单,应用让范围广,与当下众多热门软件兼容,其对应的数据包和框架也逐渐成熟。
    2.需求分析
    2.1网站分析
    爬取豆瓣读书Top250的基本信息,如下图(2-1)第一本书籍,红楼梦,书籍名称、作者、图片、评分、评价人数等数据。利用python向浏览器发送请求的时候,返回的是html代码,然后对html解析,解析的工具有很多。比如:正则表达式、Beautifulsoup、Xpath等,这里采用xpath方法。
    在这里插入图片描述
    图2-1
    借助Chrome开发者工具(F12)来分析网页,在Element下找到需要数据的位置如下图(2-2)所示:
    在这里插入图片描述

    图2-2
    2.2爬取基本流程
    URL分析
    通过浏览器查看分析目目标网页。
    获取数据
    通过HTTP库向目标站点发起请求,请求可以包含额外的header等信息,如果服务器能正常响应,会得到一个Respone,便是所要获取的页面内容。
    解析内容
    得到的内容可能是HTML、json等格式,可以用页面解析库、正则表达式等进行解析。
    存储数据
    保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件
    流程如下图(2-3)所示:
    在这里插入图片描述
    图2-3
    2.3数据可视化
    使用Flask框架将爬取的数据进行可视化分析,Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。本实验用于Flask框架将数据显示到网页,以及生成书籍评分柱状图(使用Echarts模块)和利用书籍概况生成词云(使用WordCloud模块)。
    2.3.1引入Flask框架
    Flask是一个使用 Python 编写的轻量级 Web 应用框架。其WSGI工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。
    Flask程序运行过程:每个Flask程序必须有一个程序实例。Flask调用视图函数后,会将视图函数的返回值作为响应的内容,返回给客户端。一般情况下,响应内容主要是字符串和状态码。调用视图函数,获取响应数据后,把数据传入HTML模板文件中,模板引擎负责渲染响应数据,然后由Flask返回响应数据给浏览器,最后浏览器处理返回的结果显示给客户端。
    创建Flask
    在这里插入图片描述
    图2-4
    在运行的环境配置中,勾选Flask Debug
    在这里插入图片描述
    图2-5
    使用Echarts
    商业级数据图表,它是一个纯JavaScript的图标库,兼容绝大部分的浏览器,底层依赖轻量级的canvas类库ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,赋予了用户对数据进行挖掘、整合的能力。
    支持的图表:
    折线图(区域图)、柱状图(条状图)、散点图(气泡图)、K线图、饼图(环形图)
    雷达图(填充雷达图)、和弦图、力导向布局图、地图、仪表盘、漏斗图、事件河流图等12类图表
    官方中文网址:https://www.echartsjs.com/zh/index.html
    使用流程:
    在这里插入图片描述
    图2-6
    使用WordCloud
    WordCloud是python的一个三方库,称为词云也叫做文字云,是根据文本中的词频,对内容进行可视化的汇总.原理是首先将爬取的文本数据通过分隔单词,然后统计单词出现次数并过滤,接着根据统计配置字号,最后将生成的字号布局到给定的环境中。
    2.4引入模块
    模块(module):用来从逻辑上组织Python代码(变量、函数、类),本质就是py文件,提高代码的可维护性。Python使用import来导入模块。如本次实验用到的模块有:

    3.实现代码
    3.1爬取网页
    3.1.1URL分析
    页面URL:https://book.douban.com/top250?start=
    页面包括250条书籍数据,分10页,每页25条,每页的URL的不同之处:最后的数值=(页数-1)*25
    在这里插入图片描述
    图3-1
    3.1.2获取数据
    通过HTTP库向目标站点发起请求,请求可以包含额外的header等信息,如果服务器能正常响应,会得到一个Response,便是所要获取的页面内容。具体操作如下:
    对每一个页面,调用gainURL函数,传入一个url参数;urllib.request.urlopen发送请求获取响应;read()获取页面内容

    def gainURL(url):
        head = {     #模拟浏览器头部信息,向豆瓣服务器发送消息
            "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122  Safari / 537.36"
        }
        request = urllib.request.Request(url,headers=head)
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
        return html
    

    3.1.3解析内容
    得到的内容可能是HTML、JSON等格式,可以用bs4、正则表达式、xpath等进行解析。
    使用正则表达式找到具体的内容

    findLink = re.compile(r'<a class="nbg" href="(.*?)" οnclick=') # 读书详情链接
    findimgSrc = re.compile(r'<img src="(.*?)"')# 书籍图片链接
    findTitle = re.compile(r'title="(.*?)"')# 书籍名称
    findAuthor = re.compile(r'<p class="pl">(.*?)</p>')# 书籍作者
    findRating  = re.compile(r'<span class="rating_nums">(.*?)</span>')#书籍评分
    findInq = re.compile(r'<span class="inq">(.*)</span>')# 书籍概况
    

    BeautifulSoup定位特定的标签位置与正则表达式结合爬取内容
    #解析数据

    soup=BeautifulSoup(html,"html.parser")  #bs4定位特定的标签位置
    for item in soup.find_all('table'):
        data = []  # 保存一部电影的所有信息
        item = str(item)
        # 书籍详情链接
        findLink = re.compile(r'<a class="nbg" href="(.*?)" οnclick=')
        link = re.findall(findLink, item)[0]
        data.append(link)
    
        # 书籍图片链接
        findimgSrc = re.compile(r'<img src="(.*?)"')
        imgSrc = re.findall(findimgSrc, item)[0]
        data.append(imgSrc)
    
        # 书籍名称
        findTitle = re.compile(r'title="(.*?)"')
        title = re.findall(findTitle, item)[0]
        data.append(title)
    
        # 书籍作者
        findAuthor = re.compile(r'<p class="pl">(.*?)</p>')
        author = re.findall(findAuthor, item)[0]
        data.append(author)
    
        # 书籍评分
        findRating  = re.compile(r'<span class="rating_nums">(.*?)</span>')
        rating = re.findall(findRating , item)[0]
        data.append(rating)
    
        # 书籍概况
        findInq = re.compile(r'<span class="inq">(.*)</span>')
        Inq = re.findall(findInq , item)
        data.append(Inq)
    
        datalist.append(data)  # 把处理好的信息放入datalist
    

    3.1.4存储数据
    保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件
    利用python库xlwt将抽取的数据datalist写入Excel表格

    def saveData(datalist,savepath):
        bookwork = xlwt.Workbook(encoding="UTF-8",style_compression=0)
        sheet = bookwork.add_sheet('豆瓣书籍TOP250',cell_overwrite_ok=True)
        col = ("书籍详情链接", "图片链接", "书名", "作者", "评分", "概况")
        for i in range(0, 6):
            sheet.write(0, i, col[i])  # 列名
        for i in range(0, 250):
            print("第%d条已爬取" % (i + 1))
            data = datalist[i]
            for j in range(0, 6):
                sheet.write(i + 1, j, data[j])  # 数据
        bookwork.save(savepath)  # 保存
    

    利用python库sqlite3将抽取的数据datalist写入db文件
    init_db()函数创建数据库表格

    def init_db(savepath):
        sql = '''
            create table book250 
            (
            id integer primary key autoincrement,
            info_link text,
            pic_link text,
            name varchar,
            author varchar,
            score numeric ,
            instroduction text
            )
        '''  # 创建数据表
        conn = sqlite3.connect(savepath)
        cursor = conn.cursor()
        cursor.execute(sql)
        conn.commit()
        conn.close()
    saveDataDB()函数存储数据
    def saveDataDB(datalist,savepath):
        init_db(savepath)
        conn = sqlite3.connect(savepath)
        cur = conn.cursor()
    
        for data in datalist:
            for index in range(len(data)):
                data[index] = '"'+data[index]+'"'
            sql = '''
                    insert into book250 (
                    info_link,pic_link,name,author,score,instroduction) 
                    values(%s)'''%",".join(data)
            cur.execute(sql)
            conn.commit()
        cur.close()
        conn.close()
    

    3.2数据可视化
    3.2.1 Flask
    导入Flask类,接收一个__name__参数用于与web页面进行数据交互,route作用是将路由映射到视图函数def index(),应用程序实例的run方法启动WEB服务器

    form flask import Flask 
    app = Flask(__name__) @app.route('/')
    def index():
        return render_template("index.html")
     if __name__ == '__main__':
        app.run()
    引入import sqlite3模块,从.db文件中提取数据,
    def book():
        datalist  = []
        con = sqlite3.connect("book.db") #访问数据库
        cur = con.cursor() #游标
        sql = "select * from book250"
        data = cur.execute(sql)
        for item in data:
            datalist.append(item)
        cur.close()
        con.close()
        return render_template("book.html",books = datalist)
    

    页面部署,从渲染模板时使用的数据中获取;Jinja2除了能识别基本类型的变量,还能识别{};

    {% for book in books %}
    <tr>
        <td>{{book[0]}}</td>
        <td>
            <a href="{{ book[1] }}" target="_blank">{{ book[3] }}</a>
        </td>
        <td><img src="{{book[2]}}" width="70px"> </td>
        <td>{{book[4]}}</td>
        <td>{{book[5]}}</td>
     <td>{{book[6]}}</td>
    </tr>
    {% endfor %}
    

    3.2.2 Echarts
    页面引入echarts文件

    <!DOCTYPE html> 
    <html> 
    <head>
    <meta charset="utf-8"> 
    <!-- 引入 ECharts 文件 --> 
    <script src="echarts.min.js"></script> 
    </head> 
    </html> 
    

    数据库提取出柱形图横坐标纵坐标值

    def score():
        score = []  #评分
        num = []    #每个评分所统计出的书籍数量
        con = sqlite3.connect("book.db")
        cur = con.cursor()
        sql = "select score,count(score) from book250 group by score"
        data = cur.execute(sql)
        for item in data:
            score.append(str(item[0]))
            num.append(item[1])
    
        cur.close()
        con.close()
        return render_template("score.html",score= score,num=num)
    

    页面渲染

    <script type="text/javascript">
    var dom = document.getElementById("main");
    var myChart = echarts.init(dom);
    var app = {};
    option = null;
    option = {
        color:['#3398DB'],
        tooltip: {
            trigger: 'axis',
            axisPointer: {
                type: 'shadow'
            }
        },
        grid: {
            left: '3%',
            right:'4%',
            bottom:'3%',
            containLabel:true
        },
        xAxis: {
            type: 'category',
            data: {{ score|tojson }}
        },
        yAxis: {
            type: 'value'
        },
        series: [{
            data: {{ num }},
            barWidth:'60%',
            type:'bar'
        }]
    };
    ;
    if (option && typeof option === "object") {
        myChart.setOption(option, true);
    }
           </script>
    

    3.2.3 WordCloud
    准备词云(使用爬取的book.db文件的instroduction字段进行分析)
    #准备词云所需的文字(词)

    con = sqlite3.connect('book.db')
    cur = con.cursor()
    sql = 'select instroduction from book250'
    data = cur.execute(sql)
    text = ""
    for item in data:
        text =  text + item[0]
    cur.close()
    con.close()
    
    分词
    cut = jieba.cut(text)
    string = ' '.join(cut)
    print(len(string))
    生成图片
    img = Image.open(r'.\static\assets\img\tree.jpg')   #打开遮罩图片
    img_array = np.array(img)   #将图片转换为数组
    wc = WordCloud(
        background_color='white',
        mask=img_array,
        font_path="msyh.ttc"    # 生成字体
    )
    wc.generate_from_text(string)
    #绘制图片
    fig = plt.figure(1)
    plt.imshow(wc)
    plt.axis('off')     #是否显示坐标轴
    plt.show()    #显示生成的词云图片
    

    显示到页面

    <img src="static/assets/img/bookword.jpg" class="img-fluid" alt="">
    

    4.实验
    4.1爬取结果
    book_excel.py文件爬取结果
    在这里插入图片描述
    图4-1
    book_sql.py文件爬取结果
    在这里插入图片描述
    图4-2
    生成词云图片
    在这里插入图片描述
    图4-3
    4.2分析结果
    首页展示
    在这里插入图片描述
    图4-4
    Top250书籍展示
    在这里插入图片描述
    图4-5
    评分分布展示
    在这里插入图片描述
    图4-6
    词云展示
    在这里插入图片描述
    图4-7
    5.总结和展望
    本实验通过爬取豆瓣排行前250的书籍,了解了python爬虫涉及包含的知识不限于 HTML 知识、HTTP/HTTPS 协议的基本知识、正则表达式,还需要了解数据库知识,爬虫框架的使用等。

    展开全文
  • Python爬虫与数据可视化实战.html
  • python爬虫,并将数据进行可视化分析,数据可视化包含饼图、柱状图、漏斗图、词云、另附源代码和报告书。
  • Python爬虫数据可视化分析大作业,python爬取猫眼评论数据,并做可视化分析。
  • 数据处理与可视化之Altair 后言-python爬虫相关库 网络爬虫简介 网络爬虫(webcrawler,又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种用来自动浏览万维网的程序或者脚本。爬虫...
  • 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爬虫数据分析可视化.rar
  • Python 网络爬虫数据可视化

    千次阅读 多人点赞 2021-01-11 18:47:13
    1.3 数据可视化 2 1.4 Python环境介绍 2 1.4.1 简介 2 1.4.2 特点 3 1.5 扩展库介绍 3 1.5.1 安装模块 3 1.5.2 主要模块介绍 3 ① pandas模块 3 ② requests模块 4 ③ bs4模块 4 ④ selenium模块 4 ⑤ matplotlib...

    1 项目背景

    1.1Python的优势

    Python有成熟的程序包资源库和活跃的社区 Python以PYPI为技术支撑,资源丰富,可被灵活调用。还有一些其他优势,比如跨平台且开源、成本小;可方便快捷实现数据可视化,像2D图表和一些基本的3D 图表可以借matplotlib和 seaborn等等一些专属库,只需要编写简单的Python代码就可输出可视化结果,方便快捷[1]。

    1.2网络爬虫

    网络爬虫(Web Crawler)是依照一定规则主动抓取网页的程序,是搜索引擎获得信息的渠道之一。通常根据给定 URL 种子爬取网页,得到新的 URL 存放至待爬行 URL中,当满足一定条件时停止爬行。网络爬虫一般分为通用网络爬虫、深度网络爬虫和主题网络爬虫 3 类。 主题网络爬虫通常给定 URL 种子集,依照预先规定的主题,由特定的分析算法算出爬行网页的主题相关度,并过滤与主题无关的网页,优先抓取相关度高的网页,当满足一定条件时停止。主题网络爬虫根据主题对 Web 进行分块采集并整合采集结果,从而提高 Web 页面利用率[2]。

    1.3数据可视化

    在计算机学科的分类中,利用人眼的感知能力对数据进行交互的可视化表达以增强认知的技术,称为可视化。16 世纪,天体和地理的测量技术得到发展, 通过三角测量等技术可精确绘制地图,数据可视化开始萌芽。20 世纪 60 年代计算机的发展使得数据可视化加速发展,通过计算机图像处理等技术,新的可视化方法和技术迎来爆炸性增长。数据可视化将相对复杂、冗杂的大数据经过挖掘、转化,提炼出结构化数据内容,并通过可视的方式以用户更易理解的形式 展示出来,清晰表达数据内在的信息和规律[3]。

    1.4Python环境介绍

    1.4.1简介

    PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。
    此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。同时支持Google App Engine,PyCharm支持IronPython。这些功能在先进代码分析程序的支持下,使 PyCharm 成为 Python 专业开发人员和刚起步人员使用的有力工具。

    1.4.2特点

    首先,PyCharm拥有一般IDE具备的功能,比如, 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制
    另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持Google App Engine,更酷的是,PyCharm支持IronPython主要功能

    1.5扩展库介绍

    1.5.1安装模块

    安装命令

    1.5.2主要模块介绍

    ① pandas模块
    pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。它纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具,提供了大量能使我们快速便捷地处理数据的函数和方法[4]。
    pandas中常见的数据结构有两种:
    Series DateFrame
    类似一维数组的对象, 类似多维数组/表格数组;每列数据可以是不同的类型;索引包括列索引和行索引。
    在这里插入图片描述

    ② requests模块
    requests是一常用的http请求库,它使用python语言编写,可以方便地发送http请求,以及方便地处理响应结果。
    ③ bs4模块
    BS4 (beautiful soup 4)是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.
    ④ selenium模块
    selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
    selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
    ⑤ matplotlib模块
    matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。它可与Numpy一起使用,提供一种有效的MATLAB开源替代方案;它也可以和图形工具包一起使用,让用户很轻松地将数据图形化;同时它还提供多样的输出格式。
    ⑥ seaborn模块
    seaborn是一个在Python中制作有吸引力和丰富信息的统计图形的库。它构建在MatPultLB的顶部,与PyDATA栈紧密集成,包括对SIMPY和BANDA数据结构的支持以及SISPY和STATSMODEL的统计例程。
    seaborn 其实是在matplotlib的基础上进行了更高级的 API 封装,从而使得作图更加容易 在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充。Seabn是基于MatPultLB的Python可视化库。它为绘制有吸引力的统计图形提供了一个高级接口。
    ⑦ pyecharts模块
    pyecharts 是一个用于生成 Echarts 图表的类库。echarts 是百度开源的一个数据可视化 JS 库,主要用于数据可视化。pyecharts 是一个用于生成 Echarts 图表的类库。实际上就是 Echarts 与 Python 的对接。使用 pyecharts 可以生成独立的网页,也可以在 flask , Django 中集成使用。

    2 需求分析

    2.1 网络爬虫需求

    通过对爬取网页的html分析,爬取网页的数据,将爬取的数据保存到文件,用于对数据进行可视化。

    2.2 数据可视化需求

    使爬取网站的数据用更直观的效果展示,当数据获取完成,我们使用相关模块对数据进行清洗处理,并对数据做可视化分析,并理解每一个图标所代表意义;

    3 总体设计

    3.1 网页分析

    在爬取国家统计局网站上的数据,需要用到WebDriver,先安装chromdriver。安装的Chromedriver要与自己电脑上的谷歌版本号对应,将下载的chromedriver.exe放到如图 1图 2所示路径下,放到安装谷歌和安装python路径下,用来调用这个可执行文件。还将这两个路径添加环境变量。
    图1
    图2

    驱动浏览器,用webdriver的对象对网页进行点击等操作,找到想要爬取的网站。
    通过对网页html分析,通过路径一层层找到自己想要获取的数据。如图 3所示,将数据追加到列表中,保存到文件。
    图3

    爬取豆瓣电影Top250,翻页查看url变化规律:
    第一页:https://movie.douban.com/top250?start=0&filter=
    第二页:https://movie.douban.com/top250?start=25&filter=
    第三页:https://movie.douban.com/top250?start=50&filter=
    第十页:https://movie.douban.com/top250?start=225&filter=
    分析可得页面url的规律:
    url_list = [“https://movie.douban.com/top250?start={}&filter=”.format(x * 25) for x in range(10)]
    对网页进行分析,如图 4所示,每个li标签里都包含每个电影的基本信息,例如:“排名”, “电影名”, "导演和主演"等等。将这些信息追加到列表中,保存到movie.xlsx文件中。

    3.2 数据可视化设计

    将爬取的数据用多种图表的显示。例如:条形图,饼图,散点图,箱线图,玫瑰图,词云等形式。利用python的pandas模块将数据文件读入。导入matplotlib, pyecharts等模块,调用模块画图的相应函数。进行数据可视化,并将可视化结果保存为图片。

    4 方案实施

    4.1 网络爬虫代码

    import pandas as pd
    import requests
    from bs4 import BeautifulSoup
    import time
    import re
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    import lxml
    import openpyxl
    import codecs
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3"
    }
    url1 = "https://data.stats.gov.cn/easyquery.htm?cn=E0105"
    url2 = "http://data.stats.gov.cn"
    '''爬取近五年主要城市数据'''
    def driver1(url1):
        driver = webdriver.Chrome()
        driver.get(url1)
        time.sleep(3)
        xRdata = '//*[@id="details-button"]'  # 点击高级
        ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform()
        xRdata = '//*[@id="proceed-link"]'  # 点击
        ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform()
        time.sleep(3)
        time.sleep(4)  # 加载页面,停留时间长一些
        xTable = '//*[@class="table-container"]/div/div[3]/table/tbody'  # 主要城市年度数据表
        table = driver.find_element_by_xpath(xTable).get_attribute('innerHTML')
        soup = BeautifulSoup(table, 'html.parser')  # 解析表单
        tb = soup.find_all('tr')  # 查找表内tr标签
        tb_p = []  # 各城市名字
        tb_ = []
        tb_1 = [[], [], [], [], []]
        for row in tb:
            row_text = row.text
            # 查找第一个数字的索引
            ret1 = re.search('\d', row_text).start()
            # 将各个城市写入列表中
            tb_p.append(row_text[:ret1])
            # 截断至第一个数字
            row_text = row_text[ret1:]
            for i in range(5):
                try:
                    # 顺序查找点
                    ret = row_text.find('.')
                    # 将第一年年数据保存到列表中
                    tb_.append(row_text[:ret + 3])
                    # 删去第一年的数据
                    row_text = row_text[ret + 3:]
                except:
                    break
        for i in range(5):
            for j in range(i, len(tb_), 5):
                try:
                    tb_1[i].append(tb_[j])
                except:
                    break
        data = {'地区': tb_p,
                '2019年': tb_1[0],
                '2018年': tb_1[1],
                '2017年': tb_1[2],
                '2016年': tb_1[3],
                '2015年': tb_1[4],
                }
        dataframe = pd.DataFrame(data)
        dataframe.to_csv('City_data.csv', index=False, sep=',', encoding='utf-8-sig')
        driver.close()
    '''爬取2019年各省GDP'''
    def driver2(url2):
        driver = webdriver.Chrome()
        driver.get(url2)
        time.sleep(3)
        xRdata = '//*[@id="details-button"]'  # 点击高级
        ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform()
        xRdata = '//*[@id="proceed-link"]'  # 点击
        ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform()
        time.sleep(3)
        xRdata = '//*[@id="nav"]/ul/li[6]/a'  # 地区数据
        ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform()
        time.sleep(3)
        xPdata = '//*[@id="menuE01"]/li[3]/a'  # 分省年度数据
        ActionChains(driver).click(driver.find_element_by_xpath(xPdata)).perform()
        time.sleep(4)  # 加载页面,停留时间长一些
        xTable = '//*[@class="table-container"]/div/div[3]/table/tbody'  # 数据表
        table = driver.find_element_by_xpath(xTable).get_attribute('innerHTML')
        soup = BeautifulSoup(table, 'html.parser')  # 解析表单
        tb = soup.find_all('tr')  # 查找表内tr标签
        tb_p = []  # 各省市名字
        tb_ = []
        tb_1 = [[], [], [], [], [], [], [], [], [], []]
        for row in tb:
            row_text = row.text
            # 查找第一个数字的索引
            ret1 = re.search('\d', row_text).start()
            # 将各个省份写入列表中
            tb_p.append(row_text[:ret1])
            # 截断至第一个数字
            row_text = row_text[ret1:]
            for i in range(1):
                try:
                    # 顺序查找点
                    ret = row_text.find('.')
                    # 将第一年年数据保存到列表中
                    tb_.append(row_text[:ret + 3])
                    # 删去第一年的数据
                    row_text = row_text[ret + 3:]
                except:
                    break
        for i in range(1):
            for j in range(i, len(tb_), 1):
                try:
                    tb_1[i].append(tb_[j])
                except:
                    break
        data = {'Province': tb_p,
                'GDP': tb_1[0],
                }
        dataframe = pd.DataFrame(data)
        dataframe.to_csv('2019_Province_GDP.csv', index=False, sep=',', encoding='utf-8-sig')
        driver.close()
    '''爬取豆瓣电影Top250'''
    wb = openpyxl.Workbook()    # 创建工作簿对象
    sheet = wb.active           # 获取工作簿的活动表
    sheet.title = "movie"       # 工作簿重命名
    sheet.append(["排名", "电影名", "导演和主演", "上映时间", "上映地区", "电影类型", "评分", "评价人数", "引言"])
    def get_movie(urls):
        rank = 1
        for url in urls:
            res = requests.get(url, headers=headers).text
            html = lxml.etree.HTML(res)
            # 先xpath定位提取到每个页面的所有li标签
            lis = html.xpath('//*[@id="content"]/div/div[1]/ol/li')
            # 每个li标签里有每部电影的基本信息
            for li in lis:
                name = li.xpath('.//div[@class="hd"]/a/span[1]/text()')[0]
                director_actor = li.xpath('.//div[@class="bd"]/p/text()')[0].strip()
                info = li.xpath('.//div[@class="bd"]/p/text()')[1].strip()
                # 按"/"切割成列表
                _info = info.split("/")
                # 得到 上映时间  上映地区  电影类型信息   去除两端多余空格
                time, area, genres = _info[0].strip(), _info[1].strip(), _info[2].strip()
                # print(time, area, genres)
                rating_score = li.xpath('.//div[@class="star"]/span[2]/text()')[0]
                rating_num = li.xpath('.//div[@class="star"]/span[4]/text()')[0]
                quote = li.xpath('.//p[@class="quote"]/span/text()')
                # 最后一页有部电影  九品芝麻官  没有一句话引言  加条件判断  防止报错
                if len(quote) == 0:
                    quote = None
                else:
                    quote = quote[0]
                sheet.append([rank, name, director_actor, time, area, genres, rating_score, rating_num, quote])
                rank += 1
        # 保存到文件
        wb.save("movie.xlsx")
    '''豆瓣电影Top250'''
    index_url = 'https://movie.douban.com/top250'
    def get_html(url):
        html = requests.get(url, headers=headers).text
        return html
    def create_list(html):
        soup = BeautifulSoup(html, 'lxml')
        movie_names = []
        movie_info = []
        for t in soup.find_all('div', 'hd'):
            name = t.find('span', 'title').get_text()
            movie_names.append(name)
        for t in soup.find_all('div', 'info'):
            info = t.find('p').get_text().replace(' ','')
            movie_info.append(info)
            next_page = soup.find('span', 'next').find('a')
        if next_page:
             return movie_names, movie_info, index_url + next_page['href']
        else:
             return movie_names, movie_info, None
    def main():
        order = 1
        url = index_url
        with codecs.open('top250.txt', 'wb', encoding='utf-8') as f:
            while url:
                html = get_html(url)
                names, info, url = create_list(html)
                for n in range(25):
                    f.write('Top ' + str(order) + ' ' + names[n] + '\r\n')
                    f.write(info[n] + '\r\n')
                    order = order+1
    if __name__ == "__main__":
        # 列表推导式得到url列表  10页的电影信息  Top250
        url_list = ["https://movie.douban.com/top250?start={}&filter=".format(i * 25) for i in range(10)]
        driver1(url1)
        driver2(url2)
        get_movie(url_list)
        main()
    

    4.2 数据可视化代码

    import pandas as pd
    import re
    import matplotlib.pyplot as plt
    import collections
    import seaborn as sns
    from stylecloud import gen_stylecloud
    import jieba
    import squarify
    from pyecharts import Pie
    sns.set() #恢复seaborn的默认主题
    # 中文乱码和坐标轴负号的处理
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    plt.rcParams['axes.unicode_minus'] = False
    '''条形图'''
    GDP = pd.read_csv('2019_Province_GDP.csv')
    # 设置绘图风格
    plt.style.use('ggplot')
    # 绘制条形图
    plt.bar(x= range(GDP.shape[0]), # 指定条形图x轴的刻度值
            height = GDP.GDP, # 指定条形图y轴的数值
            tick_label = GDP.Province, # 指定条形图x轴的刻度标签
            color = 'steelblue', # 指定条形图的填充色
           )
    # 添加y轴的标签
    plt.ylabel('GDP(万亿)')
    # 添加条形图的标题
    plt.title('2019年各省份GDP分布')
    # 为每个条形图添加数值标签
    for x,y in enumerate(GDP.GDP):
        plt.text(x,y+0.1,'%s' %round(y,1),ha='center')
    # 显示图形
    plt.savefig('test1.png')
    plt.show()
    '''饼图'''
    # 构造数据
    edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
    labels = ['中专','大专','本科','硕士','其他']
    explode = [0,0.1,0,0,0]  # 生成数据,用于突出显示大专学历人群
    colors=['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555']  # 自定义颜色
    # 将横、纵坐标轴标准化处理,确保饼图是一个正圆,否则为椭圆
    plt.axes(aspect='equal')
    # 绘制饼图
    plt.pie(x = edu, # 绘图数据
            explode=explode, # 突出显示大专人群
            labels=labels, # 添加教育水平标签
            colors=colors, # 设置饼图的自定义填充色
            autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
            pctdistance=0.8,  # 设置百分比标签与圆心的距离
            labeldistance = 1.1, # 设置教育水平标签与圆心的距离
            startangle = 180, # 设置饼图的初始角度
            radius = 1.2, # 设置饼图的半径
            counterclock = False, # 是否逆时针,这里设置为顺时针方向
            wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'},# 设置饼图内外边界的属性值
            textprops = {'fontsize':10, 'color':'black'}, # 设置文本标签的属性值
            )
    # 添加图标题
    plt.title('失信用户的受教育水平分布')
    # 显示图形
    plt.savefig('test2.png')
    plt.show()
    '''箱线图'''
    data=pd.read_csv('City_data.csv')
    #箱线图
    data.boxplot()
    plt.savefig('test3.png')
    plt.show()
    '''树地图'''
    # 创建数据
    name = ['国内增值税', '国内消费税', '企业所得税', '个人所得税',
            '进口增值税、消费税', '出口退税', '城市维护建设税',
            '车辆购置税', '印花税', '资源税', '土地和房税', '车船税烟叶税等']
    income = [3908, 856, 801, 868, 1361, 1042, 320, 291, 175, 111, 414, 63]
    # 绘图
    colors = ['steelblue', '#9999ff', 'red', 'indianred',
              'green', 'yellow', 'orange']
    plot = squarify.plot(sizes=income,  # 指定绘图数据
                         label=name,  # 指定标签
                         color=colors,  # 指定自定义颜色
                         alpha=0.6,  # 指定透明度
                         value=income,  # 添加数值标签
                         edgecolor='white',  # 设置边界框为白色
                         linewidth=3  # 设置边框宽度为3
                         )
    # 设置标签大小
    plt.rc('font', size=8)
    # 设置标题大小
    plot.set_title('2020年12月中央财政收支情况', fontdict={'fontsize': 15})
    # 去除坐标轴
    plt.axis('off')
    # 去除上边框和右边框刻度
    plt.tick_params(top='off', right='off')
    # 显示图形
    plt.savefig('test4.png')
    plt.show()
    '''玫瑰图'''
    attr =["碳酸饮料", "其他", "绿茶", "矿泉水", "果汁"]
    v1 =[6, 2, 7, 6,1]
    v2 =[9, 6, 4, 4,5]
    pie =Pie("玫瑰图", title_pos='center', width=800)
    pie.add("男", attr, v1, center=[25, 50], is_random=True, radius=[20, 50], rosetype='radius')
    pie.add("女", attr, v2, center=[75, 50], is_random=True, radius=[20, 50], rosetype='area',
            is_legend_show=False, is_label_show=True)
    pie.show_config()
    pie.render('玫瑰图.html')
    # 读取数据
    df = pd.read_excel("movie.xlsx",engine='openpyxl')
    # print(type(df))    # <class 'pandas.core.frame.DataFrame'>
    '''上映高分电影数量最多的年份Top10'''
    show_time = list(df["上映时间"])
    # 有上映时间数据是1961(中国大陆)这样的  处理一下  字符串切片
    show_time = [s[:4] for s in show_time]
    show_time_count = collections.Counter(show_time)
    # 取数量最多的前10  得到一个列表  里面每个元素是元组
    # (年份, 数量)
    show_time_count = show_time_count.most_common(10)
    # 字典推导式
    show_time_dic = {k: v for k, v in show_time_count}
    # 按年份排序
    show_time = sorted(show_time_dic)
    # 年份对应高分电影数量
    counts = [show_time_dic[k] for k in show_time]
    plt.figure(figsize=(9, 6), dpi=100)
    # 绘制条形图
    plt.bar(show_time, counts, width=0.5, color="cyan")
    # y轴刻度重新设置一下
    plt.yticks(range(0, 16, 2))
    # 添加描述信息
    plt.xlabel("年份")
    plt.ylabel("高分电影数量")
    plt.title("上映高分电影数量最多的年份Top10", fontsize=15)
    # 添加网格  网格的透明度  线条样式
    plt.grid(alpha=0.2, linestyle=":")
    plt.savefig('test5.png')
    plt.show()
    '''国家或地区上榜电影数量最多的Top10'''
    area = list(df['上映地区'])
    sum_area = []
    for x in area:
        x = x.split(" ")
        for i in x:
            sum_area.append(i)
    area_count = collections.Counter(sum_area)
    area_dic = dict(area_count)
    area_count = [(k, v) for k, v in list(area_dic.items())]
    # 按国家或地区上榜电影数量排序
    area_count.sort(key=lambda k: k[1])
    # 取国家或地区上榜电影数量最多的前十
    area = [m[0] for m in area_count[-10:]]
    nums = [m[1] for m in area_count[-10:]]
    plt.figure(figsize=(9, 6), dpi=100)
    # 绘制横着的条形图
    plt.barh(area, nums, color='red')
    # 添加描述信息
    plt.xlabel('电影数量')
    plt.title('国家或地区上榜电影数量最多的Top10')
    plt.savefig('test6.png')
    plt.show()
    '''豆瓣电影Top250-评价人数Top10'''
    name = list(df['电影名'])
    ranting_num = list(df['评价人数'])
    # (电影名, 评价人数)
    info = [(m, int(n.split('人')[0])) for m, n in list(zip(name, ranting_num))]
    # 按评价人数排序
    info.sort(key=lambda x: x[1])
    # print(info)
    name = [x[0] for x in info[-10:]]
    ranting_num = [x[1] for x in info[-10:]]
    plt.figure(figsize=(12, 6), dpi=100)
    # 绘制横着的条形图
    plt.barh(name, ranting_num, color='cyan', height=0.4)
    # 添加描述信息
    plt.xlabel('评价人数')
    plt.title('豆瓣电影Top250-评价人数Top10')
    plt.savefig('test7.png')
    plt.show()
    '''豆瓣电影Top250评分-排名的散点分布'''
    # 豆瓣电影Top250  排名  评分  散点图   描述关系
    rating = list(df["排名"])
    rating_score = list(df["评分"])
    plt.figure(figsize=(9, 6), dpi=100)
    # 绘制散点图  设置点的颜色
    plt.scatter(rating_score, rating, c='r')
    # 添加描述信息  设置字体大小
    plt.xlabel("评分", fontsize=12)
    plt.ylabel("排名", fontsize=12)
    plt.title("豆瓣电影Top250评分-排名的散点分布", fontsize=15)
    # 添加网格  网格的透明度  线条样式
    plt.grid(alpha=0.5, linestyle=":")
    plt.savefig('test8.png')
    plt.show()
    '''豆瓣电影Top250词云'''
    # 读取数据
    with open('top250.txt', encoding='utf-8') as f:
        data = f.read()
    # 文本预处理  去除一些无用的字符   只提取出中文出来
    new_data = re.findall('[\u4e00-\u9fa5]+', data, re.S)
    new_data = " ".join(new_data)
    # 文本分词
    seg_list_exact = jieba.cut(new_data, cut_all=False)
    result_list = []
    with open('top250.txt', encoding='utf-8') as f:
        con = f.readlines()
        stop_words = set()
        for i in con:
            i = i.replace("\n", "")   # 去掉读取每一行数据的\n
            stop_words.add(i)
    for word in seg_list_exact:
        # 设置停用词并去除单个词
        if word not in stop_words and len(word) > 1:
            result_list.append(word)
    print(result_list)
    gen_stylecloud(
        text=' '.join(result_list),
        size=500,
        collocations=False,
        font_path=r'C:\Windows\Fonts\msyh.ttc',
        output_name='test9.png',
        icon_name='fas fa-video',
        palette='colorbrewer.qualitative.Dark2_7'
    )
    

    5 效果展示

    5.1 网络爬虫

    5.1.1 爬取近五年主要城市数据

    表 3 City_data.csv部分数据

    5.1.2 爬取2019年各省GDP

    Province GDP
    北京市 35371.28
    天津市 14104.28
    河北省 35104.52
    山西省 17026.68
    内蒙古自治区 17212.53
    辽宁省 24909.45
    吉林省 11726.82
    黑龙江省 13612.68
    上海市 38155.32
    表 4 2019_Province_GDP.csv部分数据

    5.1.3 爬取豆瓣电影Top250

    在这里插入图片描述

    图5

    5.2 数据可视化

    5.2.1条形图

    2019年各省GDP,这个条形图效果不是很好,可以对数据处理一下,可以一个图里面少点省份。
    图 6 test1.png
    通过减少图中数据,下面这几个条形图效果较好。
    图 7 test5.png
    图 8 test6.png
    图 9 test7.png

    5.2.2 散点图

    豆瓣电影Top250散点分别,可以更直观的看到不同评分所处的排名。
    图 10 test8.png

    5.2.3 饼图

    图 11 test2.png

    5.2.4 箱线图

    图 12 test3.png

    5.2.5 树地图

    图 13 test4.png

    5.2.6 玫瑰图

    图 14 玫瑰图.html

    5.2.7 词云

    图 15 test9.png

    6 总结

    通过对Python爬虫以及数据可视化的学习,在这过程中查阅了许多的资料。主要实现了爬取2019年各省数据和主要城市近五年,还有豆瓣电影top250,用图表等可视化方式更直观的看数据。对Python常用模块和函数的使用方法有了进一步的了解。
    由于时间有限,项目还有许多不足,对于爬取的同一个网站不同页面。爬取的代码部分有重复,代码就有点长。代码质量不高。有的对数据没有处理,直接拿过来用。第一个条形图看起来效果很差,不能很好的展现数据信息。仍需继续改进。

    7参考文献

    [1]杨露,葛文谦. 基于Python的制造业数据分析可视化平台设计[J]. 《信息化研究》,2018年10月第44卷第5期.
    [2]左薇,张熹,董红娟. 主题网络爬虫研究综述[J]. 《软件导刊》,2020年2月第19卷第2期.
    [3]孙远波,闻芷艺,徐瑞格. 新型冠状病毒肺炎疫情数据可视化设计综述 [J]. 《包装工程》,2020年4月第41卷第8期.
    [4]董付国,Python程序设计基础(第2版).清华大学出版社,2018.

    展开全文
  • 包含了所有的源代码,本项目是一个练手的爬虫小案例。
  • python 爬虫数据可视化展示

    千次阅读 2022-02-11 10:17:54
    学了有关python爬虫数据可视化的知识,想着做一些总结,加强自己的学习成果,也能给各位小伙伴一些小小的启发。 1、做任何事情都要明确自己的目的,想要做什么,打算怎么做,做到什么样的程度,自己有一个清晰的...
  • Python爬虫、Flask框架ECharts实现数据可视化,源码无错误!希望大家可以好好学习,用好资源,原创,搬运请表明来源,谢谢!又不足请大佬们指正!
  • 又是新的一年,让我们一起来看一下刚刚过去的2018留下了哪些经典影片吧!...这样我们就得到了第一个爬虫链接:https://maoyan.com/films?showType=3&amp;amp;amp;sortId=3&amp;amp;amp;yearId=13 这样的一...
  • python爬虫数据可视化分析

    万次阅读 多人点赞 2021-01-07 09:46:58
    对于刚开始学习编程的小伙伴来说,肯定都对爬虫有一定的兴趣,对于新手来说,从Python爬虫如入门应该是简单易懂的。Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向...
  • Python爬虫数据可视化

    千次阅读 2022-05-15 10:58:23
    Python爬虫——matplotlib和pandas库数据可视化 导入需要的第三方库 import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import requests import urllib3 import matplotlib as mpl ...
  • 基于Python爬虫的电影数据可视化分析.pdf
  • Python爬虫实战数据可视化分析

    千次阅读 2021-03-06 16:44:42
     int(total_page[0])+1): data = { "pn":i, "kd":"python" } print(i) page_url = "https://www.lagou.com/jobs/positionAjax.json?px=default&city=%s&needAddtionalResult=false"%city referer_url = ...
  • 基于Python定向爬虫技术对微博数据可视化设计实现.pdf
  • Python爬虫数据可视化网页实现

    千次阅读 2021-10-29 15:57:31
    目录 前言 一、爬虫部分 (1)基本思路 (2)库的使用 二、数据库部分 三、Flask框架部分 ...四、数据可视化部分 ...[Python爬虫编程基础5天速成(2021全新合集)Python入门+数据分析] 学前基础: ...
  • 基于python的网络爬虫爬取天气数据可视化分析 python程序设计报告 源代码+csv文件+设计报告 python期末简单大作业(自己写的,重复率低) 利用python爬取了网站上的城市天气,并用利用可视化展示,有参考文献有...
  • 基于Python爬虫打造数据可视化模型[视频课程].txt打包整理.zip
  • 实战性非常强的一套Python爬虫数据分析+数据可视化教程。课程以多个实例项目为例,将Python爬虫数据可视化技术一一罗列,让同学们快速掌握实战技术,让技术和数据的应用再次得到升华。 视频大小4.7G
  • 配套博文https://blog.csdn.net/szm1234/article/details/112717515,Python疫情数据爬虫可视化显示,中国地图可视化显示

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,632
精华内容 13,052
热门标签
关键字:

python爬虫与数据可视化