Python爬取、存储、分析、可视化豆瓣电影Top250

2023-11-04

Python爬取、存储、分析、可视化豆瓣电影Top250

网站链接:
https://movie.douban.com/top250

@文章目录
前言
一、python爬取目标数据,并写入csv文件
二、pymysql数据存储
三、pandas数据清洗、处理
四、pandas、pyecharts、matplotlib数据可视化
五、自我陈述

前言

在Python的基础上爬取豆瓣电影Top250的数据信息(老师的案例作业)
主要知识点:Python、pymysql、pandas、pyecharts、matplotlib
主要运用工具:pycharm、navicate、jupyter


提示:以下是本篇文章正文内容,下面案例可供参考

一、Python爬取目标数据,并写入csv

运用了requests库获取页面、BeautifulSoup库解析页面(方法很多,可自行延伸)、

1、引入库

import requests
from bs4 import BeautifulSoup
import csv
import re

2、获取一级页面内容

用"get_one_page()"作为函数,别忘了添加"headers"做反爬
特别注意
“cookie"值要用自己注册的豆瓣账号登陆后的页面获取的"cookie”

def get_one_page(url):
    headDict = {
    加入自己的“user_agent:”、“accept“、”cookie“
    }

    r = requests.get(url,headers = headDict)
    r.encoding = r.apparent_encoding
    html = r.text
    return html

3、解析获取的页面

解析页面时,我爬取的是:
电影排名、片名、评分、评价人数、电影类型、制片国家、上映时间、电影时长

在一级页面爬取了制片国家(二级也可以爬取),其他指标都在二级爬取
运用了find、select,也可以用xpath、re

def parse_one_page(html):
    soup = BeautifulSoup(html,'lxml')
    movie = soup.find("ol",class_='grid_view')
    erjilianjie = movie.find_all('li')

	 for lianjie in erjilianjie:
        #一级页面制片国家
        others = lianjie.find('div', class_='bd').find('p').text.strip('').split('\n')
        year_country = others[2].strip('').split('\xa0/\xa0')
        pro_country = year_country[1].replace(' ',',')

        #链接
        a = lianjie.find('a')
        erji = a['href']
        html = get_one_page(erji)

        soup = BeautifulSoup(html,'lxml')
        #排名
        ranks = soup.select('#content > div.top250 > span.top250-no')[0].getText().strip()
        #片名
        spans = soup.select('h1 span')
        movie_name1 = spans[0].get_text()
        movie_name  = movie_name1.split(' ')[0]
        # print(movie_name)
        #评分
        score = soup.select('#interest_sectl > div.rating_wrap.clearbox > div.rating_self.clearfix > strong')[0].getText().strip()
        #评价人数
        sorce_people = soup.select('#interest_sectl > div.rating_wrap.clearbox > div.rating_self.clearfix > div > div.rating_sum > a > span')[0].getText().strip()
        #info板块
        info = soup.find('div',id='info')
        #电影类型
        movie_type = ''
        movie_types = info.find_all('span',property='v:genre')
        for i in movie_types:
            movie_type = movie_type + ',' + i.string
            movie_type = movie_type.lstrip(',')
        #二级页面制片国家
        # pro_country = re.findall("<span class=\"pl\">制片国家/地区:</span>(.*)<br/>",str(info))
        # pro_country = ','.join(pro_country)
        # print(pro_country)
        #上映日期
        up_time = ''
        up_times = info.find_all('span',property='v:initialReleaseDate')
        for i in up_times:
            up_time = up_time + "," + i.string
            up_time = up_time.lstrip(',')
        #电影时长
        movie_time = ''
        movie_times = info.find_all('span',property='v:runtime')
        for i in movie_times:
            movie_time = movie_time + i.string

#将数据写入data,做迭代器储存数据
        data = {
            'id':ranks,
            'name':movie_name,
            'score':score,
            'votes':sorce_people,
            'country':pro_country,
            'type':movie_type,
            'date':up_time,
            'runtime':movie_time,
            'link':erji
        }
        yield data

4、写入csv文件

def write_to_file(content):
    file_name = 'movie.csv'
    with open(file_name,'a',newline='',encoding='utf-8') as f:
        writer = csv.writer(f)
        for i in content:
            writer.writerow(i.values())

5、调用主函数

特别注意:
一定要调用函数,调试时,只用一页来调试,多页会反爬

if __name__ == "__main__":
    for i in range(10):
        urls = 'https://movie.douban.com/top250?start='+str(i*25)+'&filter='
        html = get_one_page(urls)
        parse_one_page(html)
        content = parse_one_page(html)
        write_to_file(content)
        print("写入第"+str(i)+"页数据成功")


    # # 调试函数
    # url = 'https://movie.douban.com/top250'
    # html = get_one_page(url)
    # parse_one_page(html)
    # content = parse_one_page(html)

二、pymysql数据存储

1.在navicate中创建movie表

特别注意:
创建正确的数据类型在这里插入图片描述

2、将movie.csv里的数据传入movie表

特别注意:
"db"是数据库名称,用自己navicate里的host、user、password

import pymysql
import csv


def write_to_table():
    #连接MYSQL数据库(注意:charset参数是utf8m64而不是utf-8)
    db = pymysql.connect(host = "localhost",
                         user = 'root',
                         password = 'root',
                         db = "movie",
                         charset = "utf8m64",)
    #创建对象
    cursor = db.cursor()

    #读取csv文件
    with open('movie.csv','r',encoding='utf-8') as f:
        read = csv.reader(f)
        for each in list(read):
            i = tuple(each)
            # print(i)
            #SQL语句添加数据
            sql = "INSERT INTO movie VALUES" + str(i)
            #执行SQL语句
            cursor.execute(sql)
        # 提交数据
        db.commit()
        # #关闭游标
        cursor.close()
        # #关闭数据库
        db.close()

if __name__ == '__main__':
    write_to_table()

三、pandas数据清洗、处理

1、jupyter读取movie.csv中数据并处理

import numpy as np
import pandas as pd

#如果没有header = None,会自动将第一行设置为表头哦
data=pd.read_table('movie.csv',sep=',',header = None)
data

如图:
在这里插入图片描述

2、查看是否有缺失值数据

data.isnull().any()#查看是否有缺失值数据

如图:
在这里插入图片描述

3、查看是否有重复值

data.duplicated().sum()#查看是否有重复值数据

如图:

在这里插入图片描述

4、添加表头

data.columns = ['排名','片名','评分','评价人数','制片国家',
                  '类型','上映日期','时长','影片链接']
data

如图:在这里插入图片描述

5、保存处理好的数据到movie1.csv

data.to_csv('movie1.csv')

四、pandas、pyecharts、matplotlib数据可视化

1、读取movie1.csv文件数据

import pandas as pd
data = pd.read_csv('movie1.csv')
data

2、绘制电影评价人数前十名(柱状图)

from pyecharts import options as opts
from pyecharts.charts import Bar


df = data.sort_values(by='评价人数', ascending=True)
bar = (
        Bar()
        .add_xaxis(df['片名'].values.tolist()[-10:])
        .add_yaxis('评价人数', df['评价人数'].values.tolist()[-10:])
        .set_global_opts(
            title_opts=opts.TitleOpts(title='电影评价人数'),
            yaxis_opts=opts.AxisOpts(name='人数'),
            xaxis_opts=opts.AxisOpts(name='片名'),
            datazoom_opts=opts.DataZoomOpts(type_='inside'),
            )
        .set_series_opts(label_opts=opts.LabelOpts(position="top"))
        .render('电影评价人数前十名.html')
        )
bar

如图:
在这里插入图片描述

3、绘制各地区电影上映数量Top10(柱状图-横向)

特别注意:
制片国家里有几个国家一起的情况,要先用" “代替”,“,用” "分割,再用count计算每个国家的数量

country_all = data['制片国家'].str.replace(","," ").str.split(" ",expand=True)
country_all = country_all.apply(pd.value_counts).fillna(0).astype("int")
country_all['count']= country_all.apply(lambda x:x.sum(),axis=1)
country_all.sort_values('count',ascending=False)
data1=country_all['count'].sort_values(ascending=False).head(10)
country_counts = data1
country_counts.columns = ['制片国家', '数量']
country_counts = country_counts.sort_values(ascending=True)
from pyecharts.charts import Bar
bar = (
        Bar()
        .add_xaxis(list(country_counts.index)[-10:])
        .add_yaxis('地区上映数量', country_counts.values.tolist()[-10:])
        .reversal_axis()
        .set_global_opts(
        title_opts=opts.TitleOpts(title='地区上映电影数量'),
        yaxis_opts=opts.AxisOpts(name='国家'),
        xaxis_opts=opts.AxisOpts(name='上映数量'),
        )
        .set_series_opts(label_opts=opts.LabelOpts(position="right"))
        .render('各地区上映电影数量前十.html')
        )
