Написал: rand
Уникально для: xss.pro
Всем привет, не так давно я проявил активность в этом топике: https://xss.pro/threads/122310/ , и мне уже поднадоело в ПМ отвечать как это сделать. Это мультипроцессорный генератор фейковых строк, частично используется библиотека faker и вводные которые я задал (Почему не использовал полностью? Потому-что очень много совпадений и дублей генерит фейкер если строк требуется много, как в именах так и т.д., пришлось расширить диапазон рандомизации и сделать строки более правдоподобнее).
Формат строк:
Перед запуском ставим библиотеки:
Под Италию:
Под Испанию:
Уникально для: xss.pro
Всем привет, не так давно я проявил активность в этом топике: https://xss.pro/threads/122310/ , и мне уже поднадоело в ПМ отвечать как это сделать. Это мультипроцессорный генератор фейковых строк, частично используется библиотека faker и вводные которые я задал (Почему не использовал полностью? Потому-что очень много совпадений и дублей генерит фейкер если строк требуется много, как в именах так и т.д., пришлось расширить диапазон рандомизации и сделать строки более правдоподобнее).
Формат строк:
Код:
Dott. Teresa Novaro/sanguinetisimonetta@tin.it/Bocenago/50.34.246.179
Dott. Paoletta Parpinel/xmorabito@virgilio.it/Giuliano Di Lecce/153.160.84.95
Michelotto Zito/calgariamalia@fastwebnet.it/Quattro Castella/98.12.70.87
Ermes Vattimo-Bompiani/gaspare51@poste.it/Salaparuta/155.233.251.224
Girolamo Prodi/giuliettaudinesi@virgilio.it/Solarino/239.140.189.253
Cassandra Rosiello/flaianovincenzo@alice.it/San Giacomo Di Spoleto/10.215.32.156
Vanessa Cesaroni/carmelo32@alice.it/Roraipiccolo/227.224.170.181
Maura Mercadante/conteludovico@tin.it/San Giorgio Della Richinvelda/112.61.44.170
Giuliana Rossetti/damianogonzaga@vodafone.it/Is Murdegus/156.253.48.96
Leonardo Schiavone/silvio63@virgilio.it/Piazza Del Galdo/68.42.159.62
Donatello Polesel/marta44@poste.it/Vezza D'Oglio/135.157.40.240
Angelo Chigi/napoleonecomeriato@virgilio.it/Budrie/77.28.147.237
Liliana Guidotti/ynicolini@fastwebnet.it/San Giacomo Roncole/108.69.232.28
Aurora Cammarata/nosigliasergius@poste.it/Ischia Ponte/252.125.118.59
Licia Colletti/xtamborini@alice.it/Garbagnate Monastero/163.149.79.234
Gian Tutino/qcasaleggio@vodafone.it/Denice/159.152.52.28
Stella Tosi-Serraglio/halfonsi@virgilio.it/Gazzada Schianno/177.33.104.102
Fernanda Staglieno/paulinaschiaparelli@tin.it/Nasidi/122.54.56.12
Sig.ra Milena Saragat/ugo85@poste.it/Torri Del Benaco/133.24.49.250
Dott. Milena Briccialdi/marcantonio17@libero.it/Casatenovo/174.111.142.188
Flora Barozzi/yricciardi@vodafone.it/Montegiordano Marina/26.74.230.105
Claudia Ferraris-Verdone/dpisani@virgilio.it/Figline Di Prato/234.237.0.201
Luigina Pizzo-Bossi/fmontanari@libero.it/Canonica D'Adda/10.57.145.77
Marta Sgarbi-Brunello/anitaalighieri@fastwebnet.it/Sciconi/109.155.223.64
Pierina Trincavelli-Ferraris/auroratrapani@tim.it/Corfinio/37.221.146.217
Romina Ossani/mazzacuratipina@vodafone.it/Nicosia/129.127.53.129
Pierina Deledda/baccio68@tin.it/Vighignolo/79.179.200.241
Roberto Munari-Solari/stefanoalighieri@vodafone.it/Serbadone/132.52.83.120
Licia Collodi/salandramaurilio@tin.it/Sutri/97.198.115.250
Germana Vespucci/guidomercadante@tin.it/Casinalbo/85.22.23.93
Romana Columbo/stefaniabriccialdi@fastwebnet.it/Castelbellino/89.238.204.173
Dott. Dolores Battisti/hpertile@libero.it/Canalicchio/173.190.108.109
Raffaella Biagiotti/vanessamazzanti@tim.it/San Nicandro Garganico/145.220.205.56
Azeglio Endrizzi/oariasso@tin.it/Niscemi/83.111.120.46
Etta Donati/cardanogustavo@poste.it/Budrione/90.109.207.243
Silvio Camuccini/virgilio41@libero.it/Pedalino/45.196.75.29
Danilo Campise/cilibrasierika@alice.it/Arcisate/211.187.249.215
Dott. Bianca Mennea/mduodo@virgilio.it/Occimiano/29.102.219.171
Raffaello Tamburini/manacordafabrizia@virgilio.it/Casumaro/8.95.40.13
Massimiliano Guglielmi/giannatorricelli@poste.it/La Muddizza/208.216.64.5
Danilo Almagià/ovalentino@tin.it/San Nicola/168.27.112.98
Ezio Gibilisco-Vigorelli/graziella45@alice.it/Carro/208.64.122.168
Ida Ruberto/ealfieri@libero.it/Cerreto Castello/236.232.212.218
Adele Montecchi/sabatino98@virgilio.it/Montabone/36.138.27.131
Paola Ferragamo-Gozzi/buscettagiulia@fastwebnet.it/Viadanica/133.199.141.213
Sylvia Lattuada-Bonolis/gorigreco@tim.it/San Vito Al Torre/204.218.9.34
Dott. Ivo Corradi/volterrastefania@libero.it/Bellizzi Irpino/173.71.237.187
Sig. Alessio Maggioli/giacobbecabibbo@tin.it/Clivio/21.159.179.146
Ernesto Altera/puccimaurilio@alice.it/Carditello/128.25.241.155
Patrizio Micheletti/kpriuli@alice.it/Tegoleto/64.145.145.15
Gian Traversa/marialeonardi@tin.it/Porto Valtravaglia/108.244.255.37
Flavio Serao/landolancisi@tim.it/Matierno/128.126.213.41
Sig.ra Martina Cugia/lazzaromantegna@alice.it/Belmonte Calabro Marina/100.111.229.255
Claudia Gottardi/isabellaluria@fastwebnet.it/Cusio/130.128.198.6
Telemaco Miniati/mpometta@libero.it/Apricale/202.239.109.246
Isa Salgari/gianmarcogermano@libero.it/San Patrizio/119.244.95.106
Durante Morandi-Beffa/liviabelletini@vodafone.it/Bernalda/64.4.198.200
Gianluca Branciforte-Traversa/pomponio23@vodafone.it/Druento/1.177.49.56
Marisa Agnesi/pasqualacerbi@libero.it/Su Cossu/165.95.182.48
Перед запуском ставим библиотеки:
Bash:
pip install colorlog
pip install faker
Под Италию:
У вас должно быть более 25 реакций для просмотра скрытого контента.
Python:
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
from faker import Faker
import ipaddress
import os
import logging
from itertools import islice
import time
from colorlog import ColoredFormatter
import random
import string
# Настройка цветного логирования
formatter = ColoredFormatter(
"%(log_color)s%(asctime)s - %(levelname)s - %(message)s",
datefmt=None,
reset=True,
log_colors={
'DEBUG': 'bold_black',
'INFO': 'bold_green',
'WARNING': 'yellow',
'ERROR': 'bold_red',
'CRITICAL': 'bold_purple'
}
)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[handler, logging.FileHandler("generation_log.txt")]
)
# Список известных диапазонов IP Италии
italian_ip_ranges = [
'2.32.0.0/13', '2.40.0.0/13', '2.112.0.0/14', '2.116.0.0/14', '2.120.0.0/13',
'2.128.0.0/14', '2.160.0.0/13', '5.90.0.0/15', '5.94.0.0/15', '5.144.0.0/14',
'5.160.0.0/14', '5.168.0.0/14', '5.200.0.0/13', '5.249.128.0/17', '31.0.0.0/13',
'31.8.0.0/13', '31.16.0.0/13', '31.32.0.0/12', '37.0.0.0/12', '37.160.0.0/11',
'46.16.0.0/13', '46.24.0.0/13', '46.32.0.0/12', '46.48.0.0/13', '46.128.0.0/11',
'62.18.0.0/15', '62.48.0.0/13', '62.56.0.0/13', '62.94.0.0/15', '62.149.0.0/16',
'77.72.0.0/15', '77.80.0.0/12', '77.208.0.0/12', '78.12.0.0/14', '78.24.0.0/13',
'79.0.0.0/13', '79.8.0.0/13', '79.16.0.0/12', '80.18.0.0/15', '80.20.0.0/15',
'80.88.0.0/15', '80.180.0.0/14', '80.184.0.0/14', '80.240.0.0/13', '80.245.0.0/16',
'82.48.0.0/12', '82.56.0.0/13', '82.104.0.0/13', '82.112.0.0/13', '82.184.0.0/13',
'82.220.0.0/14', '83.103.0.0/16', '84.18.0.0/16', '85.37.0.0/16', '85.38.0.0/16',
'87.0.0.0/12', '88.32.0.0/12', '88.48.0.0/12', '89.96.0.0/14', '89.100.0.0/14',
'89.104.0.0/13', '89.110.0.0/16', '89.186.0.0/15', '89.207.240.0/21', '89.250.64.0/18',
'151.12.0.0/14', '151.24.0.0/14', '151.28.0.0/14', '151.32.0.0/12', '151.48.0.0/12',
'151.64.0.0/11', '151.96.0.0/11', '151.144.0.0/12', '151.160.0.0/13', '151.168.0.0/13',
'151.12.0.0/14', '151.24.0.0/14', '151.28.0.0/14', '151.32.0.0/12', '151.48.0.0/12',
'151.64.0.0/11', '151.96.0.0/11', '151.144.0.0/12', '151.160.0.0/13', '151.168.0.0/13',
'151.176.0.0/12', '176.200.0.0/13', '176.204.0.0/14', '176.208.0.0/13', '176.240.0.0/12',
'178.239.64.0/18', '185.3.128.0/18', '185.18.128.0/22', '185.21.208.0/22', '185.28.68.0/22',
'185.34.160.0/22', '185.35.156.0/22', '185.46.112.0/22', '185.52.192.0/22', '185.53.16.0/22',
'185.73.64.0/22', '185.85.44.0/22', '185.86.28.0/22', '185.86.48.0/22', '185.103.84.0/22',
'185.140.124.0/22', '185.142.48.0/22', '185.147.160.0/22', '185.148.72.0/22', '185.160.164.0/22',
'188.8.0.0/13', '188.12.0.0/14', '188.14.0.0/15', '188.216.0.0/13', '188.220.0.0/14',
'188.152.0.0/14', '192.76.192.0/18', '193.206.0.0/16', '194.20.0.0/16', '194.106.192.0/18',
'194.116.224.0/19', '194.244.0.0/15', '195.62.192.0/19', '195.103.64.0/19', '213.21.128.0/18'
]
# Расширенный список провайдеров электронной почты
email_providers = [
# Итальянские провайдеры
'tim.it', 'libero.it', 'virgilio.it', 'tiscali.it', 'fastwebnet.it', 'alice.it', 'tin.it',
'email.it', 'poste.it', 'vodafone.it', 'wind.it', 'hotmail.it', 'outlook.it', 'yahoo.it',
'gmail.it',
# Международные провайдеры
'gmail.com', 'yahoo.com', 'outlook.com', 'hotmail.com', 'protonmail.com', 'icloud.com',
'aol.com', 'zoho.com', 'gmx.com', 'yandex.com', 'mail.com', 'inbox.com',
'fastmail.com', 'tutanota.com', 'hushmail.com', 'me.com'
]
# Расширенные списки итальянских мужских имен
extra_italian_male_names = [
'Luca', 'Giuseppe', 'Marco', 'Antonio', 'Giovanni', 'Roberto', 'Stefano', 'Mario',
'Francesco', 'Paolo', 'Matteo', 'Andrea', 'Alessandro', 'Vincenzo', 'Fabio', 'Giorgio',
'Federico', 'Davide', 'Simone', 'Leonardo', 'Michele', 'Alberto', 'Pietro', 'Emanuele',
'Carlo', 'Lorenzo', 'Enrico', 'Salvatore', 'Claudio', 'Daniele', 'Nicola', 'Maurizio',
'Domenico', 'Gabriele', 'Massimo', 'Cristiano', 'Riccardo', 'Raffaele', 'Angelo', 'Tommaso',
'Giulio', 'Alessio', 'Fabrizio', 'Sergio', 'Gennaro', 'Valerio', 'Filippo', 'Giacomo'
]
# Расширенные списки итальянских женских имен
extra_italian_female_names = [
'Maria', 'Giulia', 'Francesca', 'Anna', 'Sara', 'Alessandra', 'Valentina', 'Elisa',
'Martina', 'Chiara', 'Silvia', 'Elena', 'Federica', 'Stefania', 'Laura', 'Simona',
'Angela', 'Patrizia', 'Claudia', 'Giovanna', 'Roberta', 'Daniela', 'Antonella', 'Rita',
'Alessia', 'Marina', 'Ilaria', 'Lucia', 'Monica', 'Cristina', 'Barbara', 'Gabriella',
'Serena', 'Veronica', 'Sonia', 'Paola', 'Vittoria', 'Gloria', 'Beatrice', 'Caterina',
'Teresa', 'Isabella', 'Maria Teresa', 'Luisa', 'Renata', 'Raffaella', 'Giada', 'Fabiola'
]
# Расширенные списки итальянских фамилий
extra_italian_surnames = [
'Rossi', 'Russo', 'Ferrari', 'Esposito', 'Bianchi', 'Romano', 'Colombo', 'Ricci', 'Marino',
'Greco', 'Bruno', 'Gallo', 'Conti', 'De Luca', 'Costa', 'Giordano', 'Mancini', 'Rizzo',
'Lombardi', 'Moretti', 'Barbieri', 'Fontana', 'Santoro', 'Mariani', 'Rinaldi', 'Caruso',
'Ferraro', 'Galli', 'Martini', 'Leone', 'Longo', 'Gentile', 'Martinelli', 'Vitale', 'Lombardo',
'Serra', 'Angelo', 'Amato', 'Pellegrini', 'Monti', 'Coppola', 'Ricciardi', 'Ferri',
'Sartori', 'Piazza', 'Marchetti', 'Ruggiero', 'De Santis', 'Palmieri', 'Sorrentino', 'Orlando'
]
def generate_italian_ip():
"""Генерирует случайный IP-адрес из испанских диапазонов"""
chosen_range = random.choice(italian_ip_ranges)
network = ipaddress.ip_network(chosen_range)
random_ip = str(network[random.randint(0, network.num_addresses - 1)])
return random_ip
# Заменяем функцию generate_ip на generate_italian_ip
def generate_ip(fake):
return generate_italian_ip()
def modify_name(name):
"""Функция для случайной модификации имени"""
if random.random() < 0.1: # 10% шанс модификации
modification = random.choice(['add', 'remove', 'replace'])
if modification == 'add':
position = random.randint(0, len(name))
name = name[:position] + random.choice(string.ascii_lowercase) + name[position:]
elif modification == 'remove' and len(name) > 3:
position = random.randint(0, len(name) - 1)
name = name[:position] + name[position + 1:]
elif modification == 'replace' and len(name) > 0:
position = random.randint(0, len(name) - 1)
name = name[:position] + random.choice(string.ascii_lowercase) + name[position + 1:]
return name
def generate_name(fake, gender=None):
if gender is None:
gender = random.choice(['male', 'female'])
if random.random() < 0.6: # 60% случаев используем Faker
if gender == 'male':
first_name = fake.first_name_male()
else:
first_name = fake.first_name_female()
else: # 40% случаев используем наши списки
if gender == 'male':
first_name = random.choice(extra_italian_male_names)
else:
first_name = random.choice(extra_italian_female_names)
last_name1 = random.choice(extra_italian_surnames)
# last_name2 = random.choice(extra_spanish_surnames) # Закоментировано, использовать если в случае как с Испанией использовалась двойная фамилия
# full_name = f"{first_name} {last_name1} {last_name2}" # Под двойную фамилию
full_name = f"{first_name} {last_name1}"
# Применяем модификацию
full_name = ' '.join(modify_name(name) for name in full_name.split())
return full_name, gender
def generate_random_username():
"""Генерирует случайное имя пользователя для email"""
types = ['word', 'name_based', 'alphanum']
choice = random.choice(types)
if choice == 'word':
return ''.join(random.choice(string.ascii_lowercase) for _ in range(random.randint(5, 10)))
elif choice == 'name_based':
return f"{random.choice(['usuario', 'cliente', 'miembro'])}{random.randint(100, 9999)}"
else: # alphanum
letters = ''.join(random.choice(string.ascii_lowercase) for _ in range(random.randint(3, 7)))
numbers = ''.join(random.choice(string.digits) for _ in range(random.randint(2, 4)))
return f"{letters}{numbers}"
def generate_email(fake, full_name):
if random.random() < 0.6: # 60% случаев используем имя и фамилию
names = full_name.lower().split()
local_part = f"{names[0]}.{names[-1]}{random.randint(1, 9999)}"
else: # 40% случаев используем случайное имя пользователя
local_part = generate_random_username()
local_part = ''.join(c for c in local_part if c.isalnum() or c in ['.', '_', '-'])[:30] # Ограничиваем длину
domain = random.choice(email_providers)
return f"{local_part}@{domain}"
def generate_data(fake):
full_name, gender = generate_name(fake)
email = generate_email(fake, full_name)
city = fake.city()
ip = generate_ip(fake)
#return f"{full_name}/{email}/{city}/{ip}/{gender}\n" # Строка которая возвращает гендер
return f"{full_name}/{email}/{city}/{ip}\n"
def write_to_file(file_name, data_chunk):
with open(file_name, 'a', encoding='utf-8') as file:
file.writelines(data_chunk)
def generate_and_write_data(fake, num_records, num_threads, file_name, chunk_size=10_000):
logging.info(f"Начало генерации данных для файла {file_name}")
start_time = time.time()
with ThreadPoolExecutor(max_workers=num_threads) as executor:
for i in range(0, num_records, chunk_size):
# Обрабатываем только количество оставшихся записей
data_chunk = executor.map(lambda _: generate_data(fake), range(min(chunk_size, num_records - i)))
write_to_file(file_name, data_chunk)
elapsed_time = time.time() - start_time
logging.info(f"Файл {file_name} успешно создан. Время генерации: {elapsed_time:.2f} секунд.")
def process_task(process_id, records_per_file, num_threads):
fake = Faker('es_ES') # Используем испанскую локаль
file_name = f"italian_data_{process_id}.txt"
logging.info(f"Процесс {process_id} начал генерацию файла {file_name}")
start_time = time.time()
generate_and_write_data(fake, records_per_file, num_threads, file_name)
elapsed_time = time.time() - start_time
logging.info(f"Процесс {process_id} завершил генерацию файла {file_name}. Время выполнения: {elapsed_time:.2f} секунд.")
def generate_multiple_files(num_files, num_records_per_file):
num_threads = os.cpu_count()
with ProcessPoolExecutor() as process_executor:
process_executor.map(process_task, range(1, num_files + 1), [num_records_per_file] * num_files, [num_threads] * num_files)
def merge_files(output_file, num_files):
logging.info("Начало слияния файлов...")
start_time = time.time()
with open(output_file, 'w', encoding='utf-8') as outfile:
for i in range(1, num_files + 1):
file_name = f"italian_data_{i}.txt"
logging.info(f"Слияние файла {file_name}")
with open(file_name, 'r', encoding='utf-8') as infile:
for line in infile:
outfile.write(line)
elapsed_time = time.time() - start_time
logging.info(f"Файл {output_file} успешно создан. Время слияния: {elapsed_time:.2f} секунд.")
if __name__ == "__main__":
total_records = 3_000_000 # Общее количество записей
num_files = 2 # Количество файлов
records_per_file = total_records // num_files # Количество записей на файл
final_output_file = "final_italian_data.txt" # Имя итогового файла
logging.info("Начало генерации файлов...")
generate_multiple_files(num_files, records_per_file)
logging.info("Все файлы успешно сгенерированы.")
Под Испанию:
У вас должно быть более 25 реакций для просмотра скрытого контента.
Python:
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
from faker import Faker
import ipaddress
import os
import logging
from itertools import islice
import time
from colorlog import ColoredFormatter
import random
import string
# Настройка цветного логирования
formatter = ColoredFormatter(
"%(log_color)s%(asctime)s - %(levelname)s - %(message)s",
datefmt=None,
reset=True,
log_colors={
'DEBUG': 'bold_black',
'INFO': 'bold_green',
'WARNING': 'yellow',
'ERROR': 'bold_red',
'CRITICAL': 'bold_purple'
}
)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[handler, logging.FileHandler("generation_log.txt")]
)
# Список известных диапазонов IP Испании
spanish_ip_ranges = [
'2.136.0.0/13', '2.152.0.0/14', '5.39.192.0/19', '5.40.0.0/16', '5.53.0.0/16',
'5.56.0.0/14', '5.134.0.0/16', '5.152.0.0/17', '5.158.192.0/20', '5.158.240.0/20',
'5.187.0.0/16', '5.224.0.0/15', '5.226.0.0/16', '5.250.0.0/16', '5.251.0.0/16',
'5.252.0.0/15', '5.254.0.0/16', '5.255.0.0/16', '31.3.0.0/16', '31.4.0.0/16',
'31.13.184.0/21', '31.15.0.0/21', '31.24.112.0/21', '31.24.120.0/21', '31.24.128.0/21',
'31.24.160.0/21', '31.24.224.0/21', '31.47.0.0/16', '31.131.224.0/19', '31.170.64.0/18',
'31.193.144.0/20', '31.200.128.0/18', '31.210.0.0/16', '31.221.128.0/17', '37.10.128.0/17',
'37.11.0.0/16', '37.14.0.0/15', '37.18.128.0/17', '37.25.128.0/17', '37.29.128.0/17',
'37.35.0.0/16', '37.44.128.0/17', '37.61.192.0/18', '37.128.216.0/21', '37.132.0.0/14',
'37.152.128.0/18', '37.157.192.0/18', '37.183.0.0/16', '37.187.32.0/19', '37.223.0.0/19',
'45.12.32.0/19', '45.12.64.0/18', '45.12.128.0/18', '45.12.192.0/19', '45.13.24.0/22',
'45.48.0.0/12', '45.64.0.0/12', '45.80.0.0/12', '45.96.0.0/11', '45.128.0.0/11',
'45.160.0.0/11', '45.192.0.0/12', '45.208.0.0/12', '45.224.0.0/12', '45.240.0.0/13',
'45.248.0.0/13', '62.14.0.0/15', '62.22.0.0/15', '62.36.0.0/15', '62.42.0.0/15',
'62.57.0.0/16', '62.81.0.0/16', '62.83.0.0/16', '62.87.0.0/17', '62.97.84.0/22',
'62.99.0.0/16', '62.117.128.0/19', '62.151.0.0/16', '62.174.0.0/15', '62.201.0.0/16',
'77.72.56.0/21', '77.72.152.0/21', '77.72.200.0/21', '77.73.232.0/21', '77.208.0.0/14',
'77.224.0.0/13', '78.24.16.0/21', '78.24.184.0/21', '78.25.8.0/21', '78.25.72.0/21',
'78.26.8.0/21', '78.26.160.0/21', '78.27.64.0/21', '78.27.128.0/21', '78.28.192.0/21',
'78.30.192.0/21', '78.31.184.0/21', '78.46.0.0/15', '78.108.176.0/20', '78.128.0.0/17',
'78.136.64.0/18', '78.138.128.0/18', '78.141.192.0/18', '78.158.192.0/19', '79.98.24.0/21',
'79.98.208.0/21', '79.99.164.0/22', '79.99.176.0/21', '79.108.0.0/15', '79.116.0.0/16',
'79.144.0.0/12', '79.170.88.0/21', '80.24.0.0/13', '80.32.0.0/13', '80.58.0.0/15',
'80.66.176.0/20', '80.80.0.0/15', '80.91.32.0/20', '80.102.0.0/15', '80.174.0.0/15',
'80.224.0.0/14', '80.228.0.0/16', '80.251.64.0/20', '81.0.0.0/16', '81.9.0.0/17',
'81.19.96.0/20', '81.19.224.0/20', '81.24.224.0/20', '81.25.160.0/20', '81.33.0.0/16',
'81.35.64.0/19', '81.36.0.0/14', '81.45.0.0/16', '81.46.0.0/15', '81.61.32.0/19',
'81.90.96.0/20', '81.93.48.0/20', '81.172.0.0/17', '81.184.0.0/14', '81.202.0.0/15',
'81.220.0.0/14', '82.98.128.0/18', '82.116.128.0/19', '82.130.128.0/17', '82.144.0.0/14',
'82.158.0.0/15', '82.194.64.0/19', '82.198.0.0/19', '83.32.0.0/11', '83.136.184.0/21',
'83.138.40.0/21', '83.138.184.0/21', '83.142.248.0/21', '83.143.120.0/21', '83.165.0.0/16',
'83.173.128.0/18', '83.175.64.0/18', '83.213.0.0/16', '83.230.0.0/15', '83.247.128.0/17',
'84.76.0.0/14', '84.120.0.0/13', '84.232.0.0/17', '84.236.128.0/17', '84.237.0.0/17',
'84.246.208.0/21', '85.48.0.0/13', '85.84.0.0/14', '85.88.0.0/15', '85.91.64.0/19',
'85.136.0.0/15', '85.152.0.0/16', '85.155.0.0/16', '85.192.64.0/18', '85.192.128.0/18',
'85.204.60.0/23', '85.204.78.0/23', '85.204.124.0/23', '85.204.164.0/23', '85.204.248.0/23',
'85.251.0.0/16', '86.104.0.0/16', '86.109.32.0/19', '87.216.0.0/13', '87.235.0.0/16',
'87.236.0.0/15', '87.238.192.0/21', '88.0.0.0/11', '88.84.32.0/19', '88.84.128.0/19',
'88.87.128.0/17', '89.6.0.0/15', '89.17.128.0/19', '89.29.128.0/18', '89.32.48.0/21',
'89.33.204.0/22', '89.36.208.0/20', '89.39.8.0/21', '89.46.216.0/21', '89.107.224.0/21',
'89.129.128.0/17', '89.130.0.0/16', '89.140.0.0/14', '89.248.96.0/20', '90.64.0.0/10',
'91.102.176.0/21', '91.106.8.0/21', '91.109.248.0/21', '91.117.96.0/19', '91.126.0.0/15',
'91.142.128.0/20', '91.142.224.0/20', '91.146.59.0/24', '91.151.64.0/20', '91.184.160.0/19',
'91.194.58.0/23', '91.195.138.0/23', '91.199.109.0/24', '91.204.224.0/22', '91.208.76.0/24',
'91.213.32.0/24', '91.213.96.0/24', '91.216.88.0/24', '91.216.92.0/24', '91.220.101.0/24',
'91.228.34.0/23', '91.229.236.0/24', '91.231.120.0/24', '91.232.26.0/24', '91.232.180.0/23',
'91.232.182.0/24', '91.234.224.0/22', '91.235.48.0/22', '91.235.160.0/22', '91.236.120.0/23',
'91.238.220.0/23', '91.240.20.0/22', '91.240.165.0/24', '91.240.252.0/23', '91.250.224.0/19',
'92.43.8.0/21', '92.43.40.0/21', '92.56.0.0/14', '92.176.0.0/12', '93.93.56.0/21',
'93.93.104.0/21', '93.94.200.0/21', '93.113.158.0/23', '93.113.224.0/20', '93.156.0.0/16',
'93.176.128.0/18', '93.189.32.0/21', '93.189.88.0/21', '93.190.136.0/21', '93.191.192.0/21',
'94.24.0.0/14', '94.46.240.0/21', '94.124.80.0/21', '94.124.144.0/21', '94.127.56.0/21',
'94.136.64.0/19', '94.140.192.0/19', '94.142.192.0/18', '94.143.184.0/21', '94.176.0.0/14',
'94.198.24.0/21', '95.16.0.0/13', '95.39.0.0/16', '95.60.0.0/14', '95.120.0.0/13',
'95.129.128.0/17', '95.169.192.0/19', '95.214.0.0/16', '95.215.0.0/16', '109.68.88.0/21',
'109.69.80.0/21', '109.70.88.0/21', '109.70.112.0/21', '109.108.160.0/19', '109.167.0.0/17',
'109.205.8.0/21', '109.234.240.0/21', '109.235.248.0/21', '144.172.112.0/20', '145.14.96.0/19',
'146.158.0.0/17', '146.185.120.0/21', '146.255.56.0/21', '146.255.224.0/20', '147.96.0.0/16',
'149.62.144.0/21', '149.62.160.0/21', '149.156.0.0/16', '150.128.0.0/16', '150.214.0.0/16',
'150.241.0.0/16', '151.237.160.0/19', '151.237.184.0/22', '151.237.188.0/22', '151.237.192.0/22',
'151.237.196.0/22', '151.237.200.0/21', '151.237.208.0/20', '151.237.224.0/19', '152.66.0.0/16',
'152.91.0.0/16', '152.231.0.0/16', '154.56.0.0/13', '155.210.0.0/16', '155.240.0.0/14',
'155.248.0.0/14', '157.97.0.0/16', '158.109.0.0/16', '158.227.0.0/16',
'159.149.0.0/16', '160.45.0.0/16', '160.103.0.0/16', '160.200.0.0/16', '160.251.0.0/16',
'161.111.0.0/16', '161.222.0.0/16', '163.117.0.0/16', '164.138.0.0/16', '164.177.0.0/16',
'164.192.0.0/16', '164.200.0.0/16', '164.244.0.0/16', '165.254.176.0/20', '167.235.0.0/16',
'170.253.0.0/16', '176.10.0.0/15', '176.31.0.0/16', '176.47.0.0/16', '176.58.0.0/16',
'176.83.0.0/16', '176.85.0.0/16', '176.99.0.0/16', '176.150.0.0/16', '176.240.0.0/16',
'177.91.0.0/16', '178.32.0.0/15', '178.50.0.0/16', '178.60.0.0/14', '178.85.0.0/16',
'178.132.0.0/16', '178.156.0.0/15', '179.60.0.0/16', '179.108.0.0/16', '181.48.0.0/16',
'181.67.0.0/16', '185.2.64.0/22', '185.5.68.0/22', '185.22.136.0/22', '185.37.104.0/22',
'185.60.192.0/22', '185.96.0.0/22', '185.116.0.0/22', '185.169.128.0/22', '185.240.12.0/22',
'188.93.64.0/18', '188.141.0.0/16', '188.188.0.0/16', '188.244.0.0/15', '189.129.0.0/16',
'190.92.0.0/16', '191.96.0.0/16', '192.70.240.0/20', '192.150.8.0/21', '192.244.0.0/16',
'193.34.224.0/22', '193.62.0.0/16', '193.144.0.0/16', '194.30.0.0/16', '194.69.0.0/16',
'195.10.128.0/18', '195.55.0.0/16', '195.77.0.0/16', '195.235.0.0/16', '195.251.0.0/16',
'195.248.224.0/22', '198.48.176.0/20', '199.223.48.0/20', '201.230.0.0/16', '202.93.0.0/16',
'203.62.0.0/16', '204.86.192.0/18', '207.248.0.0/16', '208.111.176.0/20', '212.145.0.0/16',
'213.97.0.0/16', '213.134.32.0/19', '213.228.192.0/18', '216.151.128.0/17']
# Расширенный список провайдеров электронной почты
email_providers = [
# Испанские провайдеры
'movistar.es', 'orange.es', 'vodafone.es', 'jazztel.es', 'ono.es', 'ymail.es',
'telefonica.es', 'hotmail.es', 'gmail.es', 'outlook.es',
# Международные провайдеры
'gmail.com', 'yahoo.es', 'outlook.com', 'hotmail.com', 'protonmail.com', 'icloud.com'
]
# Расширенные списки испанских имен
extra_spanish_male_names = [
'Antonio', 'José', 'Manuel', 'Francisco', 'David', 'Juan', 'José Antonio', 'Javier',
'Daniel', 'José Luis', 'Francisco Javier', 'Carlos', 'Jesús', 'Alejandro', 'Miguel',
'José Manuel', 'Rafael', 'Miguel Ángel', 'Pedro', 'Ángel', 'José María', 'Fernando',
'Luis', 'Pablo', 'Sergio', 'Jorge', 'Alberto', 'Juan Carlos', 'Juan José', 'Ramón',
'Enrique', 'Diego', 'Juan Antonio', 'Vicente', 'Álvaro', 'Adrián', 'Iván', 'Raúl',
'Rubén', 'Óscar', 'Andrés', 'Joaquín', 'Juan Manuel', 'Santiago', 'Eduardo', 'Víctor'
]
extra_spanish_female_names = [
'María', 'Carmen', 'Ana', 'Isabel', 'Dolores', 'Pilar', 'Laura', 'Cristina', 'Marta', 'Sara',
'María Carmen', 'María Dolores', 'María Pilar', 'María Teresa', 'Ana María', 'Francisca',
'María Angeles', 'María Isabel', 'María José', 'Antonia', 'Dolores', 'Lucía', 'María Luisa',
'Rosa María', 'Encarnación', 'María Mercedes', 'Manuela', 'Elena', 'Rosario', 'Beatriz',
'Rosa', 'Victoria', 'Ángela', 'Marina', 'Julia', 'Belén', 'Silvia', 'Rocío', 'Andrea',
'Paula', 'Sonia', 'Alicia', 'Sandra', 'Susana', 'Margarita', 'Irene', 'Teresa', 'Sofía',
'Mónica', 'Raquel', 'Nuria', 'Claudia', 'Verónica', 'Eva', 'Carla', 'María Mar'
]
# Расширенный список испанских фамилий
extra_spanish_surnames = [
'García', 'Rodríguez', 'González', 'Fernández', 'López', 'Martínez', 'Sánchez', 'Pérez',
'Gómez', 'Martin', 'Jiménez', 'Ruiz', 'Hernández', 'Díaz', 'Moreno', 'Álvarez', 'Muñoz',
'Romero', 'Alonso', 'Gutiérrez', 'Navarro', 'Torres', 'Domínguez', 'Vázquez', 'Ramos',
'Gil', 'Ramírez', 'Serrano', 'Blanco', 'Suárez', 'Molina', 'Morales', 'Ortega', 'Delgado',
'Castro', 'Ortiz', 'Rubio', 'Marín', 'Sanz', 'Iglesias', 'Nuñez', 'Medina', 'Garrido',
'Santos', 'Castillo', 'Cortes', 'Lozano', 'Guerrero', 'Cano', 'Prieto', 'Méndez', 'Cruz',
'Calvo', 'Gallego', 'Vidal', 'León', 'Herrera', 'Márquez', 'Peña', 'Cabrera', 'Flores',
'Campos', 'Vega', 'Fuentes', 'Carrasco', 'Díez', 'Caballero', 'Nieto', 'Reyes', 'Aguilar',
'Pascual', 'Herrero', 'Santana', 'Lorenzo', 'Montero', 'Hidalgo', 'Ibáñez', 'Ferrer',
'Durán', 'Santiago', 'Benítez', 'Mora', 'Vicente', 'Vargas', 'Arias', 'Carmona', 'Crespo',
'Román', 'Pastor', 'Soto', 'Sáez', 'Velasco', 'Moya', 'Soler', 'Parra', 'Esteban', 'Bravo',
'Gallardo', 'Rojas'
]
def generate_spanish_ip():
"""Генерирует случайный IP-адрес из испанских диапазонов"""
chosen_range = random.choice(spanish_ip_ranges)
network = ipaddress.ip_network(chosen_range)
random_ip = str(network[random.randint(0, network.num_addresses - 1)])
return random_ip
# Заменяем функцию generate_ip на generate_spanish_ip
def generate_ip(fake):
return generate_spanish_ip()
def modify_name(name):
"""Функция для случайной модификации имени"""
if random.random() < 0.1: # 10% шанс модификации
modification = random.choice(['add', 'remove', 'replace'])
if modification == 'add':
position = random.randint(0, len(name))
name = name[:position] + random.choice(string.ascii_lowercase) + name[position:]
elif modification == 'remove' and len(name) > 3:
position = random.randint(0, len(name) - 1)
name = name[:position] + name[position + 1:]
elif modification == 'replace' and len(name) > 0:
position = random.randint(0, len(name) - 1)
name = name[:position] + random.choice(string.ascii_lowercase) + name[position + 1:]
return name
def generate_name(fake, gender=None):
if gender is None:
gender = random.choice(['male', 'female'])
if random.random() < 0.6: # 60% случаев используем Faker
if gender == 'male':
first_name = fake.first_name_male()
else:
first_name = fake.first_name_female()
else: # 40% случаев используем наши списки
if gender == 'male':
first_name = random.choice(extra_spanish_male_names)
else:
first_name = random.choice(extra_spanish_female_names)
last_name1 = random.choice(extra_spanish_surnames)
last_name2 = random.choice(extra_spanish_surnames)
full_name = f"{first_name} {last_name1} {last_name2}"
# Применяем модификацию
full_name = ' '.join(modify_name(name) for name in full_name.split())
return full_name, gender
def generate_random_username():
"""Генерирует случайное имя пользователя для email"""
types = ['word', 'name_based', 'alphanum']
choice = random.choice(types)
if choice == 'word':
return ''.join(random.choice(string.ascii_lowercase) for _ in range(random.randint(5, 10)))
elif choice == 'name_based':
return f"{random.choice(['usuario', 'cliente', 'miembro'])}{random.randint(100, 9999)}"
else: # alphanum
letters = ''.join(random.choice(string.ascii_lowercase) for _ in range(random.randint(3, 7)))
numbers = ''.join(random.choice(string.digits) for _ in range(random.randint(2, 4)))
return f"{letters}{numbers}"
def generate_email(fake, full_name):
if random.random() < 0.6: # 60% случаев используем имя и фамилию
names = full_name.lower().split()
local_part = f"{names[0]}.{names[-1]}{random.randint(1, 9999)}"
else: # 40% случаев используем случайное имя пользователя
local_part = generate_random_username()
local_part = ''.join(c for c in local_part if c.isalnum() or c in ['.', '_', '-'])[:30] # Ограничиваем длину
domain = random.choice(email_providers)
return f"{local_part}@{domain}"
def generate_data(fake):
full_name, gender = generate_name(fake)
email = generate_email(fake, full_name)
city = fake.city()
ip = generate_ip(fake)
#return f"{full_name}/{email}/{city}/{ip}/{gender}\n" # Строка которая возвращает гендер
return f"{full_name}/{email}/{city}/{ip}\n"
def write_to_file(file_name, data_chunk):
with open(file_name, 'a', encoding='utf-8') as file:
file.writelines(data_chunk)
def generate_and_write_data(fake, num_records, num_threads, file_name, chunk_size=10_000):
logging.info(f"Начало генерации данных для файла {file_name}")
start_time = time.time()
with ThreadPoolExecutor(max_workers=num_threads) as executor:
for i in range(0, num_records, chunk_size):
data_chunk = executor.map(lambda _: generate_data(fake), range(chunk_size))
write_to_file(file_name, data_chunk)
elapsed_time = time.time() - start_time
logging.info(f"Файл {file_name} успешно создан. Время генерации: {elapsed_time:.2f} секунд.")
def process_task(process_id, records_per_file, num_threads):
fake = Faker('es_ES') # Используем испанскую локаль
file_name = f"spanish_data_{process_id}.txt"
logging.info(f"Процесс {process_id} начал генерацию файла {file_name}")
start_time = time.time()
generate_and_write_data(fake, records_per_file, num_threads, file_name)
elapsed_time = time.time() - start_time
logging.info(f"Процесс {process_id} завершил генерацию файла {file_name}. Время выполнения: {elapsed_time:.2f} секунд.")
def generate_multiple_files(num_files, num_records_per_file):
num_threads = os.cpu_count()
with ProcessPoolExecutor() as process_executor:
process_executor.map(process_task, range(1, num_files + 1), [num_records_per_file] * num_files, [num_threads] * num_files)
def merge_files(output_file, num_files):
logging.info("Начало слияния файлов...")
start_time = time.time()
with open(output_file, 'w', encoding='utf-8') as outfile:
for i in range(1, num_files + 1):
file_name = f"spanish_data_{i}.txt"
logging.info(f"Слияние файла {file_name}")
with open(file_name, 'r', encoding='utf-8') as infile:
for line in infile:
outfile.write(line)
elapsed_time = time.time() - start_time
logging.info(f"Файл {output_file} успешно создан. Время слияния: {elapsed_time:.2f} секунд.")
if __name__ == "__main__":
total_records = 4_500_000_000 # Общее количество записей
num_files = 500 # Количество файлов
records_per_file = total_records // num_files # Количество записей на файл
final_output_file = "final_spanish_data.txt" # Имя итогового файла
logging.info("Начало генерации файлов...")
generate_multiple_files(num_files, records_per_file)
logging.info("Все файлы успешно сгенерированы.")
# Финальное слияние файлов в один
merge_files(final_output_file, num_files)
logging.info("Все файлы успешно объединены в один.")
Последнее редактирование: