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

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


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

环境使用:

  • 版 本: 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.textprint('密文数据: ', 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 Fakerc = (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 Barc = (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.mzph.cn/news/241260.shtml

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

相关文章

【Git】在 IDEA 中合并多个 commit 为一个

文章目录 1 未提交到远程分支1.1 需求说明1.2 reset 操作1.3 再次 push 2 已经提交到远程分支2.1 需求说明2.2 rebase 操作2.3 强制 push 分两种情况: 一种是本地提交还没推到远程,这种好处理另一种是已经提交到远程分支,这个略麻烦 1 未提…

【接口测试】Postman(三)-变量与集合

一、变量 ​ 变量这个概念相信大家都不陌生,因此在这里我们不介绍了。主要说一下在Postman中有哪几类变量,主要包括以下四类: Global(全局) Environment(环境) Local(本地&#xf…

Linux中安装Maven3.6.1

一、安装及配置maven 1.下载maven安装包 首先需要切换到自己需要安装的目录 我自己是把配置都放到了:/usr/local/maven路径下 cd /usr/local/maven 下载maven安装包: wget https://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven…

FreeRTOS信号量学习

目录 一、信号量的特性 1. 信号量的常规操作 2. 信号量跟队列的对比 3. 两种信号量的对比 4. 信号量函数 4.1 创建 4.2 删除 4.3 give/take 5. 使用二进制信号量来同步 6. 防止数据丢失 7. 使用计数型信号量 队列(queue)可以用于传输数据:在任务之间、任务和…

Linux多线程:线程池(单例),读写锁

目录 一、线程池(单例模式)1.1 makefile1.2 LockGuard.hpp1.3 log.hpp1.4 Task.hpp1.5 Thread.hpp1.6 ThreadPool.hpp1.7 main.cc 二、STL,智能指针和线程安全2.1 STL中的容器是否是线程安全的?2.2 智能指针是否是线程安全的? 三、其他常见的各种锁四、…

dockerfile ENTRYPOINT 执行.sh脚本提示找不到文件或文件不存在 No such file or directory

我这里记录的是我遇到的一种特殊情况,如果你也遇到了这个问题,且都试了在百度中找到的解决方法还没有解决可以看看是不是和我遇到的问题一样。 在Dockerfile中,我ADD了两个文件,一个是jar包,一个是一个执行jar包的.sh…

proto与json的互相转换

proto与json的互相转换 proto使用proto python dict和messagepython message序列化golangmessage序列化message转json proto使用 生成逻辑请参考 https://blog.csdn.net/qq_43645782/article/details/127112663 proto syntax "proto3";message testRequest {stri…

微服务之配置中心与服务跟踪

zookeeper 配置中心 实现的架构图如下所示,采取数据加载到内存方式解决高效获取的问题,借助 zookeeper 的节点监听机制来实现实时感知。 配置中心数据分类 事件调度(kafka) 消息服务和事件的统一调度,常用用 kafka …

c语言突击函数

函数 1.函数:是具有一定功能的程序块,是c语言的基本组成单位 2.函数的定义:[函数类型] 函数名 (形式参数) 函数不可以嵌套定义,但是可以嵌套调用 3.函数名缺省返回值,默认int; 4…

使用Java语言中的算法输出杨辉三角形

一、算法思想 创建一个名为YanghuiTest的类,然后创建二维数组,然后遍历二维数组的第一层,然后初始化第二层数组的大小,然后遍历第二层数组,然后将两侧的数组元素赋为1,然后其它数值通过公式计算,最后可以输…

Leetcode—1099.小于K的两数之和【简单】Plus

2023每日刷题&#xff08;六十八&#xff09; Leetcode—1099.小于K的两数之和 实现代码 class Solution { public:int twoSumLessThanK(vector<int>& nums, int k) {int n nums.size();int left 0, right n - 1;int sum 0;int ans 0;sort(nums.begin(), nums…

学堂云《信息检索与科技写作》单元测试考核答案

注&#xff1a;不含主观题 第1题 判断题 (1分) 信息检索与科技写作课程分别在工科、理科和文科三个大学科方向上进行了有针对性地开设。 正确答案&#xff1a; 对 第2题 多选题 (2分) 为什么要强调“检索”&#xff1f; A 信息爆炸B 文献浩如烟海C 提高效率D 科技迅…

讲座思考 | 周志华教授:新型机器学习神经元模型的探索

12月22日&#xff0c;有幸听了南京大学周志华教授题为“新型机器学习神经元模型的探索”的讲座。现场热闹非凡&#xff0c;大家像追星一样拿着“西瓜书”找周教授签名。周教授讲得依旧循循善诱&#xff0c;由浅入深&#xff0c;听得我很入迷&#xff0c;故作此记。 周教授首先就…

conda环境下module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘问题解决

1 问题描述 在pycharm下&#xff0c;使用conda环境运行模型程序&#xff0c;调用matplotlib绘制图形&#xff0c;出现如下错误&#xff1a; Traceback (most recent call last):File "D:\code\cv\vgg16_cifar10.py", line 173, in <module>plt.xlabel(times)…

LRU 是什么?如何实现? 什么是堆内存?参数如何设置?

文章目录 LRU 是什么&#xff1f;如何实现&#xff1f;什么是堆内存&#xff1f;参数如何设置&#xff1f; LRU 是什么&#xff1f;如何实现&#xff1f; 最近最少使用策略 LRU&#xff08;Least Recently Used&#xff09;是一种缓存淘汰算法&#xff0c;是一种缓存淘汰机制。…

天文与计算机:技术的星辰大海

天文与计算机&#xff1a;技术的星辰大海 一、引言 在人类的历史长河中&#xff0c;天文学与计算机技术这两个领域似乎相隔甚远&#xff0c;然而在科技的推动下&#xff0c;它们却逐渐走到了一起&#xff0c;为人类对宇宙的探索开辟了新的道路。天文观测的复杂度与数据量随着…

【数据结构】最短路径算法实现(Dijkstra(迪克斯特拉),FloydWarshall(弗洛伊德) )

文章目录 前言一、Dijkstra&#xff08;迪克斯特拉&#xff09;1.方法&#xff1a;2.代码实现 二、FloydWarshall&#xff08;弗洛伊德&#xff09;1.方法2.代码实现 完整源码 前言 最短路径问题&#xff1a;从在带权有向图G中的某一顶点出发&#xff0c;找出一条通往另一顶点…

VUE前端导出文件之file-saver插件

VUE前端导出文件之file-saver插件 安装 npm install file-saver --save # 如使用TS开发&#xff0c;可安装file-saver的TypeScript类型定义 npm install types/file-saver --save-dev如果需要保存大于 blob 大小限制的非常大的文件&#xff0c;或者没有 足够的 RAM&#xff0…

Linux创建macvlan 测试bridge、private和vepa模式

Linux创建macvlan&#xff0c;测试bridge、private和vepa模式 最近在看Docker的网络&#xff0c;看到关于macvlan网络的介绍。查阅了相关资料&#xff0c;记录如下。 参考 1.Linux Macvlan 2.图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN 环境 操…

Vue如何请求接口——axios请求

1、安装axios 在cmd或powershell打开文件后&#xff0c;输入下面的命令 npm install axios 可在项目框架中的package.json中查看是否&#xff1a; 二、引用axios import axios from axios 在需要使用的页面中引用 三、get方式使用 get请求使用params传参,本文只列举常用参数…