bar

如图:
在这里插入图片描述

4、绘制电影时长分布直方图

特别注意:
爬取的数据中,时长列并非纯数字,需要将多余的字符删除后,只保留第一个电影时长数据,再做计算

movie_duration_split = data['时长'].str.replace("\', \'","~").str.split("~",expand=True).fillna(0)
movie_duration_split =movie_duration_split.replace(regex={'分钟.*': ''})
data['时长']=movie_duration_split[0].astype("int")
#data['时长'].head()
#查看最大时长
#data.时长.max()

import matplotlib.pyplot as plt
bins=[0,80,100,120,140,160,180,240]
pd.cut(data.时长,bins)
pd.cut(data.时长,bins).value_counts()
pd.cut(data.时长,bins).value_counts().plot.bar(rot=20)

如图:
在这里插入图片描述


五、自我陈述

代码的逻辑很多,本人初学者,还需多学习,不喜勿喷
如有需要,自取代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬取、存储、分析、可视化豆瓣电影Top250 的相关文章

  • 使用 InlineKeyboardButton python telegram bot 发送命令

    在Python电报机器人中 是否有可能InlineKeyboardButton发送类似命令 cancel当它被按下时 例如 当用户按下取消按钮时 他们将自动发送 cancel 命令 然后由机器人处理 从这里的例子来看 https githu
  • AttributeError:'function'对象在pandas中没有属性'bar'

    我有一个 pandas 数据框 它是 pandas 数据框类型 如下所示 type df Out 176 pandas core frame DataFrame 但是 当我尝试在此数据框上使用任何绘图函数 如条形图 时 会出现如下错误 df
  • 使用单个文件的 Python 日志记录(函数名、文件名、行号)

    我正在尝试了解应用程序的工作原理 为此 我将调试命令插入作为每个函数主体的第一行 目的是记录函数的名称以及向日志输出发送消息的行号 代码内 最后 由于这个应用程序由许多文件组成 我想创建一个日志文件 以便我可以更好地理解应用程序的控制流 这
  • 为神经网络打乱两个 numpy 数组

    我有两个 numpy 数组用于输入数据 X 和输出数据 y X np array 2 3 sample 1 x 16 4 dtype float sample 2 x y np array 1 0 sample 1 y 0 1 dtype
  • 如何更改默认的Python版本?

    我已经在我的 Mac 上安装了 Python 3 2 我跑完之后 Applications Python 3 2 Update Shell Profile command 当我输入时 这很令人困惑Python V在终端它说Python 2
  • 如何使用我自己的自定义表单覆盖 django-rest-auth 中的表单?

    我正在使用 django rest auth 并尝试通过覆盖表单的方法之一来修复密码重置视图中的错误 尽管我已经使用不同的 django rest auth 表单成功完成了类似的操作 但我无法让它在这个表单上工作 无论我做什么 都会使用旧的
  • 在 Jupyter Notebook 中设置环境变量的不同方法

    在某些情况下 我在 Windows 10 计算机上使用 Jupyter 笔记本 我想通过设置环境变量 GOOGLE APPLICATION CREDENTIALS 来向 GCP 进行身份验证 我想知道 这两种设置环境变量的方式有什么区别 当
  • sy.sympify(str(表达式)) 不等于表达式

    据我了解 str将 SymPy 表达式转换为字符串并sympify将字符串转换为 SymPy 表达式 因此 我希望以下内容成立 对于合理的表达 gt gt gt sy sympify str expr expr True 我尝试过这个 确实
  • Python 中 time.sleep 和多线程的问题

    我对 python 中的 time sleep 函数有疑问 我正在运行一个脚本 需要等待另一个程序生成 txt 文件 虽然 这是一台非常旧的机器 所以当我休眠 python 脚本时 我遇到了其他程序不生成文件的问题 除了使用 time sl
  • 样本()和r样本()有什么区别?

    当我从 PyTorch 中的发行版中采样时 两者sample and rsample似乎给出了类似的结果 import torch seaborn as sns x torch distributions Normal torch tens
  • 从字典中绘制直方图

    我创建了一个dictionary计算 a 中出现的次数list每个键的内容 我现在想绘制其内容的直方图 这是我想要绘制的字典的内容 1 27 34 1 3 72 4 62 5 33 6 36 7 20 8 12 9 9 10 6 11 5
  • Bokeh 中单独的节点和边缘悬停工具?

    我正在尝试为 Bokeh 中的节点和边缘获取单独的悬停工具提示 但未能使其正常工作 有人可以指出我做错了什么吗 我相信代码应该如下所示 from bokeh io import show output notebook from bokeh
  • 如何让 Streamlit 每 5 秒重新加载一次?

    我必须每 5 秒重新加载 Streamlit 图表 以便在 XLSX 报告中可视化新数据 如何实现这一目标 import streamlit as st import pandas as pd import os mainDir os pa
  • 如何处理 Tkinter 中的窗口关闭事件?

    如何在 Python Tkinter 程序中处理窗口关闭事件 用户单击 X 按钮 Tkinter 支持一种称为协议处理程序 http web archive org web 20201111215134 http effbot org tk
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 有没有办法拉伸整个显示图像以适应给定的分辨率?

    我最近一直在使用pygame制作游戏 遇到了一个小问题 基本上 我希望能够将屏幕上的整个图像 我已经传输到它的所有内容 拉伸到用户将窗口大小调整到的分辨率 我在 pygame 和堆栈溢出的文档中搜索了很多 但我似乎找不到答案 这可能吗 我的
  • 在 anaconda 环境下运行 qsub

    我有一个程序 通常在 Linux 的 conda 环境中运行 因为我用它来管理我的库 指令如下 source activate my environment python hello world py 我怎样才能跑你好世界 py在与 PBS
  • 在不同的 GPU 上同时训练多个 keras/tensorflow 模型

    我想在 Jupyter Notebook 中同时在多个 GPU 上训练多个模型 我正在使用 4GPU 的节点上工作 我想将一个 GPU 分配给一个模型并同时训练 4 个不同的模型 现在 我通过 例如 为一台笔记本选择 GPU import
  • 使用 Numpy 进行多维批量图像卷积

    在图像处理和分类网络中 一个常见的任务是输入图像与一些固定滤波器的卷积或互相关 例如 在卷积神经网络 CNN 中 这是一种极其常见的操作 我已将通用版本任务减少为 Given 一批 N 个图像 N H W D 和一组 K 个滤镜 K H W
  • 用 Beautiful Soup 进行抓取:为什么 get_text 方法不返回该元素的文本?

    最近我一直在用 python 开发一个项目 其中涉及抓取一些网站的一些代理 我遇到的问题是 当我尝试抓取某个知名代理站点时 当我要求 Beautiful Soup 查找 IP 在代理表中的位置时 它并没有按照我的预期执行操作 我将尝试查找每

随机推荐

  • 关于CADC数据集的处理笔记

    简要介绍 数据集 Canadian Adverse Driving Conditions Dataset CADC 是全球首个针对寒冷环境的自动驾驶数据集 其内包含 56 000 张相机图像 7 000 次 LiDAR 扫描 75 个场景
  • shell常用命令

    目录 常用命令 目录信息查看命令 ls 目录切换命令 cd 当前路径显示命令 pwd 系统信息查看命令 uname 清屏命令 clear 系统帮助命令 man 系统重启命令 reboot 系统关闭命令 poweroff 查看和修改系统时间命
  • 如何提供一个可信的AB测试解决方案

    本文以履约场景下的具体实践为背景 介绍如何提供一个可信赖的AB测试解决方案 一方面从实验方法的角度论述实验过程中容易被忽视的统计陷阱 给出具体的解决方案 一方面从平台建设角度论述针对业务场景和对应约束制定实验方案提供给用户 而不只是功能和方
  • 运营商大数据实时获取精准数据

    随着大数据技术的快速发展和完善 出现了一种新的扩张方式 互联网大数据的精准扩张 如果没有一个好的渠道来获得顾客 这就像准备热情地做饭 但当饭吃完后 人们只能饿了 今天的消费者已经从最早的线下消费逐渐过渡到互联网消费 再到现在的移动互联网消费
  • openGL之API学习(一八零)POINTS LINES TRIANGLES QUADS 绘图顺序规则

    默认每一个图形的绘图方向是相同的 要么逆时针 默认方向 要么顺时针 1 GL TRIANGLES 是以每三个顶点绘制一个三角形 第一个三角形使用顶点v0 v1 v2 第二个使用v3 v4 v5 以此类推 如果顶点的个数n不是3的倍数 那么最
  • 2. 特征缩放(归一化)

    特征缩放 为了消除数据特征之间的量纲影响 我们需要对特征进行归一化处理 使得不同指标之间具有可比性 例如 分析一个人的身高和体重对健康的影响 如果使用 米 m 和 千克 kg 作为单位 那么分析出来的结果显然会倾向于数值差别比较大的体重特征
  • python进行回归分析(1)

    数据来源 R软件自带的包alr4中的数据集 library alr4 data lt UN11 write table data C Users admin Desktop 数据分析 a csv row names FALSE col na
  • Spring系列之aop概念详解

    本文主要内容 什么是Aop Spring AOP中重要的一些概念详解 Spring AOP 硬编码实现 什么是AOP 先看一下传统程序的流程 比如银行系统会有一个取款流程 我们可以把方框里的流程合为一个 另外系统还会有一个查询余额流程 我们
  • java异常和日志处理规范

    转载自 V型知识库 一 java异常处理规范 转自 http www vxzsk com 521 html 1 强制 不要捕获 Java 类库中定义的继承自 RuntimeException 的运行时异常类 如 IndexOutOfBoun
  • Pikachu靶场-xss详解

    Picachu靶场 xss 跨站脚本漏洞概述 跨站脚本漏洞类型及测试流程 反射型XSS post get 存储型XSS Dom型XSS xss 获取cookie xss 进行钓鱼 xss盲打 xss的过滤和绕过 xss htmlspecia
  • html5 新增input类型,html5新增的input类型

    html5新增的input类型 你可能已经听说过现在HTML5里引入了几种新的input类型 在HTML5之前 大家熟知的input类型包括 text 文本输入框 hidden 隐藏域 submit 提交按钮 等 而HTML5到来之后 新增
  • 微信支付实名信息小程序授权接口能力

    官方文档地址 https developers weixin qq com community business doc 000804439ac77080c8672c77451c0d client tim ADUIN 1533578847
  • VS Qt 使用linguits(Qt语言家)生成.ts的翻译文件并翻译使用的详细过程

    VS 生成ts文件 vs中 Qt VS Tools Create new translation File选择需要的语言 生成对应ts文件在解决方案的资源管理器的Translation File文件夹中 此时本地未生成 选中生成的ts文件
  • 从Endnote导入Zotero(含PDF)

    概述 这个问题尚未完美的解决 不过本方法可行 1 在Endnote中导出 xml文件 2 替换路径 使用记事本打开导出的 xml文件 将 internal pdf 替换为 My EndNote Library Data PDF 3 在Zot
  • JAVA子类继承父类的成员变量以及方法

    Dog继承Animal class Animal protected String name protected String description protected String say return 一只动物 class Dog e
  • 计算机网络中seq,计算机网络B卷及参考答案

    计算机网络 试卷B 卷 考试方式 闭卷 考试时间 120分钟 卷面总分 100分 一 单项选择题 本题共20题 每题2分 共40分 1 局部地区的通信网络简称局域网 英文缩写为 A WAN B LAN C MAN D PAN 2 因特网的正
  • 6-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(Wi-Fi模块SSL连接MQTT)

    5 STM32物联网开发WIFI ESP8266 GPRS Air202 系统方案安全篇 配置MQTT的SSL证书 验证安全通信 首先确定自己的固件打开了SSL 升级篇里面的固件我打开了SSL 如果自己下载的是这个固件SSL就打开了 如果自
  • 快速定位java系统线上问题

    原文 https blog csdn net GitChat article details 79019454 一 前言 Java 语言是当前互联网应用最为广泛的语言 作为一名 Java 程序猿 当业务相对比较稳定之后平常工作除了 codi
  • 设计模式简述

    定义 设计模式是为解决某个问题的一套解决方案 优点 1 为某个问题提供了最优解决方案 2 A君以设计模式的思路写的代码 懂设计模式的B君 就很容易读懂A君的代码 设计模式类型 1 创建型模式 创建对象的同时隐藏创建逻辑的方式 2 结构型模式
  • Python爬取、存储、分析、可视化豆瓣电影Top250

    Python爬取 存储 分析 可视化豆瓣电影Top250 网站链接 https movie douban com top250 文章目录 前言 一 python爬取目标数据 并写入csv文件 二 pymysql数据存储 三 pandas数据