《团队-爬取豆瓣电影TOP250-需求分析》

    针对如今高速发展的社会及市场分析,人们的需求更侧重于高端产品及生活体验。而能让人们直观的,快速的了解外面的世界,媒体是最好的选择。

一、爬取页面,获取需求内容

咱们今日要爬取的是豆瓣电影top250(https://movie.douban.com/top250)

页面如下所示:

爬取豆瓣电影 top250 提取电影分类进行数据分析(图一)

咱们需求的是里边的电影分类,经过检查源代码查询能够分分出咱们需求的东西。直接进入主题吧!

爬取豆瓣电影 top250 提取电影分类进行数据分析(图二)

知道咱们需求的内容在哪里了,接下来就运用咱们python强壮的request库先获取页面内容下来吧!获取内容后,再运用一个好用的lxml库来剖析页面内容,然后获取咱们的内容就能够做下一步操作了。

先贴出运用request库和lxml剖析的代码

    def get_page(i):

            url = 'https://movie.douban.com/top250?start={}&filter='.format(i)

                

            html = requests.get(url).content.decode('utf-8')    # 运用request库获取页面内容

        

            selector = etree.HTML(html)    # 运用lxml库获取内容

            '''

                经过查询页面就能发现内容在<div >下的一有些

            '''

            content = selector.xpath('//div[@]/div[@]/p/text()')

            print(content)

        

            for i in content[1::2]:

                print(str(i).strip().replace('\n\r', ''))

                # print(str(i).split('/'))

                i = str(i).split('/')  

                i = i[len(i) - 1]

                key = i.strip().replace('\n', '').split(' ') # 这儿的strip和replace的运用意图是去掉空格和空行之类

                print(key)

下的一有些 ”’ content = selector.xpath(‘//div[@class=”info”]/div[@class=”bd”]/p/text()’) print(content) for i in content[1::2]: print(str(i).strip().replace(‘nr’, ”)) # print(str(i).split(‘/’)) i = str(i).split(‘/’) i = i[len(i) – 1] key = i.strip().replace(‘n’, ”).split(‘ ‘) # 这儿的strip和replace的运用意图是去掉空格和空行之类 print(key)经过获取下来的内容咱们发现一部电影的各项内容都是用’/’分隔着,咱们只需求获取电影分类中的东西,所以咱们需求运用

i = str(i).split('/')

来把内容分隔成几项内容,由于电影分类排在终究,所以咱们经过

i = i[len(i) - 1]

来获取分隔后的终究一项也即是咱们需求的电影分类,还有终究一步咱们需求完结的,由于一部电影里边通常都有多个电影分类的标签,所以咱们还要持续分隔获取到的电影分类,而且查询能够知道电影分类之间仅仅用一个空格离隔,所以咱们运用下面一行代码就能够别离出各个分类:

key = i.strip().replace('\n', '').split(' ')

二、接下来即是保留到mysql数据库

把电影分类保留在mysql数据库以便下面进行数据剖析,这儿咱们运用到pymysql来联接mysql数据库,首要咱们需求在mysql数据库建好表:

爬取豆瓣电影 top250 提取电影分类进行数据分析(图三)

然后咱们经过pymysql把数据保留到数据库中,代码如下:

首要要联接数据库:

# 联接mysql数据库

conn = pymysql.connect(host = 'localhost', user = 'root', passwd = '2014081029', db = 'mysql', charset = 'utf8')  # user为数据库的姓名,passwd为数据库的暗码,通常把要把字符集界说为utf8,否则存入数据库简略遇到编码疑问

cur = conn.cursor()  # 获取操作游标

cur.execute('use douban')  # 运用douban这个数据库

在保留到数据库之前,咱们还有一个需求做得,那即是把250部电影的分类汇总数量,所以咱们界说了一个字典来核算电影分类的个数,这儿的代码是get_page函数的一有些,代码如下:

    for i in content[1::2]:

        print(str(i).strip().replace('\n\r', ''))

        # print(str(i).split('/'))

        i = str(i).split('/')

        i = i[len(i) - 1]

        key = i.strip().replace('\n', '').split(' ')

        print(key)

        for i in key:

            if i not in douban.keys():

                douban[i] = 1

            else:

                douban[i] += 1

然后界说一个保留函数,履行刺进操作,假定呈现刺进失利,就履行回滚操作,还有记住在操作完结往后,运用conn.close()和cur.close()来封闭数据库联接,代码如下:

    def save_mysql(douban):

        print(douban)  # douban在主函数中界说的字典

        for key in douban:

            print(key)

            print(douban[key])

            if key != '':

                try:

                    sql = 'insert douban(品种, 数量) value(' + "\'" + key + "\'," + "\'" + str(douban[key]) + "\'" + ');'

                    cur.execute(sql)

                    conn.commit()

                except:

                    print('刺进失利')

                    conn.rollback()

三、运用matplotlib进行数据可视化操作

首要,从数据库中把电影分类和每个分类的数量别离存入一个列表中,然后运用matplotlib进行可视化操作,详细如下:

    def pylot_show():

        sql = 'select * from douban;'  

        cur.execute(sql)

        rows = cur.fetchall()   # 把表中悉数字段读取出来

        count = []   # 每个分类的数量

        category = []  # 分类

    

        for row in rows:

            count.append(int(row[2]))  

            category.append(row[1])

    

        y_pos = np.arange(len(category))    # 界说y轴坐标数

        plt.barh(y_pos, count, align='center', alpha=0.4)  # alpha图表的填充不通明度(0~1)之间

        plt.yticks(y_pos, category)  # 在y轴上做分类名的符号

    

        for count, y_pos in zip(count, y_pos):

            # 分类个数在图中显现的方位,即是那些数字在柱状图尾部显现的数字

            plt.text(count, y_pos, count,  horizontalalignment='center', verticalalignment='center', weight='bold')  

        plt.ylim(+28.0, -1.0) # 可视化计划,恰当于规矩y轴计划

        plt.title(u'豆瓣电影250')   # 图表的标题

        plt.ylabel(u'电影分类')     # 图表y轴的符号

        plt.subplots_adjust(bottom = 0.15)

        plt.xlabel(u'分类呈现次数')  # 图表x轴的符号

        plt.savefig('douban.png')   # 保留图画

下面阐明一下matplotlib的一些简略运用,首要咱们要导入matplotlib和numpy的包

import numpy as np

import matplotlib.pyplot as plt

这次可视化是柱状图,这儿给出brah()函数的界说:

barh()

首要功用:做一个横向条形图,横向条的矩形巨细为: left, left + width, bottom, bottom + height

参数:barh ( bottom , width , height =0.8, left =0, **kwargs )

回来类型:一个 class 品种, matplotlib.patches.Rectangle**实例

参数阐明:

  • bottom: Bars 的笔直方位的底部边际

  • width: Bars 的长度

  • 可选参数:

  • height: bars 的高度

  • left: bars 左边际 x 轴坐标值

  • color: bars 色彩

  • edgecolor: bars 边际色彩

  • linewidth: bar 边际宽度;None 标明默许宽度;0 标明不 i 制作边际

  • xerr: 若不为 None,将在 bar 图上生成 errobars

  • yerr: 若不为 None,将在 bar 图上生成 errobars

  • ecolor: 指定 errorbar 色彩

  • capsize: 指定 errorbar 的顶部(cap)长度

  • align: ‘edge’ (默许) | ‘center’:‘edge’以底部为准对齐;‘center’以 y 轴作为基地

  • log: [False|True] False (默许),若为 True,运用 log 坐标

然后就能够显现出图画来了

爬取豆瓣电影 top250 提取电影分类进行数据分析(图四)