爬取电影数据结合Flask实现数据可视化

网站 :Scrape | Movie

|-------------------|-----------------|
| requests (网络请求模块) | pandas (数据保存模块) |
| parsel (数据解析模块) | lxml (数据解析模块) |
[本案例(爬虫)所需要的模块]

|------------------|-----------|
| pyecharts (可视化库) | flask(框架) |

以上的模块均需要通过 指令 pip install 模块名 安装

Explain:
分析此页面的数据为静态的还是动态加载的 右击打开查看页面源代码 可知此网站的数据为静态的
我们所需要采集的数据都在里面


**爬取步骤:

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

F12 打开开发者工具 or 右击打开检查
接着分析html代码的结构 找出数据的所在位置
Class属性为(
el-card item m-t is-hover-shadow**) div 包含我们的数据
通过类名拿到之后遍历取值**

python 复制代码
# 导包 导入所需要的模块 库
import requests
import parsel
from lxml import etree

import pandas as pd

url = f'https://ssr1.scrape.center/page/{page}'
# 因为此网站无反爬 不需要加额外参数的请求头
headers = {
        'user-agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
        'referer': 'https://ssr1.scrape.center/page/2'
}
resp = requests.get(url, headers=headers)
# 实例一个selector对象
selector = parsel.Selector(resp.text)
# css 语法 获取所有的div
lis = selector.css('.el-card.item.m-t.is-hover-shadow')

进一步分析 各个数据的位置

电影名称 .m-b-sm::text 提取里面的文本

电影类型 .categories span::text 拿到所有的span标签中的文本

电影区域|上映时间|电影时长 .m-v-sm.info span::text 同上

详情页链接 .name::attr(href) 拿到详情页里面的剧情介绍

二. 解析数据

电影类型:

电影区域|上映时间|电影时长:

评分:

多页的数据采集


page 参数的不同 可以嵌套for循环实现

三. 提取数据 提取所需要的数据

python 复制代码
import requests
import parsel
from lxml import etree

import pandas as pd

# 多页爬取
for page in range(1,11):
    url = f'https://ssr1.scrape.center/page/{page}'
    headers = {
        'user-agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
        # 多页爬取最好加个防盗链
        'referer': 'https://ssr1.scrape.center/page/2'
    }
    resp = requests.get(url, headers=headers)
    selector = parsel.Selector(resp.text)
    # 解析成html
    html = etree.HTML(resp.text)
    lis = selector.css('.el-card.item.m-t.is-hover-shadow')
    for li in lis:
        title = li.css('.m-b-sm::text').get()
        # 转换成字符串 处理成想要的数据
        score = ''.join(html.xpath("//*[@class ='score m-t-md m-b-n-sm']/text()")[0]).strip()
        type = ' '.join(li.css('.categories span::text').getall())
        # 对得到的列表数据取值
        area = li.css('.m-v-sm.info span::text').getall()[0]
        time = li.css('.m-v-sm.info span::text').getall()[-2]
        upload_time = li.css('.m-v-sm.info span::text').getall()[-1]
        # 电影封面数据
        img_url = li.css('.cover::attr(src)').get()
        # 电影内页链接
        href = li.css('.name::attr(href)').getall()
        # for 循环遍历 拼接URL 地址获取剧情简介
        for i in href:
            inner_url = 'https://ssr1.scrape.center' + i
            response = requests.get(url=inner_url, headers=headers)
            inner_select = parsel.Selector(response.text)
            # 获取数据 转换成字符串
            introduce = ''.join(inner_select.css('.drama p::text').get()).strip()
            # 用字典封装起来
            dit = {
                "title": title,
                "score": score,
                "type": type,
                "area": area,
                "time": time,
                "upload_time": upload_time,
                "introduce": introduce,
                "img_url": img_url,
            }
  

四.保存数据 保存数据到本地

python 复制代码
# 定义一个空列表
all = []
# 将字典数据添加到列表中
all.append(dit)
# 通过pandas 保存数据 不保存索引
pd.DataFrame(all).to_excel('movie_info.xlsx', index=False)

完整代码如下:
仅供学习参考

python 复制代码
import requests
import parsel
from lxml import etree

import pandas as pd

all = []
for page in range(1,11):
    url = f'https://ssr1.scrape.center/page/{page}'
    headers = {
        'user-agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
        'referer': 'https://ssr1.scrape.center/page/2'
    }
    resp = requests.get(url, headers=headers)
    selector = parsel.Selector(resp.text)
    html = etree.HTML(resp.text)
    lis = selector.css('.el-card.item.m-t.is-hover-shadow')
    for li in lis:
        title = li.css('.m-b-sm::text').get()
        score = ''.join(html.xpath("//*[@class ='score m-t-md m-b-n-sm']/text()")[0]).strip()
        type = ' '.join(li.css('.categories span::text').getall())
        area = li.css('.m-v-sm.info span::text').getall()[0]
        time = li.css('.m-v-sm.info span::text').getall()[-2]
        upload_time = li.css('.m-v-sm.info span::text').getall()[-1]
        img_url = li.css('.cover::attr(src)').get()
        href = li.css('.name::attr(href)').getall()
        for i in href:
            inner_url = 'https://ssr1.scrape.center' + i
            response = requests.get(url=inner_url, headers=headers)
            inner_select = parsel.Selector(response.text)
            introduce = ''.join(inner_select.css('.drama p::text').get()).strip()
            dit = {
                "title": title,
                "score": score,
                "type": type,
                "area": area,
                "time": time,
                "upload_time": upload_time,
                "introduce": introduce,
                "img_url": img_url,
            }
            all.append(dit)
            pd.DataFrame(all).to_excel('movie_info.xlsx', index=False)

运行 数据采集成功

处理数据 将想要的字段数据可视化 生成图表

python 复制代码
#导包
import pandas as pd
from pyecharts.charts import Line
# 配置项
from pyecharts import options as opt

# 读取文件
df = pd.read_excel('movie_info.xlsx')
title = df['title'].tolist()
score = df['score'].tolist()
bar =(
    Line()
    # 添加x y轴数据
    .add_xaxis(title)
    # 显示最大最小值的数据
    .add_yaxis('评分',score,markpoint_opts=opt.MarkPointOpts(
        data=[
            opt.MarkPointItem(type_='max'),
            opt.MarkPointItem(type_='min'),
        ]
    ))
    # 设置标题
    .set_global_opts(
        title_opts=opt.TitleOpts(
            title='电影信息评分'
        ),
    )
    # 隐藏其它的数值
    .set_series_opts(label_opts=opt.LabelOpts(
        is_show=False
    ))
).render('score.html')
# 生产html文件

接着渲染到Flask上

render_template它是一个用于渲染模板文件的函数。在 Flask 中,通常会将 HTML 页面等内容写在模板文件里(比如使用 Jinja2 模板引擎的模板文件),这个函数能够将模板文件与 Python 代码中的数据结合起来,生成最终要返回给客户端的 HTML 页面等内容。

python 复制代码
from flask import Flask,render_template,request


#这里实例化了 Flask 类,创建了一个 Flask 应用对象,并将当前模块的名称(通过 Python 内置的 __name__ 变量获取)传递给 Flask 类的构造函数。这个应用对象是后续定义路由、启动服务器等操作的基础
app = Flask(__name__)
# 设置路由
# 是一个装饰器,用于将一个 Python 函数(在这里是 view 函数)与一个特定的 URL 路径进行绑定,也就是定义了一个路由。在这个例子中,/ 表示应用的根路径,意味着当用户通过浏览器访问这个 Flask 应用的根 URL(比如 http://localhost:5000/,默认运行在 5000 端口)时,view 函数就会被调用
@app.route('/')
def view():
    return render_template('view.html')

if __name__ == '__main__':
    # 服务器的启动方式 通过刷新就可以实时查看
    app.run(debug=True)

点击就可以打开服务器看到我们渲染的图表了


本次的案例分享就到此结束感谢您的观看
您的点赞和关注是我更新的动力 后续我也会持续学习

相关推荐
烛阴4 小时前
简单入门Python装饰器
前端·python
好开心啊没烦恼4 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
面朝大海,春不暖,花不开4 小时前
使用 Python 实现 ETL 流程:从文本文件提取到数据处理的全面指南
python·etl·原型模式
失败又激情的man5 小时前
Scrapy进阶封装(第四阶段:中间件设置,动态UA,ip代理池)
爬虫·scrapy·中间件
2301_805054565 小时前
Python训练营打卡Day59(2025.7.3)
开发语言·python
万千思绪6 小时前
【PyCharm 2025.1.2配置debug】
ide·python·pycharm
涤生大数据7 小时前
Apache Spark 4.0:将大数据分析提升到新的水平
数据分析·spark·apache·数据开发
微风粼粼7 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
云天徽上7 小时前
【PaddleOCR】OCR表格识别数据集介绍,包含PubTabNet、好未来表格识别、WTW中文场景表格等数据,持续更新中......
python·ocr·文字识别·表格识别·paddleocr·pp-ocrv5
可观测性用观测云8 小时前
Pipeline 引用外部数据源最佳实践
数据分析