mitmdump+python获取json格式响应数据写入csv文件

部署运行你感兴趣的模型镜像

        不是页面上所有的接口都可以正常调用,当接口有一些加密的参数就不行。

mitmdump的作用和fiddler一样,用于抓包,获取请求/响应等信息,但是同时它可以和python一起使用,抓包的同时执行py文件对抓包数据进行处理,比如,最常用的是获取到响应后期望将需要的数据存入csv文件中。

响应数据现在最常见的就是json格式的,json格式就是用{key:value}括起来的键值对,key用双引号,value可以是object/string/array/number/null/true/false,每个键值对之间用逗号隔开。一般来说,处理json格式数据时会将其转换成python中的列表或字典。

一/py文件编写

分析抓包出来的json格式文件,想要获取所有的user_list中user_info的某些字段信息并写入csv文件

待会再mitmdump要执行的py文件如下

import json
import csv
#函数名必须这样写 这是mitmdump规则
def parsejson(acceptjsonstring):
    # 定义一个数组,存放解析后的数据
    user_data = []
    # 将json字符串转换成python对象
    list_info = json.loads(acceptjsonstring)

    for eachuser in list_info["user_list"]:
        # 定义一个字典,存放每一个用户信息
        userdic = {}

        userdic["nickname"] = eachuser["user_info"]["nickname"]
        userdic["signature"] = eachuser["user_info"]["signature"]
        userdic["enterprise_verify_reason"] = eachuser["user_info"]["enterprise_verify_reason"]
        userdic["unique_id"] = eachuser["user_info"]["unique_id"]
        userdic["follower_count"] = eachuser["user_info"]["follower_count"]
        userdic["total_favorited"] = eachuser["user_info"]["total_favorited"]
        userdic["uid"] = eachuser["user_info"]["uid"]
        user_data.append(userdic)

    print(user_data)

    return user_data


def save_data(data, path):
    header = list(data[0].keys())  # 数据列名
    with open(path, 'a+', newline='', encoding="gb18030") as f:
        writer = csv.DictWriter(f, fieldnames=header)
        writer.writerows(data)  # 写入数据


def response(flow):
    #下面这个网址是通过fiddler获取到的 但是有些数据我们无法解密,所以需要用mitmdump捕获数据包然后做分析\

    if 'aweme/v1/web/discover/search/?' in flow.request.url:

        info_data = parsejson(flow.response.text)
        save_data(info_data, "D:/xntest/parse_data.csv")

代码解析:

  1.直接从def response(flow)开始看,第一句判断截取的请求url中是否包含

'aweme/v1/web/discover/search/?',这是我们从抓包工具或者F12抓出来的接口中查出来我们需要分析的接口中请求包含这些信息才进行解析

2. 第二句info_data = parsejson(flow.response.text)调用解析的方法,将json字符串转换成pytho对象后解析出需要的字段,先建立了一个空数组user_data=[]用于后续存放用户信息,共有6条,再遍历每一个用户信息,将所取的字段信息存入字典userdic={}中,最后返回

返回的数据格式如下:

[{'uid': '4037834391699166', 'nickname': '冷冻食品供应商南通品康', 'signature': '冷冻果蔬找品康-品质保证有担当', 'enterprise_verify_reason': '南通品康商贸有限公司', 'unique_id': '35771688NTPK', 'follower_count': 1516, 'total_favorited': 2662}, {'uid': '103848226867', 'nickname': '猪副产品 鸡 鸭冷冻批发供应商', 'signature': '主营。鸡鸭猪冷冻分割,电话18653750161微信同号。信息回复不及时请打电话或微信', 'enterprise_verify_reason': '', 'unique_id': 'zhang884699', 'follower_count': 2332, 'total_favorited': 3290}, {'uid': '4133789960770127', 'nickname': '郑州万邦冻品牛肉', 'signature': '13721432701', 'enterprise_verify_reason': '', 'unique_id': 'zgnr9999', 'follower_count': 2102, 'total_favorited': 2098}, {'uid': '3452111150654059', 'nickname': '牛肉批发', 'signature': '', 'enterprise_verify_reason': '', 'unique_id': 'dyn34xpmmego', 'follower_count': 1959, 'total_favorited': 16999}, {'uid': '103685684391', 'nickname': '南昌宏达冷冻食品商行', 'signature': '', 'enterprise_verify_reason': '', 'unique_id': '2038633993', 'follower_count': 438, 'total_favorited': 286}, {'uid': '4468868683144187', 'nickname': '沈阳国际冻品牛肉批发中心', 'signature': '沈阳于洪水产覆盖东北全境 经营有国内进口牛羊猪产品 鸡鸭鹅鱼虾 天上跑的 地下飞的 水里游的 订购热线13840370013微信同步', 'enterprise_verify_reason': '', 'unique_id': '93569657009', 'follower_count': 478, 'total_favorited': 43}]

3.第三句调用保存方法写入csv

save_data(info_data, "D:/xntest/parse_data.csv")

二/mitmdump执行检查结果

1.先在PC端使用mitmdump时需要设置网络代理,代理端口号是mitmdump端口号

2.启动mitmdump,并执行py文件

py文件存放于python安装目录的scripts下,cmd命令行进入到该目录下

注意:如果是通过安装包安装的mitmproxy,那么执行py脚本时脚本文件就放在cmd命令行的当前目录下,比如直接放在【上海】目录下

 

3.浏览要分析的网页抓取到接口,这时候在mitmdump窗口就能看到在py文件中设置的打印信息。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们参考了三个引用: 引用[1]:介绍了用Python提取JSON数据中的键值对并保存为CSV文件,提到了两种方法(标准库和pandas)。 引用[2]:展示了使用pandas读取CSV文件,然后通过循环将每行数据构造成JSON,用requests库发送POST请求。 引用[3]:提到了使用requests库下载CSV文件并保存,其中包含了headers的设置。 用户当前问题:如何使用Python调用API接口获取JSON格式数据并将其保存到CSV文件中。 根据引用,我们可以总结出以下步骤: 1. 使用requests库调用API获取JSON数据。 2. 解析JSON数据(通常是字典或列表结构)。 3. 将解析后的数据保存为CSV文件。 有两种主要方法: 方法一:使用标准库csv 方法二:使用pandas库(更简洁) 另外,需要注意: - 如果API需要认证,需要在请求头(headers)中添加认证信息(如token)。 - 如果返回的JSON是嵌套结构,可能需要先将其展平。 步骤详细说明: 方法一:使用csv模块 1. 发送HTTP请求获取JSON数据。 2. 将响应解析为Python对象(通常是字典列表)。 3. 确定CSV的列标题(即字段名)。 4. 使用csv.DictWriter将数据写入CSV文件。 方法二:使用pandas 1. 发送HTTP请求获取JSON数据。 2. 将响应解析为Python对象。 3. 使用pandas的DataFrame直接转换(如果数据是列表,可以直接转换;如果是嵌套结构可能需要处理)。 4. 调用to_csv方法保存。 我们参考引用[2]中使用了pandas来读取CSV,但我们现在是要将数据写入CSV。引用[1]也提到了pandas可以轻松实现。 因此,我们可以提供两种方法的示例代码。 另外,根据引用[3],我们需要注意设置请求头(headers)来模拟浏览器,避免被拒绝。 下面给出两种方法的示例: </think> 以下是如何使用Python调用API接口获取JSON数据并保存为CSV文件的完整步骤,结合了引用中的最佳实践: ### 方法一:使用标准库(csv + requests) ```python import csv import requests # 1. 调用API获取数据 url = "https://api.example.com/data" # 替换为实际API地址 headers = { "Authorization": "Bearer your_token", # 认证信息 "Content-Type": "application/json", # 请求头参考[^3] "User-Agent": "Mozilla/5.0" # 模拟浏览器访问 } response = requests.get(url, headers=headers) data = response.json() # 解析JSON响应体 # 2. 提取数据写入CSV with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) # 写入表头(自动提取JSON键名) if data: # 确保数据非空 headers = data[0].keys() writer.writerow(headers) # 写入数据行 for item in data: writer.writerow(item.values()) ``` ### 方法二:使用pandas库(更简洁) ```python import pandas as pd import requests # 1. 获取API数据 url = "https://api.example.com/data" headers = {"Authorization": "Bearer your_token"} # 认证参考[^2] response = requests.get(url, headers=headers) # 2. 直接转换并保存为CSV df = pd.DataFrame(response.json()) # JSON自动转DataFrame df.to_csv('api_data.csv', index=False, encoding='utf-8') # 保存参考[^1] ``` ### 关键处理技巧 1. **嵌套JSON处理**: 若JSON有嵌套结构(如`{"user": {"name": "Alice"}}`),需先展平数据: ```python # pandas方案 df = pd.json_normalize(response.json()) ``` 2. **异常处理**: ```python try: response = requests.get(url, timeout=10) response.raise_for_status() # 检查HTTP错误 except requests.exceptions.RequestException as e: print(f"API请求失败: {e}") ``` 3. **分页处理**(当数据量较大时): ```python all_data = [] page = 1 while True: params = {"page": page, "limit": 100} response = requests.get(url, params=params) page_data = response.json() if not page_data: break all_data.extend(page_data) page += 1 ``` ### 注意事项 - **认证方式**:根据API要求选择`Bearer Token`、`API Key`或`OAuth`(参考[^2]) - **数据清洗**:使用`pandas`的`fillna()`处理空值(如引用[^2]中的NaN处理) - **性能优化**:大文件建议使用`csv.DictWriter`的批量写入 - **编码问题**:中文数据需指定`encoding='utf-8-sig'`[^1] > 两种方法各有优势:标准库适合简单需求且依赖少;pandas适合处理复杂结构数据。根据实际需求选择即可[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

agrapea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值