田薇--- 使用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  啊甜  阅读(239)  评论(0)    收藏  举报