python通过JS逆向采集艺恩电影数据, 并制作可视化

news2025/1/19 8:23:21

嗨喽~大家好呀,这里是魔王呐 ❤ ~!


如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码

环境使用:

  • 版 本: python 3.10

  • 编辑器:pycharm 2022.3.2

  • nodejs

模块使用:

  • requests -> pip install requests

  • execjs -> pip install pyexecjs

  • json

  • csv

第三方模块安装

win + R 输入cmd 输入安装命令 pip install 模块名

实现爬虫流程:

一. 数据来源分析
  1. 明确需求: 明确采集的网址以及数据内容

    • 网址: https://www.endata.com.cn/BoxOffice/BO/Year/index.html

    • 数据: 电影数据

  2. 抓包分析: 通过开发者工具(浏览器自带)进行分析

    • 打开开发者工具: F12 / 右键点击检查选择network (网络)

    • 选择任意年份: 让它加载对应的数据内容

    查看返回的数据内容:

    • 请求网址: https://www.endata.com.cn/API/GetData.ashx

    • 请求方式: POST (需要向服务器提交表单数据)

    • 请求头: (是否有加密参数)

    • 请求参数:

      • year: 2023

      • MethodName: BoxOffice_GetYearInfoData

    • 响应数据:

      • 密文内容 (加密内容)
    • 对于加密的数据, 进行解密

      • 分析加密规则, 如何解密 (查看启动器)

      • 断点目的: 刷新网页 / 翻页时候, 网页运行到这个地方可以暂停住

      • 传入了什么参数, 返回了什么内容

二. 代码实现步骤
  1. 发送请求 -> 模拟浏览器对于url地址发送请求

  2. 获取数据 -> 获取服务器返回响应数据

    获取密文数据 -> 解密

  3. 解析数据 -> 提取我们数据内容

  4. 保存数据 -> 保存数据

数据爬取代码

'''
python资料获取看这里噢!! 小编 V:qian97378,即可获取:
文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
# 导入数据请求模块: 需要安装 pip install requests
import requests
# 需要安装 pip install pyexecjs
import execjs
# 导入json模块
import json
# 导入csv模块
import csv

"""保存数据"""
# 创建文件对象
csv_file = open('data.csv', mode='w', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(csv_file, fieldnames=[
    '影片名称',
    '类型',
    '总票房',
    '平均票价',
    '场均人次',
    '国家地区',
    '上映时间',
])
csv_writer.writeheader()
"""1. 发送请求 -> 模拟浏览器对于url地址发送请求"""
# 模拟浏览器
headers = {
    # User-Agent 用户代理 表示浏览器基本身份信息
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
for year in range(2008, 2024):
    # 请求网址
    url = 'https://www.endata.com.cn/API/GetData.ashx'
    # 请求参数
    data = {
        'year': year,
        'MethodName': 'BoxOffice_GetYearInfoData'
    }
    # 发送请求
    response = requests.post(url=url, data=data, headers=headers)
    """2. 获取数据 -> 获取服务器返回响应数据"""
    content = response.text
    print('密文数据: ', content)  # 查看是否得到数据内容
    """解密数据
    - 通过JS代码变成明文数据 (分析解密数据代码位置)
    - 通过python代码调用js代码
    """
    # 读取js代码
    f = open('demo.js', encoding='utf-8').read()
    # 编译js代码
    js_code = execjs.compile(f)
    # 调用js代码函数
    res = js_code.call('get_content', content)
    # 转成字典数据
    json_data = json.loads(res)
    print('明文数据: ', res)
    print(json_data)
    """3. 解析数据 -> 提取我们数据内容"""
    Table = json_data['Data']['Table']
    # for 循环遍历, 提取列表元素
    for index in Table:
        # 把数据保存到字典里面
        dit = {
            '影片名称': index['MovieName'],
            '类型': index['Genre_Main'],
            '总票房': index['BoxOffice'],
            '平均票价': index['AvgPrice'],
            '场均人次': index['AvgPeoPle'],
            '国家地区': index['Area'],
            '上映时间': index['ReleaseTime'],
        }
        # 写入数据
        csv_writer.writerow(dit)
        print(dit)

数据可视化代码

# 需要安装 pip install pandas
import pandas as pd
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
# 读取文件
df = pd.read_csv('data.csv')
# 显示前5行数据
df.head()

可以直接通过pyechrats 官文文档 实现可视化分析

https://gallery.pyecharts.org/#/README
info = df['类型'].value_counts().index.to_list() # x轴的数据
num = df['类型'].value_counts().to_list() # y轴的数据
'''
python资料获取看这里噢!! 小编 V:qian97378,即可获取:
文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker

c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(
                info,
                num,
            )
        ],
        center=["40%", "50%"],
    )
    .set_global_opts(
        # 设置标题
        title_opts=opts.TitleOpts(title="2008-2023年部分电影类型分布"),
        legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    # 把可视化图保存成html文件
    # .render("2008-2023年部分电影类型分布(饼图).html")
)
c.load_javascript()
c.render_notebook()

'''
python资料获取看这里噢!! 小编 V:qian97378,即可获取:
文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
info = df['国家地区'].value_counts().index.to_list() # x轴的数据
num = df['国家地区'].value_counts().to_list() # y轴的数据
c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(
                info,
                num,
            )
        ],
        center=["40%", "50%"],
    )
    .set_global_opts(
        # 设置标题
        title_opts=opts.TitleOpts(title="2008-2023年部分电影国家地区分布"),
        legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    # 把可视化图保存成html文件
    # .render("2008-2023年部分电影类型分布(饼图).html")
)
c.render_notebook()

df.head()

Top = df[['影片名称', '总票房']].sort_values('总票房')[-10:]
name = list(Top['影片名称'])
num = list(Top['总票房'])
'''
python资料获取看这里噢!! 小编 V:qian97378,即可获取:
文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
from pyecharts import options as opts
from pyecharts.charts import Bar

c = (
    Bar()
    .add_xaxis(name)
    .add_yaxis("", num)
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
        title_opts=opts.TitleOpts(title="2008-2023年部分电影总票房Top10分布", subtitle=""),
    )
    # .render("bar_rotate_xaxis_label.html")
)
c.render_notebook()

尾语

最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

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

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

相关文章

python实现bp神经网络对csv文件进行数据预测

参考资源: sklearn库 bp神经网络[从原理到代码一篇搞定](2)_sklearn 神经网络-CSDN博客 十分钟上手sklearn:安装,获取数据,数据预处理 - 知乎 (zhihu.com) 一个实例讲解如何使用BP神经网络(附代码) - 知…

基于STM32单片机智能手环老人防跌倒报警系统GSM短信上报毕业设计7

STM32单片机老人防跌倒报警系统GSM短信上报加速度7 演示视频(复制到浏览器打开): 基于STM32单片机的智能手环老人防跌倒报警系统设计GSM短信上报ADXL345重力加速度检测设计DIY开发板套件7 修改接收短信手机号码视频: ★★★如何修…

Pycharm解释器的配置: System Intgerpreter 、Pipenv Environment、Virtualenv Environment

文章目录 前提1. 环境准备2. 了解虚拟环境 一、进入Interpreter设置页二、添加Interpreter1. 方式一2. 方式二 三、 System Interpreter四、 Pipenv Environment前提条件:详细步骤1) 选择pipenv2) 设置Base Interpreter3) 设置Pip…

必学的maven的起步

Maven的简介 maven是什么 Maven的本质是一个项目管理工具将项目开发和管理过程抽象成一个项目对象模型(POM)POM:项目对象模型 Maven的作用: 项目构建:提供标准的、跨平台的自动化项目构建方式依赖管理:方…

mingw下编译opencv4.5.2

初衷: 加载之前的模型没问题,但最近加载另一个模型时出现报错: OpenCV: terminate handler is called! The last OpenCV error is: OpenCV(4.1.0) Error: Assertion failed (nodesMapIt ! nodesMap.end()) in sortByExecutionOrder, file G…

R软件包ConsensusCluster进行共识聚类(Consensus Clustering)

从下面论文看到这个方法: Wang, Xin, et al. "Deep learning using bulk RNA-seq data expands cell landscape identification in tumor microenvironment." Oncoimmunology 11.1 (2022): 2043662. 这篇论文基于 AI 方法对 bulk RNA-seq 数据识别肿瘤微环…

qt项目-《图像标注软件》源码阅读笔记-Shape类绘图及其子类

目录 1. Shape 概览 2. Shape 基类 2.1 字段 2.2 方法 2.3 嵌套类型 3. Shape2D 2d形状纯虚基类 3.1 字段 3.2 方法 4. Shape3D 3d形状纯虚基类 5. Shape2D子类 5.1 Rectangle 矩形类 1. Shape 概览 功能:Shape类及其子类负责形状的绘制及形状的存储。…

【数据结构入门精讲 | 第十三篇】考研408、公司面试树专项练习(二)

在上一篇中我们进行了树的判断题、选择题、填空题专项练习,在这一篇中我们将进行编程题的相关练习。 目录 编程题R7-1 目录树R7-1 是否同一棵二叉搜索树R7-2 二叉搜索树的结构R7-3 平衡二叉树的根R7-1 完全二叉搜索树R7-1 修理牧场R7-2 嘴强王者R7-3 房屋分拆R7-4 动…

Qt/QML编程学习之心得:在QML中调用fileDialog(十六)

Qt中有一些内置的对话框dialog,比如 在QWidget工程中使用比较容易,比如 #include <QFileDialog>fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), "/home/jana", tr("Image Files (*.png *.jpg *.bmp)")); 那么在QM…

【LearnOpenGL基础入门——5】着色器

目录 一.简介 二.GLSL 三.数据类型 四.输入与输出 五.Uniform 六.更多属性 一.简介 着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说&#xff0c;着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立…

最新技术整理3款开源免费直播推流工具,实现实时视频推流、视频拉流,目标端可以是服务器、云平台、移动设备等(附源码)

最新技术整理3款开源免费直播推流工具&#xff0c;实现实时视频推流、视频拉流&#xff0c;目标端可以是服务器、云平台、移动设备等&#xff08;附源码&#xff09;。 什么是推流&#xff1f; 视频推流是指将实时的视频数据从一个源端发送到一个或多个目标端的过程。推流的源…

基于javaWeb的高校后勤报修系统的设计与实现论文

基于JavaWeb的高校后勤报修系统的设计与实现 摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前学校对于后勤报修信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&…

python脚本 ssh工具 ssh上传文档 选择文档并上传到ssh服务器

此文分享一个python脚本,用于快速的定位、选择文档,并将其上传到指定的ssh服务器。 效果演示 🔥完整演示效果 👇第一步,显然,我们需要选择功能 👇第二步,我们需要定位并选择需要上传的文档 👇第三步,确认我们需要上传文档的ssh服务器 👇第四步,定位、选择…

mybatis的一级缓存使用以及禁用

目录 验证代码如下 mappper 代码 xml 中代码 实际执行代码 执行结果 DefaultSqlSession CachingExecutor BaseExecutor PerpetualCache 总结 禁用一级缓存 mapper 对应的 xml 的 select 查询设置 flushCache 属性为 true MappedStatement 的内部类 Builder 向外部变…

parseInt(0.0000005)大于等于5

文章目录 一、前言二、parseInt()的神秘行为三、解决parseInt()的奥秘四、结论五、最后 一、前言 parseInt() 是 JavaScript 的内置函数&#xff0c;用于解析数字字符串中的整数。例如&#xff0c;从数字字符串中解析整数100&#xff1a; const number parseInt(100); numbe…

Netty-3-封帧

实际上&#xff0c;数据的封帧与解帧本身虽然实现起来十分简单&#xff0c;但它们在本质上仍然是数据的一种编解码。 那么它们相比之前介绍的数据编解码有什么区别呢&#xff1f;单从编码目标看&#xff0c;之前介绍的数据编解码是为了对用户的数据对象进行传输。 封帧与解帧则…

【Linux】编辑、查看和搜索文件

大多数 Linux 发行版不包含真正的 vi;而是自带一款高级替代版本&#xff0c;叫做 vim(它是“vi improved”的简写)由 Bram Moolenaar 开发的&#xff0c;vim 相对于传统的 Unix vi 来说&#xff0c;取得了实质性进步。 启动和退出 vim 使用vim可以启动&#xff0c;如命令行输…

MyBatis 通过 SqlSession 实现动态Entity批量插入

需要几个关键点: 1、entity对应的service需要继承BaseService 2、entity对应的serviceImpl需要实现baseMapper方法&#xff0c;需要把当前的mapper返回去 3、entity对应的Mapper需要BaseMapper

快速安装方式安装开源OpenSIPS和CP控制界面

OpenSIPS是目前世界上主流的两个SIP软交换引擎(其中另外一个是kamailio)或者SIP信令服务器&#xff08;个人认为是比较正确的称谓&#xff09;。关于Opensips的基础和一些参数配置和安装方式笔者在很久以前的历史文档中有非常多的介绍。最近&#xff0c;很多用户使用OpenSIPS软…

PHP案例代码:PHP如何提供下载功能?

对Web开发人员来说,“下载”功能是一个非常常见的需求。在网站中提供文件下载,通常用于提供用户手册、软件升级、音乐、视频等各种资源文件。本教程将向您介绍如何实现一个PHP下载功能,同时告诉浏览器文件名称、文件大小、文件类型,并统计下载次数。 首先,我们需要了解一些…