• Python采集某网站数据实现简单可视化效果, webpack Js逆向解密


    嗨喽,大家好呀~这里是爱看美女的茜茜呐

    环境使用 :

    模块使用:

    • requests --> pip install requests

    • execjs --> pip install PyExecJS

    • csv

    采集网站的数据如何去实现:

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

      • 网址: https://spa2.scrape.center/page/1

      • 数据: 影视信息

    2. 抓包分析: 分析数据具体所在位置

      • 打开开发者工具: F12

      • 刷新网页 <点击第二页>

      • 通过关键字去搜索找到对应的数据

        • 关键字 你想要获取的数据

      数据包地址: https://spa2.scrape.center/api/movie/?limit=10&offset=10&token=YjZjMjRiZTU3YWQzZTZjNjI1NDg0ODFhZDg5MGNhOGYwYmU4MGVmMiwxNjk5NzA0NTc3

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

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

    3. 解析数据 -> 提取具体数据内容

    4. 保存数据 -> 保存表格文件中

    采集数据代码

    “”“导入模块”“”

    # 导入数据请求模块 <需要安装>
    import requests
    # 导入执行JS代码模块 <需要安装>
    import execjs
    # 导入csv模块
    import csv
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    “”“保存数据”“”

    '''
    python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
    即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
    '''
    csv_file = open('data.csv', mode='w', encoding='utf-8', newline='')
    csv_writer = csv.DictWriter(csv_file, fieldnames=[
        '中文名',
        '英文名',
        '评分',
        '时长',
        '类型',
        '国家',
        '上映时间',
    ])
    csv_writer.writeheader()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    “”“读取JS代码文件”“”

    f = open('demo-1.js', encoding='utf-8').read()
    # 编译JS代码
    js_code = execjs.compile(f)
    for page in range(0, 91, 10):
        data = "/api/movie"
        # 调用JS代码函数
        token = js_code.call('i', data, page)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    """
    1. 发送请求 -> 模拟浏览器对于url地址发送请求
        安装模块:
            - win + R 输入cmd 输入安装命令 pip install 模块名
    发送请求之后, 没有得到数据:
        1. 请求网址问题
            网址中一个参数 token参数是加密的...
        2. 被反爬了
    
    分析token参数是如何生成的: JS逆向
        通过JS代码函数 传入参数 通过加密算法生成一段密文
    
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    '''
    python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
    即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
    '''
        # 模拟浏览器 <headers请求头: 字典接收数据构建完整键值对>
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
        }
        # 请求网址
        url = f'https://spa2.scrape.center/api/movie/?limit=10&offset={page}&token={token}'
        # 发送请求
        response = requests.get(url=url, headers=headers)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    “”“获取响应数据”“”

        json_data = response.json()
        # for循环遍历, 提取列表里面的元素
        for index in json_data['results']:
            dit = {
                '中文名': index['name'],
                '英文名': index['alias'],
                '评分': index['score'],
                '时长': index['minute'],
                '类型': ','.join(index['categories']),
                '国家': ','.join(index['regions']),
                '上映时间': index['published_at'],
            }
            csv_writer.writerow(dit)
            print(dit)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    一个小小的可视化

    '''
    python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
    即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
    '''
    import pandas as pd
    # 读取文件
    df = pd.read_csv('data.csv')
    print(df.head())
    # https://gallery.pyecharts.org/#/README 可视化官方文档
    
    # 导入配置项
    from pyecharts import options as opts
    # 导入饼图
    from pyecharts.charts import Pie
    # 随机生成数据
    from pyecharts.faker import Faker
    info = df['评分'].value_counts().index.to_list()
    num = df['评分'].value_counts().to_list()
    c = (
        Pie()
        .add(
            "",
            [list(z) for z in zip(info,num)
            ],
            center=["40%", "50%"],
        )
        .set_global_opts(
            # 设置标题
            title_opts=opts.TitleOpts(title="电影评分分布图"),
            legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
        )
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        # 保存可视化html文件
        .render("评分.html")
    )
    
    # ['草莓', '芒果', '葡萄', '雪梨', '西瓜', '柠檬', '车厘子'] 数据类目
    print(Faker.choose())
    # [37, 75, 29, 90, 140, 139, 131] 数据数量
    print(Faker.values())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    尾语

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

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

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

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

  • 相关阅读:
    [附源码]Python计算机毕业设计Django个性化产品服务管理系统论文
    R语言 titanic 数据挖掘作业
    『亚马逊云科技产品测评』活动征文|搭建带有“弱”图像处理功能的流媒体服务器
    【LeetCode-282】给表达式添加运算符 [难度:困难]
    长尾预测效果不好怎么办?试试这两种思路
    GNS3学习笔记
    MYSQL 表名作为变量时,必须使用 ${ }
    Flutter 没有完整的生命周期?
    websocket使用案例(前后端springboot+vue)
    自顶向下Redis分布式锁-前篇
  • 原文地址:https://blog.csdn.net/m0_72282564/article/details/134377701