python爬虫爬取电影数据并做可视化

news2024/11/25 1:25:14

思路:

1、发送请求,解析html里面的数据

2、保存到csv文件

3、数据处理

4、数据可视化

需要用到的库:

import requests,csv  #请求库和保存库
import pandas as pd  #读取csv文件以及操作数据
from lxml import etree #解析html库
from pyecharts.charts import *  #可视化库

注意:后续用到分词库jieba以及词频统计库nltk 

环境:

python  3.10.5版本

编辑器:vscode -jupyter

使用ipynb文件的扩展名 vscode会提示安装jupyter插件

一、发送请求、获取html

#请求的网址
url='https://ssr1.scrape.center/page/1'

#请求头
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}

#发起请求,获取文本数据  
reponse=requests.get(url,url,headers=headers)
print(reponse)

二、使用xpath提取html里面的数据并存到csv

#创建csv文件
with open('电影数据.csv',mode='w',encoding='utf-8',newline='') as f:
    #创建csv对象
    csv_save=csv.writer(f)

    #创建标题
    csv_save.writerow(['电影名','电影上映地','电影时长','上映时间','电影评分'])



    for page in range(1,11):  #传播关键1到10页的页数

        #请求的网址
        url='https://ssr1.scrape.center/page/{}'.format(page)
        print('当前请求页数:',page)

        #请求头
        headers={
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
        }


        response=requests.get(url,url,headers=headers,verify=False)
        print(response)

        html_data=etree.HTML(response.text)



        #获取电影名
        title=html_data.xpath('//div[@class="p-h el-col el-col-24 el-col-xs-9 el-col-sm-13 el-col-md-16"]/a/h2/text()')


        #获取电影制作地
        gbs=html_data.xpath('//div[@class="p-h el-col el-col-24 el-col-xs-9 el-col-sm-13 el-col-md-16"]/div[2]/span[1]/text()')

        #获取电影时长
        time=html_data.xpath('//div[@class="m-v-sm info"]/span[3]/text()')

        #获取电影上映时间
        move_time=html_data.xpath('//div[@class="p-h el-col el-col-24 el-col-xs-9 el-col-sm-13 el-col-md-16"]/div[3]/span/text()')

        #电影评分
        numder=html_data.xpath('//p[@class="score m-t-md m-b-n-sm"]/text()')



        for name,move_gbs,times,move_times,numders in zip(title,gbs,time,move_time,numder):
            print('电影名:',name,'  电影上映地址:',move_gbs,'   电影时长:',times,'   电影上映时间:',move_times,'   电影评分:',numders)
            #name,move_gbs,times,move_times,numders


            #写入csv文件
            csv_save.writerow([name,move_gbs,times,move_times,numders])

效果:

三、使用pandas打开爬取的csv文件

data=pd.read_csv('电影数据.csv',encoding='utf-8')
print(data)

四、对电影名进行分词以及词频统计

注意:使用jieba分词,nltk分词  

这里的停用此表可以自己创建一个  里面放无意义的字,比如:的、不是、不然这些

每个字独占一行即可

import jieba

title_list=[]

for name in data['电影名']:

    #进行精准分词
    lcut=jieba.lcut(name,cut_all=False)
#     print(lcut)
    
    for i in lcut :
#         print(i)
        
        
        #去除无意义的词

        #打开停用词表文件
        file_path=open('停用词表.txt',encoding='utf-8')

        #将读取的数据赋值给stop_words变量
        stop_words=file_path.read()
        
        
        #遍历后的值 如果没有在停用词表里面 则添加到net_data列表里面
        if i not in stop_words:
            title_list.append(i)
# print(title_list)


#计算词语出现的频率
from nltk import FreqDist #该模块提供了计算频率分布的功能

#FreqDist对象将计算net_data中每个单词的出现频率,,并将结果存储在freq_list中
freq_list=FreqDist(title_list)
print(freq_list)  #结果:FreqDist 有1321个样本和5767个结果 

#该方法返回一个包含最常出现单词及其出现频率的列表。将该列表赋值给most_common_words变量。
most_common_words=freq_list.most_common()
print(most_common_words)  #结果:('The这个词',出现185次)

效果:

五、词云可视化


  # 创建一个 WordCloud类(词云) 实例  
word_cloud = WordCloud()  
  
# 添加数据和词云大小范围    add('标题', 数据, word_size_range=将出现频率最高的单词添加到词云图中,并设置单词的大小范围为 20 到 100。)  
word_cloud.add('词云图', most_common_words, word_size_range=[20, 100])  
  
# 设置全局选项,包括标题  
word_cloud.set_global_opts(title_opts=opts.TitleOpts(title='电影数据词云图'))  
  
# 在 Jupyter Notebook 中渲染词云图  
word_cloud.render_notebook()

#也可以生成html文件观看
word_cloud.render('result.html')

运行效果:

 

六、对电影时长进行统计并做柱形图可视化

#电影时长   去除分钟和,号这个 转为int  然后再转为列表  只提取20条数据,总共100条
move_time=data['电影时长'].apply(lambda x: x.replace('分钟', '').replace(',', '')).astype('int').tolist()[0:20]
# print(move_time)

#电影名   只提取20条数据
move_name=data['电影名'].tolist()[0:20]
# print(move_name)

#创建Bar实例
Bar_obj=Bar()

#添加x轴数据标题
Bar_obj.add_xaxis(move_name)
    
#添加y轴数据
Bar_obj.add_yaxis('电影时长数据(单位:分钟)',move_time)

#设置标题
Bar_obj.set_global_opts(title_opts={'text': '电影时长数据柱形图可视化'})


# 显示图表
Bar_obj.render_notebook()

效果:

七、电影时长折线图可视化


#去除分钟和,号这个 转为int  然后再转为列表  只提取25条数据
move_time=data['电影时长'].apply(lambda x: x.replace('分钟', '').replace(',', '')).astype('int').tolist()[0:25]
# print(move_time)
 
#电影名   只提取25条数据
move_name=data['电影名'].tolist()[0:25]
# print(move_name)

#创建Bar实例
Bar_obj=Line()

#添加x轴数据标题
Bar_obj.add_xaxis(move_name)
    
#添加y轴数据
Bar_obj.add_yaxis('电影时长数据(单位:分钟)',move_time)

#设置标题
Bar_obj.set_global_opts(title_opts={'text': '电影时长数据折线图可视化'})


# 显示图表
Bar_obj.render_notebook()

效果:

 

八、统计每个国家电影上映的数量

import jieba

title_list=[]

#遍历电影上映地这一列
for name in data['电影上映地']:

    #进行精准分词
    lcut=jieba.lcut(name,cut_all=False)
#     print(lcut)
    
    for i in lcut :
#         print(i)
        
        
        #去除无意义的词

        #打开停用词表文件
        file_path=open('停用词表.txt',encoding='utf-8')

        #将读取的数据赋值给stop_words变量
        stop_words=file_path.read()
        
        
        #遍历后的值 如果没有在停用词表里面 则添加到net_data列表里面
        if i not in stop_words:
            title_list.append(i)
# print(title_list)



#计算词语出现的频率
from nltk import FreqDist #该模块提供了计算频率分布的功能

#FreqDist对象将计算net_data中每个单词的出现频率,,并将结果存储在freq_list中
freq_list=FreqDist(title_list)
print(freq_list)  #结果:FreqDist 有1321个样本和5767个结果 

#该方法返回一个包含最常出现单词及其出现频率的列表。将该列表赋值给most_common_words变量。
most_common_words=freq_list.most_common()
print(most_common_words)  #结果:('单人这个词',出现185次)


#电影名 使用列表推导式来提取most_common_words中每个元素中的第一个元素,即出现次数,然后将它们存储在一个新的列表中
map_data_title = [count[0] for count in most_common_words]  
print(map_data_title)

#电影数
map_data=[count[1] for count in most_common_words]  
print(map_data)

效果:

九、对每个国家电影上映数量饼图可视化

#获取map_data_title的长度,决定循环次数,赋值给遍历i 在通过下标取值 
result = [[map_data_title[i], map_data[i]] for i in range(len(map_data_title))]
print(result)

# 创建Pie实例
chart=Pie()

#添加标题和数据   radius=['圆形空白处百分比','色块百分比(大小)'] 可不写
chart.add('电影上映数饼图(单位:个)',result,radius=['50%','60%'])

#显示
chart.render_notebook()

效果:

觉得有帮助的话,点个赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1020554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网穿透工具 Cpolar 帮您实现用友U8 Cloud 的外网部署,一键畅享云端ERP

文章目录 前言1. 用户需求2. Cpolar内网穿透的安装和注册2.1 Cpolar云端设置2.2 Cpolar Web UI本地设置 3. 公网访问测试 前言 用友U8 Cloud是用友公司推出的一款云端ERP解决方案。它以云计算技术为基础,为企业提供全面的企业资源管理解决方案,涵盖了财…

主机存活检测脚本

原理演示 在命令行下用下面命令安装scap模块: python -m pip install scapyscapy与scrapy 有非常大的区别。 scapy 是一个Python 的第三方模块,被称为“网络神器”。scapy 模块能够发送、捕获、分析和铸造网络数据 sr1发送接收函数 如图,安…

AI绘画变现渠道:日入100+,推荐一个本人实操的方法

关于AI绘画变现,之前写了几篇相关的文章,需要的自己查阅: AI绘画:如何让图片开口说话生成视频?变现渠道有哪些? 无私分享我的AI绘画变现之路,普通人可实操可模仿 AI壁纸号一周增加上千粉丝&a…

二叉树题目:层数最深叶子结点的和

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:层数最深叶子结点的和 出处:1302. 层数最深叶子结点的和 难度 4 级 题目描述 要求 给定一个二叉树…

有效的括号(栈的高频面试题)

一、题目描述 题目连接:有效的括号 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺…

我的创作纪念日 · 开始创作的第128天~

我的创作纪念日 开始创作的第128天 1️⃣ 机缘2️⃣ 收获3️⃣ 日常4️⃣ 憧憬 1️⃣ 机缘 时光匆匆,春去秋来,2023年在CSDN下笔的128天已去,回想当初成为创作者的初心,现在的心境已截然不同。当时正值上家公司工作变动&#xf…

【大数据】Doris 构建实时数仓落地方案详解(二):Doris 核心功能解读

Doris 构建实时数仓落地方案详解(二):Doris 核心功能解读 1.Doris 发展历程2.Doris 三大模型3.Doris 数据导入4.Doris 多表关联5.Doris 核心设计6.Doris 查询优化7.Doris 应对实时数仓的痛点 1.Doris 发展历程 Apache Doris 是由 百度 研发并…

华为云云耀云服务器L实例评测|用Python的Flask框架加Nginx实现一个通用的爬虫项目

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,AWS/阿里云资深使用…

QUIC协议报文解析(三)

在前面的两篇文字里我们简单介绍了QUIC的发展历史,优点以及QUIC协议的连接原理。本篇文章将会以具体的QUIC报文为例,详细介绍QUIC报文的结构以及各个字段的含义。 早期QUIC版本众多,主要有谷歌家的gQUIC,以及IETF致力于将QUIC标准…

数据结构之堆的结构与实现

目录 一、堆的概念及结构 1.1堆的概念 1.2堆的性质 1.3堆的结构 二、堆的实现 2.1堆向下调整算法(父亲与孩子做比较) 2.2堆的向上调整算法(孩子与父亲做比较) 2.3堆的创建(向下建堆) 2.4向下建堆的时…

26 WEB漏洞-XSS跨站之订单及Shell箱子反杀记

目录 xss平台及工具使用session与Cookie获取问题演示案例某营销订单系统XSS盲打_平台某Shell箱子系统XSS盲打_工具其他参考应用案例-后台权限维持工具Http/s数据包提交Postman使用 xss平台及工具使用 凡是有数据交互的地方,前端是接收数据的,后端是要把…

Android Kotlin 高阶详解

前言 本文主要讲述kotlin高阶相关的内容,如果对kotlin基础还不了解的, 可以参考文章Android Kotlin 基础详解_袁震的博客-CSDN博客 1,与Java的相互调用 1.1在kotlin中调用java代码 大多数的java代码都可以直接在kotlin中调用&#xff0c…

Spring Cloud Alibaba Nacos注册中心(单机)

文章目录 Spring Cloud Alibaba Nacos注册中心(单机)1. docker 安装 nacos(先别着急)2. 配置nacos持久化到mysql、2.1 properties 文件 3. java注册3.1 POM文件3.2 properties文件3.3 测试配置中心 4.注册中心4.1 配置文件4.2测试…

【八大经典排序算法】选择排序

【八大经典排序算法】选择排序 一、概述二、思路解读三、代码实现(升序)四、优化(升序) 一、概述 选择排序作为一种简单直观的排序算法,最早由美国计算机科学家 Donald Knuth 在1968年提出。 选择排序的思想是将数组…

小程序从无到有教学教程-- 01.重置华为云服务器Huawei Cloud EulerOS 2.0版本并且设置安全组

概述 专门拿了专栏来讲解,所以目录结构就比较简单了 文章目录 概述修改华为云操作系统选择Huawei Cloud EulerOS 2.0 镜像顺便配置华为安全组 修改华为云操作系统 这里选择华为最新的系统,不过也就2.0~ 选择Huawei Cloud EulerOS 2.0 镜像 这里记住密…

企业架构LNMP学习笔记61

Nginx作为tomcat的前段反向代理: 在实际业务环境中,用户是直接通过域名访问,基于协议一般是http、https等。默认tomcat运行在8080端口。一般会通过前端服务器反向代理到后端的tomcat的方式,来实现用户可以通过域名访问tomcat的we…

bat写的git命令大全(适合初学者)掌握命令行下的Git操作!

欢迎来到Git!无论你是一位Git初学者,这个在命令大全将帮助你在命令行下熟练运用Git,提高版本控制和团队协作的效率。从基本的仓库管理到分支操作,从提交修改到远程仓库同步,这个命令大全涵盖了Git的各种常用功能和技巧…

LeetCode-热题100-笔记-day31

105. 从前序与中序遍历序列构造二叉树https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历&#xff0c…

QT-day2

完善登录框 点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮…