Python3造Nginx测试数据02

文章目录

以下是实现该需求的Python代码:

import csv
import random
import datetime
import ipaddress

# 配置参数
TOTAL_IPS = 50000          # 总IP数量
TOTAL_REQUESTS = 100000    # 总请求数
SERVER_IP = '10.16.8.5'
SERVER_PORT = 80
OUTPUT_FILE = 'access_logs.csv'

# 中国IP段示例(实际使用时需要更完整的列表)
CHINA_NETWORKS = [
    ipaddress.ip_network('58.0.0.0/8'),
    ipaddress.ip_network('60.0.0.0/8'),
    ipaddress.ip_network('116.0.0.0/8'),
    ipaddress.ip_network('220.0.0.0/8'),
]

def generate_public_ip():    """生成随机公网IP"""
    while True:
        ip_int = random.randint(0x0B000000, 0xDF000000)  # 跳过私有地址段
        ip = ipaddress.IPv4Address(ip_int)
        if ip.is_global:
            return str(ip)

def generate_china_ip():
    """生成中国IP"""
    while True:
        network = random.choice(CHINA_NETWORKS)
        ip_int = int(network.network_address) + random.randint(1, network.num_addresses - 1)
        ip = ipaddress.IPv4Address(ip_int)
        if ip.is_global:
            return str(ip)

def generate_user_agent(ip):
    """生成唯一浏览器标识"""
    browser = random.choice(['Chrome', 'Firefox', 'Safari', 'Edge'])
    version = f"{random.randint(80, 94)}.{random.randint(0, 9)}.{random.randint(1000, 9999)}"
    os_list = [
        'Windows NT 10.0; Win64; x64',
        'Macintosh; Intel Mac OS X 10_15_7',
        'Linux x86_64'
    ]
    return f"Mozilla/5.0 ({random.choice(os_list)}) AppleWebKit/537.36 (KHTML, like Gecko) {browser}/{version} Safari/537.36"

def main():
    # 生成IP地址库
    ip_pool = set()
    
    # 生成30%中国IP (15000个)
    while len(ip_pool) < int(TOTAL_IPS * 0.3):
        ip = generate_china_ip()
        ip_pool.add(ip)
    
    # 生成剩余全球IP
    while len(ip_pool) < TOTAL_IPS:
        ip = generate_public_ip()
        ip_pool.add(ip)
    
    ip_list = list(ip_pool)
    random.shuffle(ip_list)
    
    # 分配User-Agent
    ip_agents = {ip: generate_user_agent(ip) for ip in ip_list}
    
    # 分配请求次数 (保证每个IP至少1次)
    request_counts = {ip: 1 for ip in ip_list}
    remaining = TOTAL_REQUESTS - TOTAL_IPS
    for _ in range(remaining):
        ip = random.choice(ip_list)
        request_counts[ip] += 1
    
    # 生成访问日志
    with open(OUTPUT_FILE, 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(['timestamp', 'source_ip', 'user_agent', 'method', 'url', 'status_code'])
        
        # 时间范围(最近1年)
        start_time = datetime.datetime.now() - datetime.timedelta(days=365)
        end_time = datetime.datetime.now()
        
        # 请求参数
        methods = ['GET', 'POST', 'HEAD']
        paths = ['/', '/api/data', '/search', '/user/profile']
        status_codes = [200, 200, 200, 404, 500, 503]
        
        for ip in ip_list:
            for _ in range(request_counts[ip]):
                # 生成随机时间戳
                delta = random.randint(0, 365*86400)
                timestamp = (start_time + datetime.timedelta(seconds=delta)).isoformat()
                
                # 构造请求信息
                method = random.choice(methods)
                path = random.choice(paths)
                query = f"?id={random.randint(1000,9999)}" if random.random() > 0.7 else ""
                url = f"http://{SERVER_IP}:{SERVER_PORT}{path}{query}"
                status = random.choice(status_codes)
                
                writer.writerow([
                    timestamp,
                    ip,
                    ip_agents[ip],
                    method,
                    url,
                    status
                ])

if __name__ == '__main__':
    main()

代码说明:

  1. IP生成逻辑
  • 使用ipaddress库生成有效公网IP
  • 30%的IP来自预定义的中国IP段
  • 70%的IP来自随机生成的全球公网IP
  1. 浏览器标识生成
  • 动态生成包含浏览器版本和操作系统的User-Agent
  • 每个IP对应唯一的浏览器标识
  1. 请求分配
  • 保证每个IP至少1次请求
  • 剩余请求随机分配到所有IP
  1. 日志格式
  • 包含时间戳、源IP、浏览器标识
  • 随机生成请求方法、URL路径和状态码
  • 包含基本的HTTP请求信息
  1. 性能优化
  • 使用集合保证IP唯一性
  • 批量写入CSV文件
  • 合理的时间生成算法

生成的数据特点:

  • 包含5万个独立公网IP
  • 10万条访问记录
  • 符合真实世界IP分布特征
  • 包含多样化的浏览器标识
  • 覆盖常见HTTP请求类型

注意事项:

  1. 实际使用时需要完善CHINA_NETWORKS列表
  2. 可根据需求调整中国IP比例
  3. 建议分批次生成数据以避免内存问题
  4. 日志时间范围可以自定义修改
  5. 可通过多线程加速生成过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

韩公子的Linux大集市

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

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

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

打赏作者

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

抵扣说明:

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

余额充值