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

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

环境使用:

  • Python 3.10

  • Pycharm

  • 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. 保存数据 -> 保存数据

数据采集

# 导入数据请求模块: 需要安装 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轴的数据
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()
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['总票房'])

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()

尾语

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容