田薇--- 使用Fiddler 工具实现数据可视化

博客记录目标 使用编程语言和Fiddler抓包工具爬取数据,完成数据可视化展示
所在院校 福州大学至诚学院
记录者 田薇
Github 地址 https://github.com/sweetcat-w/Assignment02/tree/master

1.【基础】:使用 fiddler 抓包工具+代码,实时监控朴朴上某产品的详细价格信息。

(1) 思路描述

  • 多途径学习了解Fiddle抓包工具

    首先通过网络平台了解到Fiddle可以在电脑端及移动端App实现数据抓取,而且还支持自定义插件。这款工具以代理web服务器的形式工作,默认的端口号为8888,需要查询本机IP和移动端进行连接。之后在网络查阅了一些相关资料,通过观看哔哔哩哩(https://www.bilibili.com)上的Fiddle抓包相关视频了解了大致的操作流程。以下是我个人学习Fiddle抓包工具的视频进行分享:

    【教程】使用Fiddler抓包APP(IOS):https://www.bilibili.com/video/BV1vy4y1h7r3?spm_id_from=333.880.my_history.page.click
    Fiddler之移动端APP抓包教程:https://www.bilibili.com/video/BV13t4y1X7uN?spm_id_from=333.880.my_history.page.click

  • 安装配置Fiddle抓包工具,使用iPad作为移动端连接

    电脑端安装Fiddle抓包工具,根据配置捕获https的连接方式以及解密http通信等,iPad安装朴朴超市App作为抓取数据源。

  • 选择Python编程语言完成任务

    近些年Python大火的原因大都是因其由于爬取数组简洁好用,所以跟随趋势所向选择了这门语言来完成任务,而且Python除了配置简单同时它提供的Beautifulsoap可以快捷的处理爬取下来的文档,用少量的代码量完成处理。以下是我个人学习Python语言的视频进行分享(特别是第二个视频讲解的很清楚):

    【2021年最新录制】Python 3 爬虫、数据清洗与可视化实战:https://www.bilibili.com/video/BV1CX4y1374d?spm_id_from=333.880.my_history.page.click
    Python爬虫编程基础5天速成(2021全新合集)Python入门+数据分析:https://www.bilibili.com/video/BV12E411A7ZQ?p=1

  • 遇见的问题和解决方法

    • 使用Fiddle工具连接电脑端及移动端时出现连不上,后续发现是IPad的信任证书未打开。

    • 在使用Fiddle工具抓包时出现一直抓不上出现下图所示,解决发现是把筛选网址的选项卡填写了别的内容。

(2) 设计实现过程

  • 使用Fiddle进行数据捕获

    将电脑端与移动端成功连接,使用IPad打开朴朴超市->点击休闲零食->点击新品来了,Fiddle自动捕获进行的一系列操作。

    找到需要用到的那行捕获的信息->点击右侧Inspectors->点击Raw选项卡,可以查看未经加工的当前捕获操作的Hearder信息,我们将用Hearder信息模拟访问。Raw选项卡内容如下:

    GET:https://j1.pupuapi.com/client/marketing/storeproduct/v2/search?business=scenes&business_id=f14c37f7-3ff3-44da-a925-c2a158bf522d&category_id=f14c37f7-3ff3-44da-a925-c2a158bf522d&in_stock=-1&page=1&size=20&sort=0&store_id=7c1208da-907a-4391-9901-35a60096a3f9&tag=-1 HTTP/1.1
    Host: j1.pupuapi.com
    Authorization: BearereyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIiLCJhdWQiOiJodHRwczovL3VjLnB1cHVhcGkuY29tIiwiaXNfbm90X25vdmljZSI6IjEiLCJpc3MiOiJodHRwczovL3VjLnB1cHVhcGkuY29tIiwiZ2l2ZW5fbmFtZSI6IjE4MjU5ODkzMzg3IiwiZXhwIjoxNjQ3Njg0ODUxLCJ2ZXJzaW9uIjoiMi4wIiwianRpIjoiNDNmMjk2NTktM2NmNC00MjA3LThiZGEtNTk2ZWQwMzU4YWE4In0.v04ZcVa20uMC9HFkkLaeUG7Hv1SCpS1GaBRZhxHHIzM
    Accept: */*
    pp-userid: 43f29659-3cf4-4207-8bda-596ed0358aa8
    pp-placeid: 43effc43-4fb2-4473-92e6-8ebecc67bb7a
    X-B3-TraceId: 5396d58820e94ad0
    X-B3-SpanId: 09c64cd058a9426d
    pp-version: 2021063201
    pp-os: 20
    Accept-Language: zh-Hans-CN;q=1.0
    Accept-Encoding: gzip;q=1.0, compress;q=0.5
    mark-num: 37
    pp_storeid: 7c1208da-907a-4391-9901-35a60096a3f9
    User-Agent: Pupumall/2.9.0;iPadOS 15.3.1;3FD69868-7E1C-4BC3-88F8-7541719968B1
    Connection: keep-alive
    

    可以从下方的JSON选项卡看到所抓取到数据存放的逻辑位置:data->products->对应名称

  • 使用Python编程实现

    数据爬取-模拟浏览器向服务器发送信息,爬取网站上的数据返回数据字典(关键代码):

    # 模拟浏览器头部信息,向服务器发送信息
    headers = {     
      "pp-version": "2021063201",
      "pp-os": "20",
      "Accept": "*/*",
      "Accept-Language": "zh-Hans-CN;q=1.0",
      "Accept-Encoding": "gzip;q=1.0, compress;q=0.5",
      "pp_storeid": "7c1208da-907a-4391-9901-35a60096a3f9",
      "User-Agent": "Pupumall/2.9.0;iPadOS 15.3.1;3FD69868-7E1C-4BC3-88F8-7541719968B1",
      "Host": "j1.pupuapi.com",
      "Connection": "keep-alive",
    }
    response = requests.get(url=url,headers=headers)
    # 将json格式数据转换为字典
    jsonOld = json.loads(response.text)
    

    数据清洗-将返回的数据字典进行遍历提取想要的数据(关键代码):

    # 遍历数据字典将指定数据存入data集合中
    for item in productList:
      data = {
        'p_name' : item['name'],  # 商品名
        'p_spec' : item['spec'],  # 规格
        'p_price' : item['price']/100, # 折扣价
        'p_marketPrice' : item['market_price']/100,  # 原价、市场价
        'p_subTitle' : item['sub_title'] , # 商品信息
      }
    # 将每一行清洗后的数据添加到list中
    list.append(data)
    

    数据展示(关键代码):

    # 遍历数据字典将指定数据存入data集合中
    for item in productList:
      data = {
        'p_name' : item['name'],  # 商品名
        'p_spec' : item['spec'],  # 规格
        'p_price' : item['price']/100, # 折扣价
        'p_marketPrice' : item['market_price']/100,  # 原价、市场价
        'p_subTitle' : item['sub_title'] , # 商品信息
      }
    # 将每一行清洗后的数据添加到list中
    list.append(data)
    
  • 程序优化设计(模块化程序设计、实时更新每隔一分钟更新数据,展示不同商品的实时价格)

    最终效果展示:

    最终代码展示:

    #-*- codeing = utf-8 *-
    #@Time : 2022/3/15 20:30
    #@Author : 212106732 田薇
    #@File : demo01.py
    #@Software : PyCharm
    
    import requests,json
    import urllib3
    import datetime,time
    
    # 存放访问网址
    def main():
        url = "https://j1.pupuapi.com/client/marketing/storeproduct/v2/search?business=scenes&business_id=f14c37f7-3ff3-44da-a925-c2a158bf522d&category_id=f14c37f7-3ff3-44da-a925-c2a158bf522d&in_stock=-1&page=1&size=20&sort=0&store_id=7c1208da-907a-4391-9901-35a60096a3f9&tag=-1"
        # 每隔1分钟实时刷新
        while True:
            get(url)
            time.sleep(60)
    
    # 数据清洗
    def get(url):
        # 获得爬取后的数据字典
        jsonData = askUrl(url)
        list = []   # 用于存放数据清洗后的数据
        productList = []    # 指定数据清洗位置
        productList = jsonData['data']['products'];
        # 遍历数据字典将指定数据存入data集合中
        for item in productList:
            data = {
                'p_name' : item['name'],  # 商品名
                'p_spec' : item['spec'],  # 规格
                'p_price' : item['price']/100, # 折扣价
                'p_marketPrice' : item['market_price']/100,  # 原价、市场价
                'p_subTitle' : item['sub_title'] , # 商品信息
            }
            # 将每一行清洗后的数据添加到list中
            list.append(data)
        showData(list)  # 调用显示方法
    
    # 数据爬取(模拟浏览器爬取网站上的数据返回数据字典)
    def askUrl(url):
        try:
            headers = {     # 模拟浏览器头部信息,向服务器发送信息
                "pp-version": "2021063201",
                "pp-os": "20",
                "Accept": "*/*",
                "Accept-Language": "zh-Hans-CN;q=1.0",
                "Accept-Encoding": "gzip;q=1.0, compress;q=0.5",
                "pp_storeid": "7c1208da-907a-4391-9901-35a60096a3f9",
                "User-Agent": "Pupumall/2.9.0;iPadOS 15.3.1;3FD69868-7E1C-4BC3-88F8-7541719968B1",
                "Host": "j1.pupuapi.com",
                "Connection": "keep-alive",
            }
            response = requests.get(url=url,headers=headers)
            # 将json格式数据转换为字典
            jsonOld = json.loads(response.text)
        except error.URLError as e:
            print("请输入正确的要爬取网站")
        return jsonOld
    
    # 数据展示
    def showData(list):
        # 单个数据展示
        print("\n--------------商品:" + list[0]['p_name'] + "--------------")
        print("规格:" + list[0]['p_spec'])
        print("价格:" + str(list[0]['p_price']))
        print("原价/折扣价:" + str(list[0]['p_price']) + "/" +str(list[0]['p_marketPrice']))
        print("详细信息:" + list[0]['p_subTitle'])
        print("\n--------------实时监控朴朴超市休闲零食新品专区商品的价格波动---------------")
        # 获取当前时间
        date = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        print("当前时间为:" + date)
        # 遍历展示所有商品的信息
        i = 1
        for item in list:
            print(str(i) + "、 " + item['p_name'] + ",【价格为:" + str(item['p_price']) + "】")
            i = i+1
    
    # 调用函数
    if __name__ == '__main__':
        main()
    

(3) Git提交

  • 使用Pycharm关联Git

    File--Settings--Version_control,在下图位置填写git.ext的位置:

    配置提交Token令牌信息:

    没有令牌在GitHub设置Token生成令牌:

  • 使用Git提交Commit和Push

    Commit提交更改:

    Push上传:

    Commit列表截图:

posted @ 2022-03-19 18:59  啊甜  阅读(106)  评论(0编辑  收藏  举报