爬取电影数据结合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)

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


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

相关推荐
笨鸟先飞,勤能补拙5 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能6 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂6 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study7 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境7 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境7 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1237 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102168 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb008 小时前
一个项目带你入门AI应用开发01
python
0566469 小时前
Python康复训练——常用标准库
开发语言·python·学习