爬虫基础之爬取猫眼Top100 可视化

news2025/3/26 20:46:10

网站: TOP100榜 - 猫眼电影 - 一网打尽好电影
 

本次案例所需用到的模块
requests (发送HTTP请求)

pandas(数据处理和分析 保存数据)

parsel(解析HTML数据) 

pyecharts(数据可视化图表)

pymysql(连接和操作MySQL数据库)

lxml(数据解析模块)


确定爬取的内容:

  1. 电影名称

  2. 电影主演

  3. 上映时间

  4. 评分

分析页面:

确认是静态数据还是动态数据
右击打开网页源代码   快捷键Ctrl+F 打开搜索框 搜索需要爬取的数据

可以发现 此数据为静态数据  即所需要的数据都在网页上面

爬取步骤:

一.发送请求 模拟浏览器向服务器发送请求

二. 解析数据   从网页中提取数据

三. 保存数据  将爬取到的数据保存为本地文件

OK 我们开始写代码
将浏览器的url地址复制 构建请求头参数
此网站需要登陆 才能拿到数据 请求体中一般包含三个数据 UA(浏览器的基本信息) referer(就是防盗链 即当前页面通过哪个页面跳转过来的)  cookie(用户的一些基本信息)

# 导包
import requests

url = 'https://www.maoyan.com/board/4?timeStamp=1741780786427&channelId=40011&index=2&signKey=30a132dd14a76c19cfd2759ba27adc28&sVersion=1&webdriver=false'

headers = {
    'user-agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0',
    'referer':
        'https://www.maoyan.com/',
    'cookie':
        '你的cookie'

}
resp = requests.get(url,headers=headers)
print(resp.text)

打印我们从浏览器爬取下来的信息
Ctrl+F 快捷键 搜索确认 数据在返回的信息中 

第二步 解析数据

打开开发者工具中的元素 用左上角的小箭头去查看页面的结构

定位元素 拿到对应的class属性值  采取parserl模块里面的css 的来提取数据

我们可以看到  爬取下来的内容中 有空格 缩进
处理办法: 转换成字符串类型的格式 然后使用strip()方法 去掉空格 replace 替换方法去除不要的文字  只保留主演名字

movie_time = li.css('.releasetime::text').get().replace('上映时间:', '')
# 上映时间也一样 只保留时间

最后 这个评分是分开的  需要做个字符串的拼接

getall() 拿到所有满足条件的class属性为score 下面i 标签中的文本  其返回的是个列表 通过对列表取值 就可以拿到这两个分开的评分  最后拼接起来 输出打印莫问题

movie_s = li.css('.score i::text').getall()[0]
movie_ore = li.css('.score i::text').getall()[-1]
movie_score = movie_s + movie_ore

所有的信息提取完毕 接下来我们保存数据

三.保存数据

将数据存储在字典中  在外面定义一个空列表  最后将字典添加到列表中

data = []

dit = {
  '电影名': movie_name,
  '主演': movie_actor,
  '上映时间': movie_time,
  '评分': movie_score
}
data.append(dit)

最后听过pandas 保存数据  

# 传入我们的列表 设置索引列为false 即不生成额外的一列索引
pd.DataFrame(data).to_excel('Top100.xlsx', index=False)

本次爬虫板块的代码如下  还有保存到数据库的就不讲解了 详细的话看我之前的文章
多页爬取的话 分析几页的url地址可得  多了个offset参数 每页间隔10 后续通过for循环遍历即可 

import requests
import parsel
import pandas as pd
import pymysql

# 建立连接
connect = pymysql.connect(
    user='root',
    password="112233",
    host='localhost',
    database='douban', )
# 拿游标
cursor = connect.cursor()

# 此模块集成了css  xpath re正则三种解析数据的模块
data = []
for page in range(0, 101, 10):
    url = f'https://www.maoyan.com/board/4?timeStamp=1741780786427&channelId=40011&index=2&signKey=30a132dd14a76c19cfd2759ba27adc28&sVersion=1&webdriver=false&offset={page}'
    headers = {
        'user-agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0',
        'referer':
            'https://www.maoyan.com/',
        'cookie':
            '你的cookie'

    }

    resp = requests.get(url, headers=headers)
    selector = parsel.Selector(resp.text)
    lis = selector.css('.board-wrapper dd')
    for li in lis:
        movie_name = li.css('.name a::attr(title)').get()
        movie_actor = li.css('.star::text').get().strip().replace('主演:', '')
        movie_time = li.css('.releasetime::text').get().replace('上映时间:', '')
        movie_s = li.css('.score i::text').getall()[0]
        movie_ore = li.css('.score i::text').getall()[-1]
        movie_score = movie_s + movie_ore
        dit = {
            '电影名': movie_name,
            '主演': movie_actor,
            '上映时间': movie_time,
            '评分': movie_score
        }
        data.append(dit)
        
    # pd.DataFrame(data).to_excel('Top100.xlsx', index=False)
    #     准备sql语句
        sql = 'insert into top100 values (%s,%s,%s,%s)'
        cursor.executemany(sql,[(movie_name,movie_actor,movie_time,movie_score)])
        # 提交事务
        connect.commit()

爬取的数据如下: 

 接着我们清洗数据  将excel文件中上映时间的字段 中的国家地名去掉  只保留纯日期数值
至于如何查看 数据的一些信息 语法就不在这里介绍了 可以看之前的文章

# 导包 读取文件
import pandas as pd


df = pd.read_excel('Top100.xlsx', index_col=False)
# 将上映时间这一列的数据中的日期提取出来 重新赋值给上映时间这一列
df['上映时间'] = df['上映时间'].str.extract(r'(\d{4}-\d{2}-\d{2})')

# 去除空数据
# 将数据中的空数据去除  在原有的数据上
df.dropna(inplace=True)

# 将处理好的数据保存到新的文件中  不生成索引列
df.to_excel('new_Top.xlsx', index=False)

# 导包
from pyecharts.charts import Line
from pyecharts import options as opts

# 生成柱状图
c = (
    Line()
    # 添加x轴 数据 将电影名这一列的数据转换成列表
    .add_xaxis(df['电影名'].tolist())
    # 添加y轴 设置y轴名称  同样将数据转换成列表
    .add_yaxis('评分', df['评分'].tolist())
    # 设置 配置项
    .set_global_opts(
        # 标题与副标题的设置
        title_opts=opts.TitleOpts(title="Top100电影评分", subtitle='副标题'),
        # x轴相关的设置  设置x轴的数据 向右旋转45 -45 为逆时针
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
    )
    # 列的设置 不显示每一列上面的数据
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
)
# 生成html 文件
c.render('Top100.html')

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

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

相关文章

LS-NET-006-思科MDS 9148S 查看内存

LS-NET-006-思科MDS 9148S 查看内存 方法一:使用 show version​ 命令 该命令可显示设备的基本系统信息,包括内存总量。 登录交换机的CLI(通过控制台或SSH连接)。输入命令: show version 在输出中查找类似以下内容…

小程序API —— 54 路由与通信 - 编程式导航

在小程序中实现页面的跳转,有两种方式: 声明式导航:navigator 组件编程式导航:使用小程序提供的 API 编程式导航 API 提供了五个常用的 API 方法: wx.navigateTo():保留当前页面,跳转到应用内…

关于金融开发领域的一些专业知识总结

目录 1. 交易生命周期 1.1 证券交易所 1.1.1 交易前 1) 订单生成(Order Generation) 2) 订单管理(Order Management) 1.1.2 交易执行 3) 交易匹配(Trade Matching) 1.1.3 交易后 4) 交易确认&…

DeepSeek-R1深度解读

deepseek提出了一种通过强化学习(RL)激励大语言模型(LLMs)推理能力的方法,个人认为最让人兴奋的点是:通过RL发现了一个叫“Aha Moment”的现象,这个时刻发生在模型的中间版本中。在这个阶段&…

15-双链表-双链表基本操作

题目 来源 827. 双链表 - AcWing题库 思路 此题我只想说,千万千万别漏了头结点和尾结点,不然根本查不出来是哪里出了问题,因为传入的k会有问题;最左边插入,相当于是在头结点的右边插入(也就是0号节点的右…

【小也的Java之旅系列】01 分布式、集群、微服务的区别

前言 做Java开发多年,一直以来都有想把Java做成一个系列的想法,最近整理自己的笔记发现有很多值得写的内容,但这些内容又往往杂乱不堪。CSDN上有很多高质量的Java博客,但大多不是从一个人成长的角度去写的。而我们——一个技术人…

基于视觉的核桃分级与套膜装置研究(大纲)

基于视觉的核桃分级与套膜装置研究:从设计到实现的完整指南 (SolidWorks、OpenCV、STM32开发实践) 🌟 项目背景与目标 1.1 为什么选择视觉分级与套膜? 产业痛点: 中国核桃年产量全球第一,但…

JimuReport与deepseek结合,颠覆现有BI模式

在数字化转型的浪潮中,企业对数据的依赖程度越来越高,如何高效地分析和利用数据成为关键。JimuReport凭借其强大的报表设计能力和灵活的数据处理功能,已经成为众多企业的首选工具。如今,它即将与DeepSeek深度结合,为企…

11、STL中的set使用方法

一、了解 set 是 C 标准模板库(STL)中提供的有序关联容器之一。基于红黑树(Red-Black Tree)实现,用于存储一组唯一的元素,并按照元素的值进行排序。 set的特性 唯一性 键是唯一的。无重复。 有序性 按升序…

操作系统——(管程、线程、进程通信)

目录 一、管程机制 (1)管程定义 (2)特点: 二、进程通信 (1)概念 (2)高级通信机制 三、线程 (1)概念 (2)与进程比较…

Sqlserver安全篇之_启用和禁用Named Pipes的案列介绍

https://learn.microsoft.com/zh-cn/sql/tools/configuration-manager/named-pipes-properties?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/tools/configuration-manager/client-protocols-named-pipes-properties-protocol-tab?viewsql-server-ver16 默认…

Web开发-JS应用原生代码前端数据加密CryptoJS库jsencrypt库代码混淆

知识点: 1、安全开发-原生JS-数据加密&代码混淆 2、安全开发-原生JS-数据解密安全案例 一、演示案例-WEB开发-原生JS&第三方库-数据加密 前端技术JS实现: 1、非加密数据大致流程: 客户端发送->明文数据传输-服务端接受数据->…

比特币牛市还在不在

在加密货币的风云世界里,比特币的一举一动始终牵动着投资者们的神经。近期比特币的涨幅动作,再次引发了市场对于牛市是否仍在延续的激烈讨论。 在深入探索比特币市场的过程中,获取全面且及时的资讯至关重要。您可以通过访问Techub News&#…

Python、MATLAB和PPT完成数学建模竞赛中的地图绘制

参加数学建模比赛时,很多题目——诸如统计类、数据挖掘类、环保类、建议类的题目总会涉及到地理相关的情景,往往要求我们制作与地图相关的可视化内容。如下图,这是21年亚太赛的那道塞罕坝的题目,期间涉及到温度、降水和森林覆盖率…

跨平台RTSP高性能实时播放器实现思路

跨平台RTSP高性能实时播放器实现思路 目标:局域网100ms以内超低延迟 一、引言 现有播放器(如VLC)在RTSP实时播放场景中面临高延迟(通常数秒)和资源占用大的问题。本文提出一种跨平台解决方案,通过网络层…

编写一个简单的chrome截图扩展

文件结构: screenshot |-- background.js ---> service_worker运行的js |-- images ---> 图片 | |-- logo-128x128.png | |-- logo-16x16.png | |-- logo-32x32.png | -- logo-48x48.png -- manifest.json --->…

吴恩达机器学习笔记复盘(六)梯度下降算法

简介 梯度下降(Gradient Descent)是一种常用的优化算法,广泛应用于机器学习、深度学习等领域,在这里是用于求J(w,b)局部最小值。 我自己觉得这样说有点过于抽象。换个直观点的说法就是,一个人…

【机器学习chp14 — 3】生成式模型—生成对抗网络GAN(超详细分析,易于理解,推导严谨,一文就够了)

目录 三、生成对抗网络 ( Generative Adversarial Networks,GAN ) 1、GAN的基本思想 (1)生成器与判别器的基本结构与演变 (2)“对抗”机制及名词由来 2、GAN训练的基本算法 (1)网络初始化与…

机器人打磨控制技术

工具姿态调整运动 法线方向对齐运动:机器人实时调整工具姿态,使打磨工具的轴线与工件曲面的法线方向一致。例如,在球面打磨时,工具需始终垂直于球面切线。角度补偿运动:针对倾斜或不规则曲面,通过调整机器人…

K8S学习之基础四十:K8S配置altermanager发送告警到钉钉群

配置altermanager发送告警到钉钉群 ​ 创建钉钉群,设置机器人助手(必须是管理员才能设置),获取webhook webhook: https://oapi.dingtalk.com/robot/send?access_token25bed933a52d69f192347b5be4b2193bc0b257a6d9ae68d81619e3ae3d93f7c6…