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

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

|----------------------------|--------------------------|
| requests (发送HTTP请求) | pandas(数据处理和分析 保存数据) |
| parsel(解析HTML数据) | pyecharts(数据可视化图表) |
| pymysql(连接和操作MySQL数据库) | lxml(数据解析模块) |
[本次案例所需用到的模块]

确定爬取的内容:

电影名称

电影主演

上映时间

评分

分析页面:

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

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

爬取步骤:

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

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

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

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

python 复制代码
# 导包
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 替换方法去除不要的文字 只保留主演名字

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

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

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

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

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

三.保存数据

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

python 复制代码
data = []

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

最后听过pandas 保存数据

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

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

python 复制代码
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文件中上映时间的字段 中的国家地名去掉 只保留纯日期数值
至于如何查看 数据的一些信息 语法就不在这里介绍了 可以看之前的文章

python 复制代码
# 导包 读取文件
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)
python 复制代码
# 导包
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')
相关推荐
前端开发张小七11 分钟前
4.Python3 模块与 `__name__` 属性的深入解析
python
蹦蹦跳跳真可爱58912 分钟前
Python----计算机视觉处理(Opencv:形态学变换)
人工智能·python·opencv·计算机视觉
浊酒南街13 分钟前
TensorFlow之Session
人工智能·python·tensorflow
冷琴199618 分钟前
基于python+django+mysql的小区物业管理系统源码+运行步骤
开发语言·python
nuclear201126 分钟前
使用Python在Word中创建、读取和删除列表 - 详解
python·多级列表·word文档·编号列表·项目符号列表·自定义列表·获取列表编号和内容
renaissance27 分钟前
深入理解Python的GeneratorExit异常
后端·python
π27038 分钟前
Python:单例模式&魔法方法
python·单例模式
爱喝热水的呀哈喽40 分钟前
Java继承与反思,单例模式与静态的思考
java·python·单例模式
钮钴禄·爱因斯晨1 小时前
探秘 Java ArrayList 集合:解锁数据存储新姿势
java·开发语言·python
蹦蹦跳跳真可爱5891 小时前
Python---数据分析(Pandas七:二维数组DataFrame中元素的索引与访问,其他常用方法)
python·信息可视化·数据分析·pandas