资讯专栏INFORMATION COLUMN

爬取豆瓣电影top250提取电影分类进行数据分析

Mertens / 729人阅读

摘要:标签空格分隔爬虫一爬取网页,获取需要内容我们今天要爬取的是豆瓣电影页面如下所示我们需要的是里面的电影分类,通过查看源代码观察可以分析出我们需要的东西。

标签(空格分隔):python爬虫

一、爬取网页,获取需要内容

我们今天要爬取的是豆瓣电影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库提取内容
            """
                通过观察页面就能发现内容在
下的一部分 """ content = selector.xpath("//div[@class="info"]/div[@class="bd"]/p/text()") print(content) for i in content[1::2]: print(str(i).strip().replace(" ", "")) # print(str(i).split("/")) i = str(i).split("/") i = i[len(i) - 1] key = i.strip().replace(" ", "").split(" ") # 这里的strip和replace的使用目的是去除空格和空行之类 print(key)

通过获取下来的内容我们发现一部电影的各项内容都是用"/"分隔着,我们只需要提取电影分类中的东西,所以我们需要使用

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

来把内容分隔成几项内容,因为电影分类排在最后,所以我们通过

i = i[len(i) - 1]

来获取分隔后的最后一项也就是我们需要的电影分类,还有最后一步我们需要完成的,因为一部电影里面一般都有多个电影分类的标签,所以我们还要继续分隔获取到的电影分类,并且观察可以知道电影分类之间只是用一个空格隔开,所以我们使用下面一行代码就可以分离出各个分类:

key = i.strip().replace("
", "").split(" ")
二、接下来就是保存到mysql数据库

把电影分类保存在mysql数据库以便下面进行数据分析,这里我们使用到pymysql来连接mysql数据库,首先我们需要在mysql数据库建好表:

然后我们通过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("

", ""))
        # print(str(i).split("/"))
        i = str(i).split("/")
        i = i[len(i) - 1]
        key = i.strip().replace("
", "").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 坐标

然后就可以显示出图片来了

源码在这里:
# -*- coding: utf-8 -*-
# !/usr/bin/env python

from lxml import etree
import requests
import pymysql
import matplotlib.pyplot as plt
from pylab import *
import numpy as np

# 连接mysql数据库
conn = pymysql.connect(host = "localhost", user = "root", passwd = "2014081029", db = "mysql", charset = "utf8")
cur = conn.cursor()
cur.execute("use douban")

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

    html = requests.get(url).content.decode("utf-8")

    selector = etree.HTML(html)

    content = selector.xpath("//div[@class="info"]/div[@class="bd"]/p/text()")
    print(content)

    for i in content[1::2]:
        print(str(i).strip().replace("

", ""))
        # print(str(i).split("/"))
        i = str(i).split("/")
        i = i[len(i) - 1]
        # print("zhe" +i)
        # print(i.strip())
        # print(i.strip().split(" "))
        key = i.strip().replace("
", "").split(" ")
        print(key)
        for i in key:
            if i not in douban.keys():
                douban[i] = 1
            else:
                douban[i] += 1

def save_mysql():
    print(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()


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])
    print(count)
    y_pos = np.arange(len(category))
    print(y_pos)
    print(category)
    colors = np.random.rand(len(count))
    # plt.barh()
    plt.barh(y_pos, count, align="center", alpha=0.4)
    plt.yticks(y_pos, category)
    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)
    plt.title(u"豆瓣电影250")
    plt.ylabel(u"电影分类")
    plt.subplots_adjust(bottom = 0.15)
    plt.xlabel(u"分类出现次数")
    plt.savefig("douban.png")


if __name__ == "__main__":
    douban = {}
    for i in range(0, 250, 25):
        get_page(i)
    # save_mysql()
    pylot_show()
    cur.close()
    conn.close()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38061.html

相关文章

  • (转)Python3爬取豆瓣电影保存到MySQL数据

    摘要:行代码实现爬取豆瓣电影排行榜代码基于,用到的类库有标题文字通过伪造请求头或设置代理等方式获取页面内容,参考文档对页面进行解析,提取数据,参考文档版本中用于操作数据库,中则使用,安装用到的几个类库分析豆瓣电影页面页面分析爬取数据之前,我们都需 48行代码实现Python3爬取豆瓣电影排行榜代码基于python3,用到的类库有: 标题文字 requests:通过伪造请求头或设置代理等方式获...

    nevermind 评论0 收藏0
  • scrapy爬取豆瓣Top250电影

    摘要:这次我们爬取的内容准备步骤找到格式网页中需要爬取的数据的例如我们需要爬取图片的这里用的是不会用的同学请百度然后我们开始建立工程打开然后在你想要建立工程的目录下面输入就会自动建立一个工程然后去根目录建立一个去这个目录里建立一个注意这里的主爬虫 这次我们爬取的内容 showImg(https://segmentfault.com/img/bVSirX?w=1021&h=521); 准备步骤...

    codergarden 评论0 收藏0
  • 80行代码爬取豆瓣Top250电影信息并导出到csv及数据

    摘要:查看源码下载页面并处理提取数据观察该网站结构可知该页面下所有电影包含在标签下。使用语句获取该标签在标签中遍历每个标签获取单个电影的信息。以电影名字为例清洗数据其余部分详见源码页面跳转检查后页标签。 查看源码 1 下载页面并处理 DOWNLOAD_URL = http://movie.douban.com/top250/ html = requests.get(url).text tr...

    galaxy_robot 评论0 收藏0
  • scrapy入门:豆瓣电影top250爬取

    摘要:本文内容爬取豆瓣电影页面内容,字段包含排名,片名,导演,一句话描述有的为空,评分,评价人数,上映时间,上映国家,类别抓取数据存储介绍爬虫框架教程一入门创建项目创建爬虫注意,爬虫名不能和项目名一样应对反爬策略的配置打开文件,将修改为。 本文内容 爬取豆瓣电影Top250页面内容,字段包含:排名,片名,导演,一句话描述 有的为空,评分,评价人数,上映时间,上映国家,类别 抓取数据存储 ...

    xialong 评论0 收藏0

发表评论

0条评论

Mertens

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<