文章目录
以下是实现该需求的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()
代码说明:
- IP生成逻辑:
- 使用ipaddress库生成有效公网IP
- 30%的IP来自预定义的中国IP段
- 70%的IP来自随机生成的全球公网IP
- 浏览器标识生成:
- 动态生成包含浏览器版本和操作系统的User-Agent
- 每个IP对应唯一的浏览器标识
- 请求分配:
- 保证每个IP至少1次请求
- 剩余请求随机分配到所有IP
- 日志格式:
- 包含时间戳、源IP、浏览器标识
- 随机生成请求方法、URL路径和状态码
- 包含基本的HTTP请求信息
- 性能优化:
- 使用集合保证IP唯一性
- 批量写入CSV文件
- 合理的时间生成算法
生成的数据特点:
- 包含5万个独立公网IP
- 10万条访问记录
- 符合真实世界IP分布特征
- 包含多样化的浏览器标识
- 覆盖常见HTTP请求类型
注意事项:
- 实际使用时需要完善CHINA_NETWORKS列表
- 可根据需求调整中国IP比例
- 建议分批次生成数据以避免内存问题
- 日志时间范围可以自定义修改
- 可通过多线程加速生成过程