田薇--- 使用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列表截图: