Python调用API接口清洗数据推送Kafka案例脚本

7 篇文章 2 订阅
5 篇文章 0 订阅
本文介绍了如何使用Python的requests库发起API请求,获取数据后,对数据进行处理,如修改字段,然后通过Kafka异步发送到特定主题。作者还展示了如何配置Kafka参数和发送数据到Kafka的详细步骤。
摘要由CSDN通过智能技术生成
import requests
#引入需要的库文件,requests处理API连接请求
import json
#引入json库做数据处理
from kafka import KafkaProducer
#引入kafka库,调用生产者向kafka发送数据
from kafka.errors import KafkaError
#引入kafka异常库


# Kafka配置
kafka_server = '192.168.111.111:8008'  # 替换为您的Kafka服务器地址和端口
kafka_topic = 'CMDB-DATA-TEST'  # 替换为您的Kafka主题名称

# 设定每页的大小
page_size = 1000

url = "http://192.168.129.111:8081/AIPAA/CMDB/303011"
headers = {
    "Content-Type": "application/json",
}
#根据实际情况配置API接口

# 首先请求一次以获取总数据量
initial_data = {"pageNo": "1", "pageSize": str(page_size), "templateCode": "BpAppSystem_Other_ALL", "token": "acess-token=eyJh..."}
#API接口参数,根据实际情况修改参数

initial_response = requests.post(url, headers=headers, json=initial_data)
#初始化请求返回的数据,将返回值先给到initial_response保存起来
total = initial_response.json()['esbData']['content']['content']['total']
#根据实际情况提取数据字段,这里根据返回数据提取total的值

# 计算总页数
total_pages = -(-total // page_size)
#这里要考虑做向上取整

# 函数用于异步发送数据到Kafka
#def send_to_kafka(data):
#    message = json.dumps(data, ensure_ascii=False)
#    command = f"echo '{message}' | /data/app/kafka/bin/kafka-console-producer.sh --bootstrap-server {kafka_server} --topic {kafka_topic} &"
#    subprocess.run(command,shell=True,check=True)#逐条发送
#    subprocess.Popen(command, shell=True)#异步发送
#使用subprocess库推送数据到kafka会受到kafka所在主机性能影响,经实际验证,并不是最优的解决方案,因此无需考虑该部分实现方式。
    
def send_to_kafka(bootstrap_servers, kafka_topic, messages):
#定义实现方法,KafkaProducer要求传入kafka连接信息、topic信息以及数据这三个参数,参数名称可以自定义,与代码前面的定义保持一致即可。
    """
    发送数据到 Kafka 主题

    Parameters:
        bootstrap_servers (str): Kafka 服务器地址
        topic (str): Kafka 主题
        messages (list): 包含要发送的数据消息的列表
    """
    # 创建 Kafka 生产者
    producer = KafkaProducer(bootstrap_servers=kafka_server)
    for message in messages:
        try:
            # 发送数据到 Kafka 主题,并等待发送结果
            # message=str(message)
            future = producer.send(topic, value=message.encode('utf-8'))
            future.get(timeout=10)  # 等待发送完成或超时
            #print(message)
            # print(f"Message sent to Kafka topic: {topic}")

        except KafkaError as e:
            # 处理发送过程中的 Kafka 错误
            print(f"Error sending message to Kafka: {e}")

    # 关闭 Kafka 生产者连接
    producer.close()

# 循环请求每一页
for page_no in range(1, total_pages + 1):
    data = {"pageNo": str(page_no), "pageSize": str(page_size), "templateCode": "GetBpAppSystem_Other_ALL", "token": "acess-token=eyJh..."}
    
    response = requests.post(url, headers=headers, json=data)
    data_content = response.json()['esbData']['content']['content']
    #这里需要对数据中的数据做提取处理,我需要拿到['esbData']['content']['content']中的数据,实际情况根据API的返回不同,这里需要自定义更改
    
    # 对content下的data键中的每个条目进行修改
    for item in data_content.get('data', []):
        new_data = []#每次循环清空上一次的数据
        copied_data = []#每次循环清空上一次的数据
        #初始化两个空数组

        # 复制原始条目
        copied_item = item.copy()
        #根据实际需要,我需要将原始数据复制一份,修改格式后输出

        # 对原始条目进行修改
        if 'hostName' in item:
            item['ciName'] = item['secondApp']
        new_data = {
            "content": item,
            "completed": 0,
            "modelId": "Bussiness",
            "accountId": 110,
            "userId": 3,
            "tenantId": 110,
            "sourceName": "AAA",
            "actionType": "UPSET",
            "exceptions": []
        }#配置数据的输出格式,需要根据实际应用场景去调整和修改

        # 对复制的条目进行进一步的修改
        copied_item['modelId'] = item.get('relentry', '')
        if item.get('relentry') == "K8s命名空间":
            copied_item['modelId'] = "K8s_Namespace"
        copied_item['ciName'] = item.get('hostName', '')
        copied_item['reluseFor'] = item.get('reluseFor', '')
        copied_item['relinstId'] = item.get('relinstId', '')
        copied_item['relciStatus'] = item.get('relciStatus', '')
        copied_item['relationSystem'] = [{
            "modelId":"Business",
            "uniFields":{
                "instId":copied_item.get('instId','')
            }
        }]#引用时需要指定modelId和被引用模型的唯一约束
        
        copied_data = {
            "content": copied_item,
            "completed": 0,
            "modelId": copied_item['modelId'],
            "accountId": 110,
            "userId": 3,
            "tenantId": 110,
            "sourceName": "DOCC",
            "actionType": "UPSET",
            "exceptions": []
        }

        # 异步发送数据到Kafka
        #send_to_kafka(new_data)
        #send_to_kafka(copied_data)
        #以上输出方式为subprocess库的实现方式,无需考虑


        send_to_kafka(kafka_server,kafka_topic,new_data)
        send_to_kafka(kafka_server,kafka_topic,copied_data)
        #print(json.dumps(new_data,ensure_ascii=False))
        #print(json.dumps(copied_data,ensure_ascii=False))
        #调用代码send_to_kafka方法做输出,将处理好格式的数据发送给kafka即可。
# 代码结束

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是二狗诶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值