add some scripts.
This commit is contained in:
@@ -0,0 +1,31 @@
|
|||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import inspect
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
# MySQL 配置
|
||||||
|
db_config = {
|
||||||
|
'host': '172.18.0.3',
|
||||||
|
'user': 'root',
|
||||||
|
'password': 'mysqlpw',
|
||||||
|
'database': 'stockdb'
|
||||||
|
}
|
||||||
|
|
||||||
|
# 设置日志配置
|
||||||
|
def setup_logging(log_filename=None):
|
||||||
|
# 如果未传入 log_filename,则使用当前脚本名称作为日志文件名
|
||||||
|
if log_filename is None:
|
||||||
|
# 获取调用 setup_logging 的脚本文件名
|
||||||
|
caller_frame = inspect.stack()[1]
|
||||||
|
caller_filename = os.path.splitext(os.path.basename(caller_frame.filename))[0]
|
||||||
|
|
||||||
|
# 获取当前日期,格式为 yyyymmdd
|
||||||
|
current_date = datetime.now().strftime('%Y%m%d')
|
||||||
|
# 拼接 log 文件名,将日期加在扩展名前
|
||||||
|
log_filename = f'./log/{caller_filename}_{current_date}.log'
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s [%(filename)s:%(lineno)d] (%(funcName)s) - %(message)s',
|
||||||
|
handlers=[
|
||||||
|
logging.FileHandler(log_filename),
|
||||||
|
logging.StreamHandler()
|
||||||
|
])
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../result/iafd_meta.json
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
/root/scripts/javhd/result/models_detail.json
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
|||||||
|
/root/scripts/thelordofporn/result/actress_detail.json
|
||||||
@@ -0,0 +1,236 @@
|
|||||||
|
"""
|
||||||
|
Script Name:
|
||||||
|
Description: 从 https://www.iafd.com 上获取信息。利用cloudscraper绕过cloudflare
|
||||||
|
detail_fetch.py 从本地已经保存的列表数据,逐个拉取详情,并输出到文件。
|
||||||
|
list_fetch_astro.py 按照星座拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_birth.py 按照生日拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_ethnic.py 按照人种拉取数据,获得演员的信息列表。数据量大,但详细字段很多无效的
|
||||||
|
list_merge.py 上面三个列表的数据,取交集,得到整体数据。
|
||||||
|
iafd_scrape.py 借助 https://github.com/stashapp/CommunityScrapers 实现的脚本,可以输入演员的 iafd链接,获取兼容 stashapp 格式的数据。(作用不大,因为国籍、照片等字段不匹配)
|
||||||
|
|
||||||
|
html_format.py 负责读取已经保存的html目录, 提取信息,格式化输出。
|
||||||
|
data_merge.py 负责合并数据,它把从 iafd, javhd, thelordofporn 以及搭建 stashapp, 从上面更新到的演员数据(需导出)进行合并;
|
||||||
|
stashdb_merge.py 负责把从stashapp中导出的单个演员的json文件, 批量合并并输出; 通常我们需要把stashapp中导出的批量文件压缩并传输到data/tmp目录,解压后合并
|
||||||
|
从而获取到一份完整的数据列表。
|
||||||
|
|
||||||
|
Author: [Your Name]
|
||||||
|
Created Date: YYYY-MM-DD
|
||||||
|
Last Modified: YYYY-MM-DD
|
||||||
|
Version: 1.0
|
||||||
|
|
||||||
|
Modification History:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import csv
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# 配置日志
|
||||||
|
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# 输入目录和输出文件
|
||||||
|
input_dir = 'data'
|
||||||
|
output_json_file = f'{input_dir}/iafd_merge.json'
|
||||||
|
output_csv_file = f'{input_dir}/iafd_merge.csv'
|
||||||
|
output_person_txt = f'{input_dir}/all_person.txt'
|
||||||
|
|
||||||
|
# 读取iafd_meta.json
|
||||||
|
try:
|
||||||
|
with open(os.path.join(input_dir, 'iafd_meta.json'), 'r', encoding='utf-8') as file:
|
||||||
|
iafd_data = json.load(file)
|
||||||
|
logger.info("Loaded iafd_meta.json")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error loading iafd_meta.json: {e}")
|
||||||
|
iafd_data = []
|
||||||
|
|
||||||
|
# 读取stashdb.json
|
||||||
|
try:
|
||||||
|
with open(os.path.join(input_dir, 'stashdb.json'), 'r', encoding='utf-8') as file:
|
||||||
|
stashdb_data = json.load(file)
|
||||||
|
logger.info("Loaded stashdb.json")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error loading stashdb.json: {e}")
|
||||||
|
stashdb_data = []
|
||||||
|
|
||||||
|
# 读取javhd_meta.json
|
||||||
|
try:
|
||||||
|
with open(os.path.join(input_dir, 'javhd_meta.json'), 'r', encoding='utf-8') as file:
|
||||||
|
javhd_data = json.load(file)
|
||||||
|
logger.info("Loaded javhd_meta.json")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error loading javhd_meta.json: {e}")
|
||||||
|
javhd_data = []
|
||||||
|
|
||||||
|
# 读取thelordofporn_meta.json
|
||||||
|
try:
|
||||||
|
with open(os.path.join(input_dir, 'thelordofporn_meta.json'), 'r', encoding='utf-8') as file:
|
||||||
|
lordporn_data = json.load(file)
|
||||||
|
logger.info("Loaded thelordofporn_meta.json")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error loading thelordofporn_meta.json: {e}")
|
||||||
|
lordporn_data = []
|
||||||
|
|
||||||
|
# 构建all_meta_data,去重
|
||||||
|
all_meta_data = set()
|
||||||
|
|
||||||
|
# 从各数据源提取unique的姓名数据
|
||||||
|
for person_entry in iafd_data:
|
||||||
|
all_meta_data.add(person_entry['person'])
|
||||||
|
for stashdb_entry in stashdb_data:
|
||||||
|
all_meta_data.add(stashdb_entry['name'])
|
||||||
|
for javhd_entry in javhd_data:
|
||||||
|
all_meta_data.add(javhd_entry['ja_name'])
|
||||||
|
for lordporn_entry in lordporn_data:
|
||||||
|
all_meta_data.add(lordporn_entry['pornstar'])
|
||||||
|
|
||||||
|
# 合并数据的列表
|
||||||
|
merged_data = []
|
||||||
|
|
||||||
|
# 遍历all_meta_data,按规则合并
|
||||||
|
for person in all_meta_data:
|
||||||
|
# 初始化合并的数据结构体
|
||||||
|
merged_entry = {
|
||||||
|
'person': person
|
||||||
|
}
|
||||||
|
|
||||||
|
# 初始化stashdb_entry,所有字段为空
|
||||||
|
stashdb_entry = {
|
||||||
|
'stashdb_gender': '',
|
||||||
|
'stashdb_birthdate': '',
|
||||||
|
'stashdb_ethnicity': '',
|
||||||
|
'stashdb_country': '',
|
||||||
|
'stashdb_height': '',
|
||||||
|
'stashdb_measurements': '',
|
||||||
|
'stashdb_fake_tits': '',
|
||||||
|
'stashdb_career_length': '',
|
||||||
|
'stashdb_aliases': ''
|
||||||
|
}
|
||||||
|
|
||||||
|
# 初始化javhd_entry,所有字段为空
|
||||||
|
javhd_entry = {
|
||||||
|
'javhd_rank': '',
|
||||||
|
'javhd_height': '',
|
||||||
|
'javhd_weight': '',
|
||||||
|
'javhd_breast_size': '',
|
||||||
|
'javhd_breast_factor': '',
|
||||||
|
'javhd_birth_date': '',
|
||||||
|
'javhd_ethnicity': ''
|
||||||
|
}
|
||||||
|
|
||||||
|
# 初始化lordporn_entry,所有字段为空
|
||||||
|
lordporn_entry = {
|
||||||
|
'lordporn_rating': '',
|
||||||
|
'lordporn_rank': '',
|
||||||
|
'lordporn_career_start': '',
|
||||||
|
'lordporn_measurements': '',
|
||||||
|
'lordporn_born': '',
|
||||||
|
'lordporn_height': '',
|
||||||
|
'lordporn_weight': ''
|
||||||
|
}
|
||||||
|
|
||||||
|
# 初始化in_iafd字段,默认为N
|
||||||
|
in_iafd = 'N'
|
||||||
|
iafd_match = next((item for item in iafd_data if item.get('person') == person), None)
|
||||||
|
if iafd_match:
|
||||||
|
in_iafd = 'Y'
|
||||||
|
|
||||||
|
# 1. 检查是否存在于 stashdb 数据
|
||||||
|
in_stashdb = 'N'
|
||||||
|
stashdb_match = next((item for item in stashdb_data if item.get('name') == person), None)
|
||||||
|
if stashdb_match:
|
||||||
|
in_stashdb = 'Y'
|
||||||
|
# 更新stashdb_entry字段
|
||||||
|
stashdb_entry.update({
|
||||||
|
'stashdb_gender': stashdb_match.get('gender', ''),
|
||||||
|
'stashdb_birthdate': stashdb_match.get('birthdate', ''),
|
||||||
|
'stashdb_ethnicity': stashdb_match.get('ethnicity', ''),
|
||||||
|
'stashdb_country': stashdb_match.get('country', ''),
|
||||||
|
'stashdb_height': stashdb_match.get('height', ''),
|
||||||
|
'stashdb_measurements': stashdb_match.get('measurements', ''),
|
||||||
|
'stashdb_fake_tits': stashdb_match.get('fake_tits', ''),
|
||||||
|
'stashdb_career_length': stashdb_match.get('career_length', ''),
|
||||||
|
'stashdb_aliases': stashdb_match.get('aliases', '')
|
||||||
|
})
|
||||||
|
|
||||||
|
# 2. 检查是否存在于 javhd 数据
|
||||||
|
in_javhd = 'N'
|
||||||
|
javhd_match = next((item for item in javhd_data if item.get('ja_name') == person), None)
|
||||||
|
if javhd_match:
|
||||||
|
in_javhd = 'Y'
|
||||||
|
# 更新javhd_entry字段
|
||||||
|
javhd_entry.update({
|
||||||
|
'javhd_rank': javhd_match.get('rank', ''),
|
||||||
|
'javhd_height': javhd_match.get('height', ''),
|
||||||
|
'javhd_weight': javhd_match.get('weight', ''),
|
||||||
|
'javhd_breast_size': javhd_match.get('breast size', ''),
|
||||||
|
'javhd_breast_factor': javhd_match.get('breast factor', ''),
|
||||||
|
'javhd_birth_date': javhd_match.get('birth date', ''),
|
||||||
|
'javhd_ethnicity': javhd_match.get('ethnicity', '')
|
||||||
|
})
|
||||||
|
|
||||||
|
# 3. 检查是否存在于 thelordofporn 数据
|
||||||
|
in_lordporn = 'N'
|
||||||
|
lordporn_match = next((item for item in lordporn_data if item.get('pornstar') == person), None)
|
||||||
|
if lordporn_match:
|
||||||
|
in_lordporn = 'Y'
|
||||||
|
# 更新lordporn_entry字段
|
||||||
|
lordporn_entry.update({
|
||||||
|
'lordporn_rating': lordporn_match.get('rating', ''),
|
||||||
|
'lordporn_rank': lordporn_match.get('rank', ''),
|
||||||
|
'lordporn_career_start': lordporn_match.get('career_start', ''),
|
||||||
|
'lordporn_measurements': lordporn_match.get('measurements', ''),
|
||||||
|
'lordporn_born': lordporn_match.get('born', ''),
|
||||||
|
'lordporn_height': lordporn_match.get('height', ''),
|
||||||
|
'lordporn_weight': lordporn_match.get('weight', '')
|
||||||
|
})
|
||||||
|
|
||||||
|
# 添加 in_stashdb, in_javhd, in_lordporn 字段,确保都输出
|
||||||
|
merged_entry.update({
|
||||||
|
'in_iafd': in_iafd,
|
||||||
|
'in_stashdb': in_stashdb,
|
||||||
|
'in_javhd': in_javhd,
|
||||||
|
'in_lordporn': in_lordporn
|
||||||
|
})
|
||||||
|
|
||||||
|
# 将stashdb_entry, javhd_entry, lordporn_entry合并到结果中
|
||||||
|
merged_entry.update(stashdb_entry)
|
||||||
|
merged_entry.update(javhd_entry)
|
||||||
|
merged_entry.update(lordporn_entry)
|
||||||
|
|
||||||
|
# 将合并后的条目加入到结果列表
|
||||||
|
merged_data.append(merged_entry)
|
||||||
|
|
||||||
|
# 写入iafd_merge.json
|
||||||
|
try:
|
||||||
|
with open(output_json_file, 'w', encoding='utf-8') as json_file:
|
||||||
|
json.dump(merged_data, json_file, ensure_ascii=False, indent=4)
|
||||||
|
logger.info(f"Data successfully written to {output_json_file}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error writing {output_json_file}: {e}")
|
||||||
|
|
||||||
|
# 写入iafd_merge.csv
|
||||||
|
try:
|
||||||
|
with open(output_csv_file, 'w', newline='', encoding='utf-8') as csv_file:
|
||||||
|
writer = csv.DictWriter(csv_file, fieldnames=merged_data[0].keys(), delimiter='\t')
|
||||||
|
writer.writeheader()
|
||||||
|
writer.writerows(merged_data)
|
||||||
|
logger.info(f"Data successfully written to {output_csv_file}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error writing {output_csv_file}: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
# 输出 all_meta_data 到 all_person.txt,并按字母顺序排序
|
||||||
|
try:
|
||||||
|
# 排序 all_meta_data
|
||||||
|
all_meta_data_list = sorted(list(all_meta_data)) # 将集合转换为列表并排序
|
||||||
|
all_meta_data_str = ','.join(all_meta_data_list) # 使用逗号连接元素
|
||||||
|
with open(output_person_txt, 'w', encoding='utf-8') as txt_file:
|
||||||
|
txt_file.write(all_meta_data_str)
|
||||||
|
logger.info(f"all_meta_data successfully written to all_person.txt")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error writing all_person.txt: {e}")
|
||||||
@@ -0,0 +1,216 @@
|
|||||||
|
"""
|
||||||
|
Script Name:
|
||||||
|
Description: 从 https://www.iafd.com 上获取信息。利用cloudscraper绕过cloudflare
|
||||||
|
detail_fetch.py 从本地已经保存的列表数据,逐个拉取详情,并输出到文件。
|
||||||
|
list_fetch_astro.py 按照星座拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_birth.py 按照生日拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_ethnic.py 按照人种拉取数据,获得演员的信息列表。数据量大,但详细字段很多无效的
|
||||||
|
list_merge.py 上面三个列表的数据,取交集,得到整体数据。
|
||||||
|
iafd_scrape.py 借助 https://github.com/stashapp/CommunityScrapers 实现的脚本,可以输入演员的 iafd链接,获取兼容 stashapp 格式的数据。(作用不大,因为国籍、照片等字段不匹配)
|
||||||
|
|
||||||
|
html_format.py 负责读取已经保存的html目录, 提取信息,格式化输出。
|
||||||
|
data_merge.py 负责合并数据,它把从 iafd, javhd, thelordofporn 以及搭建 stashapp, 从上面更新到的演员数据(需导出)进行合并;
|
||||||
|
stashdb_merge.py 负责把从stashapp中导出的单个演员的json文件, 批量合并并输出; 通常我们需要把stashapp中导出的批量文件压缩并传输到data/tmp目录,解压后合并
|
||||||
|
从而获取到一份完整的数据列表。
|
||||||
|
|
||||||
|
Author: [Your Name]
|
||||||
|
Created Date: YYYY-MM-DD
|
||||||
|
Last Modified: YYYY-MM-DD
|
||||||
|
Version: 1.0
|
||||||
|
|
||||||
|
Modification History:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
"""
|
||||||
|
|
||||||
|
import cloudscraper
|
||||||
|
import time
|
||||||
|
import json
|
||||||
|
import csv
|
||||||
|
import logging
|
||||||
|
import signal
|
||||||
|
import sys
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
from requests.exceptions import RequestException
|
||||||
|
import config
|
||||||
|
|
||||||
|
# 配置日志
|
||||||
|
config.setup_logging()
|
||||||
|
|
||||||
|
# 结果路径
|
||||||
|
res_dir = './result'
|
||||||
|
res_json_file = f'{res_dir}/detail.json'
|
||||||
|
res_csv_file = f'{res_dir}/detail.csv'
|
||||||
|
input_json_file = f'{res_dir}/merged.json'
|
||||||
|
|
||||||
|
# 存储结果
|
||||||
|
final_data = []
|
||||||
|
|
||||||
|
# 读取 detail.json 中的 href
|
||||||
|
def load_existing_hrefs():
|
||||||
|
existing_hrefs = set()
|
||||||
|
try:
|
||||||
|
with open(res_json_file, 'r') as file:
|
||||||
|
data = json.load(file)
|
||||||
|
for entry in data:
|
||||||
|
existing_hrefs.add(entry['href'])
|
||||||
|
except FileNotFoundError:
|
||||||
|
logging.info("detail.json not found, starting fresh.")
|
||||||
|
return existing_hrefs
|
||||||
|
|
||||||
|
# 请求网页并提取所需数据
|
||||||
|
def fetch_and_parse_page(url, scraper):
|
||||||
|
try:
|
||||||
|
response = scraper.get(url)
|
||||||
|
if response.status_code != 200:
|
||||||
|
logging.warning(f"Failed to fetch {url}, Status code: {response.status_code}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 解析 HTML 内容
|
||||||
|
soup = BeautifulSoup(response.text, 'html.parser')
|
||||||
|
# 提取数据
|
||||||
|
data = {}
|
||||||
|
|
||||||
|
# 定义我们需要的字段名称和HTML中对应的标签
|
||||||
|
fields = {
|
||||||
|
'performer_aka': 'Performer AKA',
|
||||||
|
'birthday': 'Birthday',
|
||||||
|
'astrology': 'Astrology',
|
||||||
|
'birthplace': 'Birthplace',
|
||||||
|
'gender': 'Gender',
|
||||||
|
'years_active': 'Years Active',
|
||||||
|
'ethnicity': 'Ethnicity',
|
||||||
|
'nationality': 'Nationality',
|
||||||
|
'hair_colors': 'Hair Colors',
|
||||||
|
'eye_color': 'Eye Color',
|
||||||
|
'height': 'Height',
|
||||||
|
'weight': 'Weight',
|
||||||
|
'measurements': 'Measurements',
|
||||||
|
'tattoos': 'Tattoos',
|
||||||
|
'piercings': 'Piercings'
|
||||||
|
}
|
||||||
|
reversed_map = {v: k for k, v in fields.items()}
|
||||||
|
|
||||||
|
# 遍历每个 bioheading
|
||||||
|
bioheadings = soup.find_all('p', class_='bioheading')
|
||||||
|
for bio in bioheadings:
|
||||||
|
heading = bio.text.strip()
|
||||||
|
biodata = None
|
||||||
|
|
||||||
|
# 如果包含 "Performer",需要特殊处理
|
||||||
|
if 'Performer' in heading:
|
||||||
|
heading = 'Performer AKA'
|
||||||
|
biodata_div = bio.find_next('div', class_='biodata')
|
||||||
|
if biodata_div:
|
||||||
|
div_text = biodata_div.get_text(separator='|').strip()
|
||||||
|
biodata = [b.strip() for b in div_text.split('|') if b.strip()]
|
||||||
|
else:
|
||||||
|
biodata = bio.find_next('p', class_='biodata').text.strip() if bio.find_next('p', class_='biodata') else ''
|
||||||
|
|
||||||
|
# 保存数据
|
||||||
|
if heading in reversed_map:
|
||||||
|
kkey = reversed_map[heading]
|
||||||
|
data[kkey] = biodata
|
||||||
|
|
||||||
|
return data
|
||||||
|
except RequestException as e:
|
||||||
|
logging.error(f"Error fetching {url}: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 写入 detail.json
|
||||||
|
def write_to_detail_json(data):
|
||||||
|
with open(res_json_file, 'w', encoding='utf-8') as json_file:
|
||||||
|
json.dump(data, json_file, indent=4, ensure_ascii=False)
|
||||||
|
|
||||||
|
# 写入 CSV 文件
|
||||||
|
def write_to_csv(data):
|
||||||
|
try:
|
||||||
|
with open(res_csv_file, 'w', newline='', encoding='utf-8') as csvfile:
|
||||||
|
writer = csv.writer(csvfile, delimiter=',')
|
||||||
|
header = ['person', 'href', 'performer_aka', 'birthday', 'astrology', 'birthplace', 'gender', 'years_active', 'ethnicity', 'nationality', 'hair_colors', 'eye_color', 'height', 'weight', 'measurements', 'tattoos', 'piercings']
|
||||||
|
writer.writerow(header)
|
||||||
|
for entry in data:
|
||||||
|
writer.writerow([
|
||||||
|
entry.get('person', ''),
|
||||||
|
entry.get('href', ''),
|
||||||
|
'|'.join(entry.get('performer_aka', [])),
|
||||||
|
entry.get('birthday', ''),
|
||||||
|
entry.get('astrology', ''),
|
||||||
|
entry.get('birthplace', ''),
|
||||||
|
entry.get('gender', ''),
|
||||||
|
entry.get('years_active', ''),
|
||||||
|
entry.get('ethnicity', ''),
|
||||||
|
entry.get('nationality', ''),
|
||||||
|
entry.get('hair_colors', ''),
|
||||||
|
entry.get('eye_color', ''),
|
||||||
|
entry.get('height', ''),
|
||||||
|
entry.get('weight', ''),
|
||||||
|
entry.get('measurements', ''),
|
||||||
|
entry.get('tattoos', ''),
|
||||||
|
entry.get('piercings', '')
|
||||||
|
])
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error writing to CSV: {e}")
|
||||||
|
|
||||||
|
def handle_exit_signal(signal, frame):
|
||||||
|
logging.info("Gracefully exiting... Saving remaining data to Json and CSV.")
|
||||||
|
write_to_csv(final_data) # Ensure final data is written when exiting
|
||||||
|
write_to_detail_json(final_data)
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# 初始化 cloudscraper
|
||||||
|
scraper = cloudscraper.create_scraper()
|
||||||
|
|
||||||
|
# 加载已存在的 href 列表
|
||||||
|
existing_hrefs = load_existing_hrefs()
|
||||||
|
|
||||||
|
# 读取 merged.json
|
||||||
|
with open(input_json_file, 'r') as file:
|
||||||
|
merged_data = json.load(file)
|
||||||
|
|
||||||
|
# 注册退出信号
|
||||||
|
signal.signal(signal.SIGINT, handle_exit_signal) # Handle Ctrl+C
|
||||||
|
signal.signal(signal.SIGTERM, handle_exit_signal) # Handle kill signal
|
||||||
|
|
||||||
|
# 遍历 merged.json 中的数据
|
||||||
|
loop = 0
|
||||||
|
for entry in merged_data:
|
||||||
|
href = entry.get('href')
|
||||||
|
person = entry.get('person')
|
||||||
|
|
||||||
|
if href in existing_hrefs:
|
||||||
|
logging.info(f"Skipping {href} - already processed")
|
||||||
|
continue
|
||||||
|
|
||||||
|
logging.info(f"Processing {href} - {person}")
|
||||||
|
|
||||||
|
# 获取并解析数据
|
||||||
|
data = fetch_and_parse_page(href, scraper)
|
||||||
|
if data:
|
||||||
|
# 如果数据正确,加入到 final_data
|
||||||
|
final_data.append({
|
||||||
|
'href': href,
|
||||||
|
'person': person,
|
||||||
|
**data
|
||||||
|
})
|
||||||
|
loop = loop+1
|
||||||
|
if loop % 100 == 0:
|
||||||
|
# 更新 detail.json 文件
|
||||||
|
print(f'flush data to json file. now data count: {loop}')
|
||||||
|
write_to_detail_json(final_data)
|
||||||
|
|
||||||
|
# 更新已存在的 href
|
||||||
|
existing_hrefs.add(href)
|
||||||
|
|
||||||
|
# 延时,防止请求过快被封锁
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
# 完成后一次性写入 CSV
|
||||||
|
write_to_csv(final_data)
|
||||||
|
|
||||||
|
logging.info("Data processing completed.")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -1,3 +1,29 @@
|
|||||||
|
"""
|
||||||
|
Script Name:
|
||||||
|
Description: 从 https://www.iafd.com 上获取信息。利用cloudscraper绕过cloudflare
|
||||||
|
detail_fetch.py 从本地已经保存的列表数据,逐个拉取详情,并输出到文件。
|
||||||
|
list_fetch_astro.py 按照星座拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_birth.py 按照生日拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_ethnic.py 按照人种拉取数据,获得演员的信息列表。数据量大,但详细字段很多无效的
|
||||||
|
list_merge.py 上面三个列表的数据,取交集,得到整体数据。
|
||||||
|
iafd_scrape.py 借助 https://github.com/stashapp/CommunityScrapers 实现的脚本,可以输入演员的 iafd链接,获取兼容 stashapp 格式的数据。(作用不大,因为国籍、照片等字段不匹配)
|
||||||
|
|
||||||
|
html_format.py 负责读取已经保存的html目录, 提取信息,格式化输出。
|
||||||
|
data_merge.py 负责合并数据,它把从 iafd, javhd, thelordofporn 以及搭建 stashapp, 从上面更新到的演员数据(需导出)进行合并;
|
||||||
|
stashdb_merge.py 负责把从stashapp中导出的单个演员的json文件, 批量合并并输出; 通常我们需要把stashapp中导出的批量文件压缩并传输到data/tmp目录,解压后合并
|
||||||
|
从而获取到一份完整的数据列表。
|
||||||
|
|
||||||
|
Author: [Your Name]
|
||||||
|
Created Date: YYYY-MM-DD
|
||||||
|
Last Modified: YYYY-MM-DD
|
||||||
|
Version: 1.0
|
||||||
|
|
||||||
|
Modification History:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
import csv
|
import csv
|
||||||
|
|||||||
@@ -0,0 +1,163 @@
|
|||||||
|
"""
|
||||||
|
Script Name:
|
||||||
|
Description: 从 https://www.iafd.com 上获取信息。利用cloudscraper绕过cloudflare
|
||||||
|
detail_fetch.py 从本地已经保存的列表数据,逐个拉取详情,并输出到文件。
|
||||||
|
list_fetch_astro.py 按照星座拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_birth.py 按照生日拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_ethnic.py 按照人种拉取数据,获得演员的信息列表。数据量大,但详细字段很多无效的
|
||||||
|
list_merge.py 上面三个列表的数据,取交集,得到整体数据。
|
||||||
|
iafd_scrape.py 借助 https://github.com/stashapp/CommunityScrapers 实现的脚本,可以输入演员的 iafd链接,获取兼容 stashapp 格式的数据。(作用不大,因为国籍、照片等字段不匹配)
|
||||||
|
|
||||||
|
html_format.py 负责读取已经保存的html目录, 提取信息,格式化输出。
|
||||||
|
data_merge.py 负责合并数据,它把从 iafd, javhd, thelordofporn 以及搭建 stashapp, 从上面更新到的演员数据(需导出)进行合并;
|
||||||
|
stashdb_merge.py 负责把从stashapp中导出的单个演员的json文件, 批量合并并输出; 通常我们需要把stashapp中导出的批量文件压缩并传输到data/tmp目录,解压后合并
|
||||||
|
从而获取到一份完整的数据列表。
|
||||||
|
|
||||||
|
Author: [Your Name]
|
||||||
|
Created Date: YYYY-MM-DD
|
||||||
|
Last Modified: YYYY-MM-DD
|
||||||
|
Version: 1.0
|
||||||
|
|
||||||
|
Modification History:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
"""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
import logging
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
# 设置日志配置
|
||||||
|
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# 预定义的 scrapers 目录
|
||||||
|
scrapers_dir = "/root/gitlabs/stashapp_CommunityScrapers/scrapers"
|
||||||
|
meta_file = "./data/iafd_meta.json"
|
||||||
|
cursor_file = "./data/iafd_cursor.txt"
|
||||||
|
output_dir = f"{scrapers_dir}/iafd_meta"
|
||||||
|
|
||||||
|
# 重试次数和间隔
|
||||||
|
MAX_RETRIES = 10
|
||||||
|
RETRY_DELAY = 5 # 5秒重试间隔
|
||||||
|
|
||||||
|
|
||||||
|
# 创建输出目录
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
|
||||||
|
|
||||||
|
def read_processed_hrefs() -> set:
|
||||||
|
"""
|
||||||
|
读取已经处理过的 href
|
||||||
|
"""
|
||||||
|
processed_hrefs = set()
|
||||||
|
if os.path.exists(cursor_file):
|
||||||
|
with open(cursor_file, "r", encoding="utf-8") as f:
|
||||||
|
processed_hrefs = {line.strip().split(",")[1] for line in f if "," in line}
|
||||||
|
return processed_hrefs
|
||||||
|
|
||||||
|
|
||||||
|
def execute_scraper_command(href: str, idv: str) -> bool:
|
||||||
|
"""
|
||||||
|
执行命令抓取数据,成功则返回True,否则返回False。
|
||||||
|
包含重试机制。
|
||||||
|
"""
|
||||||
|
command = f"cd {scrapers_dir}; python3 -m IAFD.IAFD performer {href} > {output_dir}/{idv}.json"
|
||||||
|
attempt = 0
|
||||||
|
while attempt < MAX_RETRIES:
|
||||||
|
try:
|
||||||
|
logger.info(f"执行命令: {command}")
|
||||||
|
subprocess.run(command, shell=True, check=True)
|
||||||
|
return True
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
logger.error(f"执行命令失败: {e}. 重试 {attempt + 1}/{MAX_RETRIES}...")
|
||||||
|
time.sleep(RETRY_DELAY)
|
||||||
|
attempt += 1
|
||||||
|
logger.error(f"命令执行失败,已尝试 {MAX_RETRIES} 次: {command}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def validate_json_file(idv: str) -> bool:
|
||||||
|
"""
|
||||||
|
校验 JSON 文件是否有效
|
||||||
|
"""
|
||||||
|
output_file = f"{output_dir}/{idv}.json"
|
||||||
|
try:
|
||||||
|
with open(output_file, "r", encoding="utf-8") as f:
|
||||||
|
content = f.read().strip()
|
||||||
|
json_data = json.loads(content) # 尝试解析 JSON
|
||||||
|
if "name" not in json_data:
|
||||||
|
raise ValueError("缺少 'name' 字段")
|
||||||
|
return True
|
||||||
|
except (json.JSONDecodeError, ValueError) as e:
|
||||||
|
logger.error(f"解析失败,删除无效文件: {output_file}. 错误: {e}")
|
||||||
|
os.remove(output_file)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def process_iafd_meta(data: List[dict], processed_hrefs: set) -> None:
|
||||||
|
"""
|
||||||
|
处理 iafd_meta.json 中的数据
|
||||||
|
"""
|
||||||
|
for entry in data:
|
||||||
|
person = entry.get("person")
|
||||||
|
href = entry.get("href")
|
||||||
|
|
||||||
|
if not person or not href:
|
||||||
|
logger.warning(f"跳过无效数据: {entry}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 解析 href 提取 id
|
||||||
|
try:
|
||||||
|
idv = href.split("id=")[-1]
|
||||||
|
except IndexError:
|
||||||
|
logger.error(f"无法解析 ID: {href}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
output_file = f"{output_dir}/{idv}.json"
|
||||||
|
|
||||||
|
# 跳过已处理的 href
|
||||||
|
if href in processed_hrefs:
|
||||||
|
logger.info(f"已处理,跳过: {person}, {href}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 执行数据抓取
|
||||||
|
if not execute_scraper_command(href, idv):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 校验 JSON 文件
|
||||||
|
if not validate_json_file(idv):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 记录已处理数据
|
||||||
|
with open(cursor_file, "a", encoding="utf-8") as f:
|
||||||
|
f.write(f"{person},{href}\n")
|
||||||
|
|
||||||
|
logger.info(f"成功处理: {person} - {href}")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
主程序执行函数
|
||||||
|
"""
|
||||||
|
# 读取已处理的 href
|
||||||
|
processed_hrefs = read_processed_hrefs()
|
||||||
|
|
||||||
|
# 读取 iafd_meta.json 数据
|
||||||
|
try:
|
||||||
|
with open(meta_file, "r", encoding="utf-8") as f:
|
||||||
|
data = json.load(f)
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
logger.error(f"读取 iafd_meta.json 错误: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# 处理数据
|
||||||
|
process_iafd_meta(data, processed_hrefs)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,140 @@
|
|||||||
|
"""
|
||||||
|
Script Name:
|
||||||
|
Description: 从 https://www.iafd.com 上获取信息。利用cloudscraper绕过cloudflare
|
||||||
|
detail_fetch.py 从本地已经保存的列表数据,逐个拉取详情,并输出到文件。
|
||||||
|
list_fetch_astro.py 按照星座拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_birth.py 按照生日拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_ethnic.py 按照人种拉取数据,获得演员的信息列表。数据量大,但详细字段很多无效的
|
||||||
|
list_merge.py 上面三个列表的数据,取交集,得到整体数据。
|
||||||
|
iafd_scrape.py 借助 https://github.com/stashapp/CommunityScrapers 实现的脚本,可以输入演员的 iafd链接,获取兼容 stashapp 格式的数据。(作用不大,因为国籍、照片等字段不匹配)
|
||||||
|
|
||||||
|
html_format.py 负责读取已经保存的html目录, 提取信息,格式化输出。
|
||||||
|
data_merge.py 负责合并数据,它把从 iafd, javhd, thelordofporn 以及搭建 stashapp, 从上面更新到的演员数据(需导出)进行合并;
|
||||||
|
stashdb_merge.py 负责把从stashapp中导出的单个演员的json文件, 批量合并并输出; 通常我们需要把stashapp中导出的批量文件压缩并传输到data/tmp目录,解压后合并
|
||||||
|
从而获取到一份完整的数据列表。
|
||||||
|
|
||||||
|
Author: [Your Name]
|
||||||
|
Created Date: YYYY-MM-DD
|
||||||
|
Last Modified: YYYY-MM-DD
|
||||||
|
Version: 1.0
|
||||||
|
|
||||||
|
Modification History:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
"""
|
||||||
|
|
||||||
|
import cloudscraper
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import csv
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
import logging
|
||||||
|
import config
|
||||||
|
|
||||||
|
config.setup_logging()
|
||||||
|
|
||||||
|
# 定义基础 URL 和可变参数
|
||||||
|
host_url = "https://www.iafd.com"
|
||||||
|
base_url = f"{host_url}/astrology.rme/sign="
|
||||||
|
astro_list = ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces']
|
||||||
|
|
||||||
|
# 设置 headers 和 scraper
|
||||||
|
headers = {
|
||||||
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
|
||||||
|
}
|
||||||
|
scraper = cloudscraper.create_scraper()
|
||||||
|
|
||||||
|
# 结果路径
|
||||||
|
res_dir = './result'
|
||||||
|
|
||||||
|
# 记录 ethinc_map
|
||||||
|
astro_map = []
|
||||||
|
|
||||||
|
# 网络请求并解析 HTML
|
||||||
|
def fetch_page(url):
|
||||||
|
try:
|
||||||
|
response = scraper.get(url, headers=headers)
|
||||||
|
response.raise_for_status()
|
||||||
|
return response.text
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Failed to fetch {url}: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 解析 HTML 内容,提取需要的数据
|
||||||
|
def parse_page(html, astro):
|
||||||
|
soup = BeautifulSoup(html, "html.parser")
|
||||||
|
astro_div = soup.find("div", id="astro")
|
||||||
|
|
||||||
|
if not astro_div:
|
||||||
|
logging.warning(f"Warning: No 'astro' div found in {astro}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
flag = False
|
||||||
|
list_cnt = 0
|
||||||
|
|
||||||
|
birth_date = None
|
||||||
|
for elem in astro_div.find_all(recursive=False):
|
||||||
|
if elem.name == "h3" and "astroday" in elem.get("class", []):
|
||||||
|
birth_date = elem.get_text(strip=True)
|
||||||
|
elif elem.name == "div" and "perficon" in elem.get("class", []):
|
||||||
|
a_tag = elem.find("a")
|
||||||
|
if a_tag:
|
||||||
|
href = host_url + a_tag["href"]
|
||||||
|
name = a_tag.find("span", class_="perfname")
|
||||||
|
if name:
|
||||||
|
astro_map.append({
|
||||||
|
"astrology": astro,
|
||||||
|
"birth_date": birth_date,
|
||||||
|
"person": name.get_text(strip=True),
|
||||||
|
"href": href
|
||||||
|
})
|
||||||
|
flag = True
|
||||||
|
list_cnt = list_cnt +1
|
||||||
|
if flag:
|
||||||
|
logging.info(f"get {list_cnt} persons from this page. total persons: {len(astro_map)}")
|
||||||
|
return soup
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 处理翻页,星座的无需翻页
|
||||||
|
def handle_pagination(soup, astro):
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 主逻辑函数:循环处理每个种族
|
||||||
|
def process_astro_data():
|
||||||
|
for astro in astro_list:
|
||||||
|
url = base_url + astro
|
||||||
|
next_url = url
|
||||||
|
logging.info(f"Fetching data for {astro}, url {url} ...")
|
||||||
|
|
||||||
|
while next_url:
|
||||||
|
html = fetch_page(next_url)
|
||||||
|
if html:
|
||||||
|
soup = parse_page(html, astro)
|
||||||
|
if soup:
|
||||||
|
next_url = handle_pagination(soup, astro)
|
||||||
|
else:
|
||||||
|
logging.info(f"wrong html content. retring {next_url} ...")
|
||||||
|
# 定期保存结果
|
||||||
|
save_data()
|
||||||
|
time.sleep(2) # 控制访问频率
|
||||||
|
else:
|
||||||
|
logging.info(f"Retrying {next_url} ...")
|
||||||
|
time.sleep(5) # 等待后再重试
|
||||||
|
|
||||||
|
# 保存到文件
|
||||||
|
def save_data():
|
||||||
|
with open(f'{res_dir}/astro.json', 'w', encoding='utf-8') as json_file:
|
||||||
|
json.dump(astro_map, json_file, indent=4, ensure_ascii=False)
|
||||||
|
|
||||||
|
with open(f'{res_dir}/astro.csv', 'w', newline='', encoding='utf-8') as csv_file:
|
||||||
|
writer = csv.DictWriter(csv_file, fieldnames=['astrology', 'birth_date', 'person', 'href'])
|
||||||
|
writer.writeheader()
|
||||||
|
writer.writerows(astro_map)
|
||||||
|
|
||||||
|
# 执行主逻辑
|
||||||
|
if __name__ == '__main__':
|
||||||
|
process_astro_data()
|
||||||
|
save_data()
|
||||||
|
logging.info("Data fetching and saving completed.")
|
||||||
@@ -0,0 +1,152 @@
|
|||||||
|
"""
|
||||||
|
Script Name:
|
||||||
|
Description: 从 https://www.iafd.com 上获取信息。利用cloudscraper绕过cloudflare
|
||||||
|
detail_fetch.py 从本地已经保存的列表数据,逐个拉取详情,并输出到文件。
|
||||||
|
list_fetch_astro.py 按照星座拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_birth.py 按照生日拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_ethnic.py 按照人种拉取数据,获得演员的信息列表。数据量大,但详细字段很多无效的
|
||||||
|
list_merge.py 上面三个列表的数据,取交集,得到整体数据。
|
||||||
|
iafd_scrape.py 借助 https://github.com/stashapp/CommunityScrapers 实现的脚本,可以输入演员的 iafd链接,获取兼容 stashapp 格式的数据。(作用不大,因为国籍、照片等字段不匹配)
|
||||||
|
|
||||||
|
html_format.py 负责读取已经保存的html目录, 提取信息,格式化输出。
|
||||||
|
data_merge.py 负责合并数据,它把从 iafd, javhd, thelordofporn 以及搭建 stashapp, 从上面更新到的演员数据(需导出)进行合并;
|
||||||
|
stashdb_merge.py 负责把从stashapp中导出的单个演员的json文件, 批量合并并输出; 通常我们需要把stashapp中导出的批量文件压缩并传输到data/tmp目录,解压后合并
|
||||||
|
从而获取到一份完整的数据列表。
|
||||||
|
|
||||||
|
Author: [Your Name]
|
||||||
|
Created Date: YYYY-MM-DD
|
||||||
|
Last Modified: YYYY-MM-DD
|
||||||
|
Version: 1.0
|
||||||
|
|
||||||
|
Modification History:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
"""
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import cloudscraper
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import csv
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
import logging
|
||||||
|
import config
|
||||||
|
|
||||||
|
config.setup_logging()
|
||||||
|
|
||||||
|
# 创建 cloudscraper 会话
|
||||||
|
# 设置 headers 和 scraper
|
||||||
|
headers = {
|
||||||
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
|
||||||
|
}
|
||||||
|
scraper = cloudscraper.create_scraper()
|
||||||
|
|
||||||
|
# 结果路径
|
||||||
|
res_dir = './result'
|
||||||
|
|
||||||
|
# 存储出生日期的映射
|
||||||
|
birth_map = []
|
||||||
|
|
||||||
|
# 设置基础URL
|
||||||
|
host_url = "https://www.iafd.com"
|
||||||
|
base_url = "https://www.iafd.com/calendar.asp?calmonth={month}&calday={day}"
|
||||||
|
|
||||||
|
# 定义获取页面内容的函数
|
||||||
|
def fetch_page(month, day):
|
||||||
|
url = base_url.format(month=month, day=day)
|
||||||
|
retries = 3
|
||||||
|
while retries > 0:
|
||||||
|
try:
|
||||||
|
# 发送请求并获取页面
|
||||||
|
logging.info(f"Fetching URL: {url}")
|
||||||
|
response = scraper.get(url)
|
||||||
|
response.raise_for_status()
|
||||||
|
return response.text
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
logging.error(f"Request failed: {e}")
|
||||||
|
retries -= 1
|
||||||
|
time.sleep(2) # 等待2秒后重试
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 解析页面内容并更新birth_map
|
||||||
|
def parse_page(html, month, day):
|
||||||
|
soup = BeautifulSoup(html, 'html.parser')
|
||||||
|
datarows = soup.find_all('div', class_='col-sm-12 col-lg-9')
|
||||||
|
if not datarows:
|
||||||
|
return None
|
||||||
|
|
||||||
|
flag = False
|
||||||
|
list_cnt = 0
|
||||||
|
rows = datarows[0].find_all('div', class_='col-sm-4')
|
||||||
|
for row in rows:
|
||||||
|
link_tag = row.find('a')
|
||||||
|
person = link_tag.text.strip() if link_tag else ''
|
||||||
|
href = link_tag['href'] if link_tag else ''
|
||||||
|
href = host_url + href
|
||||||
|
|
||||||
|
# 如果 href 已经在 birth_map 中,跳过
|
||||||
|
flag = True
|
||||||
|
if any(entry['href'] == href for entry in birth_map):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 将数据添加到 birth_map
|
||||||
|
birth_map.append({
|
||||||
|
'month': month,
|
||||||
|
'day': day,
|
||||||
|
'person': person,
|
||||||
|
'href': href
|
||||||
|
})
|
||||||
|
list_cnt = list_cnt +1
|
||||||
|
|
||||||
|
if flag:
|
||||||
|
logging.info(f"get {list_cnt} persons from this page. total persons: {len(birth_map)}")
|
||||||
|
return soup
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 循环遍历每个日期
|
||||||
|
def fetch_birthdays():
|
||||||
|
for month in range(1, 13): # 遍历1到12月
|
||||||
|
for day in range(1, 32): # 遍历1到31天
|
||||||
|
logging.info(f"Processing: Month {month}, Day {day}")
|
||||||
|
while True:
|
||||||
|
html = fetch_page(month, day)
|
||||||
|
if html:
|
||||||
|
soup = parse_page(html, month, day)
|
||||||
|
if soup:
|
||||||
|
# 定期保存结果
|
||||||
|
save_data()
|
||||||
|
# 跳出while循环,获取下一个生日的url数据
|
||||||
|
time.sleep(2) # 控制访问频率
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
logging.warning(f"No data. Retrying: Month {month}, Day {day}")
|
||||||
|
time.sleep(3) # 等待后再重试
|
||||||
|
else:
|
||||||
|
logging.warning(f"Network error. Retrying: Month {month}, Day {day}")
|
||||||
|
time.sleep(3) # 等待后再重试
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 将birth_map保存到json文件
|
||||||
|
def save_data():
|
||||||
|
with open(f'{res_dir}/birth.json', 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(birth_map, f, ensure_ascii=False, indent=4)
|
||||||
|
|
||||||
|
with open(f'{res_dir}/birth.csv', 'w', newline='', encoding='utf-8') as f:
|
||||||
|
writer = csv.DictWriter(f, fieldnames=['month', 'day', 'person', 'href'])
|
||||||
|
writer.writeheader()
|
||||||
|
for entry in birth_map:
|
||||||
|
writer.writerow(entry)
|
||||||
|
|
||||||
|
# 主函数
|
||||||
|
def main():
|
||||||
|
# 获取数据
|
||||||
|
fetch_birthdays()
|
||||||
|
|
||||||
|
# 保存结果
|
||||||
|
save_data()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
"""
|
||||||
|
Script Name:
|
||||||
|
Description: 从 https://www.iafd.com 上获取信息。利用cloudscraper绕过cloudflare
|
||||||
|
detail_fetch.py 从本地已经保存的列表数据,逐个拉取详情,并输出到文件。
|
||||||
|
list_fetch_astro.py 按照星座拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_birth.py 按照生日拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_ethnic.py 按照人种拉取数据,获得演员的信息列表。数据量大,但详细字段很多无效的
|
||||||
|
list_merge.py 上面三个列表的数据,取交集,得到整体数据。
|
||||||
|
iafd_scrape.py 借助 https://github.com/stashapp/CommunityScrapers 实现的脚本,可以输入演员的 iafd链接,获取兼容 stashapp 格式的数据。(作用不大,因为国籍、照片等字段不匹配)
|
||||||
|
|
||||||
|
html_format.py 负责读取已经保存的html目录, 提取信息,格式化输出。
|
||||||
|
data_merge.py 负责合并数据,它把从 iafd, javhd, thelordofporn 以及搭建 stashapp, 从上面更新到的演员数据(需导出)进行合并;
|
||||||
|
stashdb_merge.py 负责把从stashapp中导出的单个演员的json文件, 批量合并并输出; 通常我们需要把stashapp中导出的批量文件压缩并传输到data/tmp目录,解压后合并
|
||||||
|
从而获取到一份完整的数据列表。
|
||||||
|
|
||||||
|
Author: [Your Name]
|
||||||
|
Created Date: YYYY-MM-DD
|
||||||
|
Last Modified: YYYY-MM-DD
|
||||||
|
Version: 1.0
|
||||||
|
|
||||||
|
Modification History:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
"""
|
||||||
|
|
||||||
|
import cloudscraper
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import csv
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
import logging
|
||||||
|
import config
|
||||||
|
|
||||||
|
config.setup_logging()
|
||||||
|
|
||||||
|
# 定义基础 URL 和可变参数
|
||||||
|
host_url = "https://www.iafd.com"
|
||||||
|
base_url = f"{host_url}/lookupethnic.rme/ethnic="
|
||||||
|
ethnic_list = ['caucasian', 'black', 'asian', 'latin', 'native american', 'middle eastern', 'mediteranean', 'indian', 'polynesian', 'multi-ethnic', 'ethnic', 'romani', 'eurasian', 'north african', 'south asian']
|
||||||
|
|
||||||
|
# 设置 headers 和 scraper
|
||||||
|
headers = {
|
||||||
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
|
||||||
|
}
|
||||||
|
scraper = cloudscraper.create_scraper()
|
||||||
|
|
||||||
|
# 结果路径
|
||||||
|
res_dir = './result'
|
||||||
|
|
||||||
|
# 记录 ethinc_map
|
||||||
|
ethnic_map = []
|
||||||
|
|
||||||
|
# 网络请求并解析 HTML
|
||||||
|
def fetch_page(url):
|
||||||
|
try:
|
||||||
|
response = scraper.get(url, headers=headers)
|
||||||
|
response.raise_for_status()
|
||||||
|
return response.text
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Failed to fetch {url}: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 解析 HTML 内容,提取需要的数据
|
||||||
|
def parse_page(html, ethnic):
|
||||||
|
# 手动修复 HTML 标签
|
||||||
|
html = html.replace('<br>', '').replace('<a ', '<a target="_blank" ') # 修复一些不规范标签
|
||||||
|
soup = BeautifulSoup(html, 'lxml') # 使用lxml解析器
|
||||||
|
|
||||||
|
#soup = BeautifulSoup(html, 'html.parser')
|
||||||
|
rows = soup.find_all('div', class_='row headshotrow')
|
||||||
|
flag = False
|
||||||
|
list_cnt = 0
|
||||||
|
|
||||||
|
for row in rows:
|
||||||
|
for col in row.find_all('div', class_='col-lg-2 col-md-3 col-sm-4 col-xs-6'):
|
||||||
|
link_tag = col.find('a')
|
||||||
|
img_tag = col.find('div', class_='pictag')
|
||||||
|
flag = True
|
||||||
|
|
||||||
|
if link_tag and img_tag:
|
||||||
|
href = host_url + link_tag['href']
|
||||||
|
person = img_tag.text.strip()
|
||||||
|
|
||||||
|
# 将数据存储到 ethnic_map
|
||||||
|
ethnic_map.append({
|
||||||
|
'ethnic': ethnic,
|
||||||
|
'person': person,
|
||||||
|
'href': href
|
||||||
|
})
|
||||||
|
list_cnt = list_cnt +1
|
||||||
|
if flag:
|
||||||
|
logging.info(f"get {list_cnt} persons from this page. total persons: {len(ethnic_map)}")
|
||||||
|
return soup
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 处理翻页
|
||||||
|
def handle_pagination(soup, ethnic):
|
||||||
|
next_page = soup.find('a', rel='next')
|
||||||
|
|
||||||
|
if next_page:
|
||||||
|
next_url = host_url + next_page['href']
|
||||||
|
logging.info(f"Found next page: {next_url}")
|
||||||
|
return next_url
|
||||||
|
else:
|
||||||
|
logging.info(f"All pages fetched for {ethnic}.")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 处理带空格的种族名
|
||||||
|
def format_ethnic(ethnic):
|
||||||
|
return ethnic.replace(' ', '+')
|
||||||
|
|
||||||
|
# 主逻辑函数:循环处理每个种族
|
||||||
|
def process_ethnic_data():
|
||||||
|
for ethnic in ethnic_list:
|
||||||
|
url = base_url + format_ethnic(ethnic)
|
||||||
|
next_url = url
|
||||||
|
cursor = int(len(ethnic_map) / 100)
|
||||||
|
logging.info(f"Fetching data for {ethnic}, url {url} ...")
|
||||||
|
|
||||||
|
while next_url:
|
||||||
|
html = fetch_page(next_url)
|
||||||
|
if html:
|
||||||
|
soup = parse_page(html, ethnic)
|
||||||
|
if soup:
|
||||||
|
next_url = handle_pagination(soup, ethnic)
|
||||||
|
else:
|
||||||
|
logging.info(f"wrong html content. retring {next_url} ...")
|
||||||
|
# 定期保存结果
|
||||||
|
if len(ethnic_map) / 100 > cursor:
|
||||||
|
cursor = int(len(ethnic_map) / 100)
|
||||||
|
save_data()
|
||||||
|
time.sleep(2) # 控制访问频率
|
||||||
|
else:
|
||||||
|
logging.info(f"Retrying {next_url} ...")
|
||||||
|
time.sleep(5) # 等待后再重试
|
||||||
|
|
||||||
|
# 保存到文件
|
||||||
|
def save_data():
|
||||||
|
with open(f'{res_dir}/ethnic.json', 'w', encoding='utf-8') as json_file:
|
||||||
|
json.dump(ethnic_map, json_file, indent=4, ensure_ascii=False)
|
||||||
|
|
||||||
|
with open(f'{res_dir}/ethnic.csv', 'w', newline='', encoding='utf-8') as csv_file:
|
||||||
|
writer = csv.DictWriter(csv_file, fieldnames=['ethnic', 'person', 'href'])
|
||||||
|
writer.writeheader()
|
||||||
|
writer.writerows(ethnic_map)
|
||||||
|
|
||||||
|
# 执行主逻辑
|
||||||
|
if __name__ == '__main__':
|
||||||
|
process_ethnic_data()
|
||||||
|
save_data()
|
||||||
|
logging.info("Data fetching and saving completed.")
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
"""
|
||||||
|
Script Name:
|
||||||
|
Description: 从 https://www.iafd.com 上获取信息。利用cloudscraper绕过cloudflare
|
||||||
|
detail_fetch.py 从本地已经保存的列表数据,逐个拉取详情,并输出到文件。
|
||||||
|
list_fetch_astro.py 按照星座拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_birth.py 按照生日拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_ethnic.py 按照人种拉取数据,获得演员的信息列表。数据量大,但详细字段很多无效的
|
||||||
|
list_merge.py 上面三个列表的数据,取交集,得到整体数据。
|
||||||
|
iafd_scrape.py 借助 https://github.com/stashapp/CommunityScrapers 实现的脚本,可以输入演员的 iafd链接,获取兼容 stashapp 格式的数据。(作用不大,因为国籍、照片等字段不匹配)
|
||||||
|
|
||||||
|
html_format.py 负责读取已经保存的html目录, 提取信息,格式化输出。
|
||||||
|
data_merge.py 负责合并数据,它把从 iafd, javhd, thelordofporn 以及搭建 stashapp, 从上面更新到的演员数据(需导出)进行合并;
|
||||||
|
stashdb_merge.py 负责把从stashapp中导出的单个演员的json文件, 批量合并并输出; 通常我们需要把stashapp中导出的批量文件压缩并传输到data/tmp目录,解压后合并
|
||||||
|
从而获取到一份完整的数据列表。
|
||||||
|
|
||||||
|
Author: [Your Name]
|
||||||
|
Created Date: YYYY-MM-DD
|
||||||
|
Last Modified: YYYY-MM-DD
|
||||||
|
Version: 1.0
|
||||||
|
|
||||||
|
Modification History:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
"""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import csv
|
||||||
|
import os
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
# 读取文件并返回内容
|
||||||
|
def read_json(file_path):
|
||||||
|
try:
|
||||||
|
with open(file_path, 'r', encoding='utf-8') as f:
|
||||||
|
return json.load(f)
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"文件 {file_path} 未找到.")
|
||||||
|
return []
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
print(f"文件 {file_path} 解析错误.")
|
||||||
|
return []
|
||||||
|
|
||||||
|
# 处理数据,去重并合并 person 字段
|
||||||
|
def process_data(files):
|
||||||
|
href_map = defaultdict(list)
|
||||||
|
|
||||||
|
# 读取并处理每个文件
|
||||||
|
for file in files:
|
||||||
|
data = read_json(file['path'])
|
||||||
|
for entry in data:
|
||||||
|
href = entry.get('href')
|
||||||
|
person = entry.get('person')
|
||||||
|
if href:
|
||||||
|
href_map[href].append(person)
|
||||||
|
|
||||||
|
# 合并相同 href 的 person,连接用 "|"
|
||||||
|
result = []
|
||||||
|
for href, persons in href_map.items():
|
||||||
|
person = '|'.join(set(persons)) # 去重后合并
|
||||||
|
result.append({'href': href, 'person': person})
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
# 保存结果到JSON文件
|
||||||
|
def save_to_json(data, output_file):
|
||||||
|
with open(output_file, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(data, f, ensure_ascii=False, indent=4)
|
||||||
|
|
||||||
|
# 保存结果到CSV文件
|
||||||
|
def save_to_csv(data, output_file):
|
||||||
|
with open(output_file, 'w', newline='', encoding='utf-8') as f:
|
||||||
|
writer = csv.DictWriter(f, fieldnames=['href', 'person'])
|
||||||
|
writer.writeheader()
|
||||||
|
writer.writerows(data)
|
||||||
|
|
||||||
|
# 主函数,执行数据处理并保存
|
||||||
|
def main():
|
||||||
|
# 定义需要处理的文件
|
||||||
|
files = [
|
||||||
|
{'path': 'result/birth.json', 'name': 'birth'},
|
||||||
|
{'path': 'result/astro.json', 'name': 'astro'},
|
||||||
|
{'path': 'result/ethnic.json', 'name': 'ethnic'}
|
||||||
|
]
|
||||||
|
|
||||||
|
# 处理数据
|
||||||
|
processed_data = process_data(files)
|
||||||
|
|
||||||
|
# 确保 result 目录存在
|
||||||
|
os.makedirs('result', exist_ok=True)
|
||||||
|
|
||||||
|
# 输出结果到 JSON 和 CSV 文件
|
||||||
|
save_to_json(processed_data, 'result/merged.json')
|
||||||
|
save_to_csv(processed_data, 'result/merged.csv')
|
||||||
|
|
||||||
|
print("数据处理完成,结果已保存到 result/merged.json 和 result/merged.csv")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,9 @@
|
|||||||
|
person,href,performer_aka,birthday,astrology,birthplace,gender,years_active,ethnicity,nationality,hair_colors,eye_color,height,weight,measurements,tattoos,piercings
|
||||||
|
Aaliyah,https://www.iafd.com/person.rme/id=50caabcd-c270-4d4a-b80f-2429201f6ff5,No known aliases,01/01/????,Capricorn,US,Trans woman,2006-2007,Black,American,Black/Dark Brown,Unknown,"5 feet, 5 inches (165 cm)",123 lbs (56 kg),No data,No data,No data
|
||||||
|
Amanda Addams,https://www.iafd.com/person.rme/id=67bdb3b8-adf6-4ce5-9278-73a5777b459e,Amanda Adams|Amanda Stone|Camile|Camille|Emily Moore,01/01/????,Capricorn,"New Port Richey, FL",Woman,1990-1997,Caucasian,American,Brown/Red,Unknown,No data,No data,42DD-??-??,Flower with stem and leaves right breast,None
|
||||||
|
Ashley,https://www.iafd.com/person.rme/id=44d0ecd8-c519-40b4-83aa-cdfe9670d238,No known aliases,01/01/????,Capricorn,No data,Trans woman,,Latin,Mexican,,Unknown,No data,No data,No data,No data,No data
|
||||||
|
Daniela Canalis,https://www.iafd.com/person.rme/id=3b2728e0-6eac-4620-8e3f-5086d3cbaa24,Daniele|Danyelle Comini|Isabella Bittencour,01/01/????,Capricorn,"Belo Horizonte, Brazil",Trans woman,2003-2006,Caucasian,Brazilian,,Blue,"5 feet, 5 inches (165 cm)",No data,No data,No data,No data
|
||||||
|
Dream Doll,https://www.iafd.com/person.rme/id=481fd985-9740-4c1b-b794-4620d6528cc1,No known aliases,01/01/????,Capricorn,USA,Trans woman,,Black,American,,Unknown,No data,No data,No data,"""Theresa"" right front shoulder; Stars right lower arm; ""Locked Loyalty"" inner left lower arm; Flower right hip",Right cheekbone
|
||||||
|
Gianna,https://www.iafd.com/person.rme/id=8e22a8e0-e28e-4767-ad74-cae7a1ef6f15,No known aliases,01/01/????,Capricorn,No data,Trans woman,2006-2009,Caucasian,No data,,Unknown,No data,No data,No data,No data,No data
|
||||||
|
Kirsten,https://www.iafd.com/person.rme/id=ca699282-1b57-4ce7-9bcc-d7799a292e34,Kirsten Claudia|Trish,01/01/????,Capricorn,No data,Trans woman,,Latin,No data,Black/Brown/Light Brown,Unknown,No data,No data,36DD-24-35,No data,No data
|
||||||
|
Maya,https://www.iafd.com/person.rme/id=fae84552-50cf-494b-b34f-a22e1a669fd9,No known aliases,01/01/????,Capricorn,No data,Trans woman,,Latin/Multi-ethnic,No data,Black/Dark Brown,Unknown,"5 feet, 5 inches (165 cm)",125 lbs (57 kg),No data,No data,No data
|
||||||
|
@@ -0,0 +1,169 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=50caabcd-c270-4d4a-b80f-2429201f6ff5",
|
||||||
|
"person": "Aaliyah",
|
||||||
|
"performer_aka": [
|
||||||
|
"No known aliases"
|
||||||
|
],
|
||||||
|
"birthday": "01/01/????",
|
||||||
|
"astrology": "Capricorn",
|
||||||
|
"birthplace": "US",
|
||||||
|
"gender": "Trans woman",
|
||||||
|
"years_active": "2006-2007",
|
||||||
|
"ethnicity": "Black",
|
||||||
|
"nationality": "American",
|
||||||
|
"hair_colors": "Black/Dark Brown",
|
||||||
|
"eye_color": "Unknown",
|
||||||
|
"height": "5 feet, 5 inches (165 cm)",
|
||||||
|
"weight": "123 lbs (56 kg)",
|
||||||
|
"measurements": "No data",
|
||||||
|
"tattoos": "No data",
|
||||||
|
"piercings": "No data"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=67bdb3b8-adf6-4ce5-9278-73a5777b459e",
|
||||||
|
"person": "Amanda Addams",
|
||||||
|
"performer_aka": [
|
||||||
|
"Amanda Adams",
|
||||||
|
"Amanda Stone",
|
||||||
|
"Camile",
|
||||||
|
"Camille",
|
||||||
|
"Emily Moore"
|
||||||
|
],
|
||||||
|
"birthday": "01/01/????",
|
||||||
|
"astrology": "Capricorn",
|
||||||
|
"birthplace": "New Port Richey, FL",
|
||||||
|
"gender": "Woman",
|
||||||
|
"years_active": "1990-1997",
|
||||||
|
"ethnicity": "Caucasian",
|
||||||
|
"nationality": "American",
|
||||||
|
"hair_colors": "Brown/Red",
|
||||||
|
"eye_color": "Unknown",
|
||||||
|
"height": "No data",
|
||||||
|
"weight": "No data",
|
||||||
|
"measurements": "42DD-??-??",
|
||||||
|
"tattoos": "Flower with stem and leaves right breast",
|
||||||
|
"piercings": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=44d0ecd8-c519-40b4-83aa-cdfe9670d238",
|
||||||
|
"person": "Ashley",
|
||||||
|
"performer_aka": [
|
||||||
|
"No known aliases"
|
||||||
|
],
|
||||||
|
"birthday": "01/01/????",
|
||||||
|
"astrology": "Capricorn",
|
||||||
|
"birthplace": "No data",
|
||||||
|
"gender": "Trans woman",
|
||||||
|
"ethnicity": "Latin",
|
||||||
|
"nationality": "Mexican",
|
||||||
|
"eye_color": "Unknown",
|
||||||
|
"height": "No data",
|
||||||
|
"weight": "No data",
|
||||||
|
"measurements": "No data",
|
||||||
|
"tattoos": "No data",
|
||||||
|
"piercings": "No data"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=3b2728e0-6eac-4620-8e3f-5086d3cbaa24",
|
||||||
|
"person": "Daniela Canalis",
|
||||||
|
"performer_aka": [
|
||||||
|
"Daniele",
|
||||||
|
"Danyelle Comini",
|
||||||
|
"Isabella Bittencour"
|
||||||
|
],
|
||||||
|
"birthday": "01/01/????",
|
||||||
|
"astrology": "Capricorn",
|
||||||
|
"birthplace": "Belo Horizonte, Brazil",
|
||||||
|
"gender": "Trans woman",
|
||||||
|
"years_active": "2003-2006",
|
||||||
|
"ethnicity": "Caucasian",
|
||||||
|
"nationality": "Brazilian",
|
||||||
|
"eye_color": "Blue",
|
||||||
|
"height": "5 feet, 5 inches (165 cm)",
|
||||||
|
"weight": "No data",
|
||||||
|
"measurements": "No data",
|
||||||
|
"tattoos": "No data",
|
||||||
|
"piercings": "No data"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=481fd985-9740-4c1b-b794-4620d6528cc1",
|
||||||
|
"person": "Dream Doll",
|
||||||
|
"performer_aka": [
|
||||||
|
"No known aliases"
|
||||||
|
],
|
||||||
|
"birthday": "01/01/????",
|
||||||
|
"astrology": "Capricorn",
|
||||||
|
"birthplace": "USA",
|
||||||
|
"gender": "Trans woman",
|
||||||
|
"ethnicity": "Black",
|
||||||
|
"nationality": "American",
|
||||||
|
"eye_color": "Unknown",
|
||||||
|
"height": "No data",
|
||||||
|
"weight": "No data",
|
||||||
|
"measurements": "No data",
|
||||||
|
"tattoos": "\"Theresa\" right front shoulder; Stars right lower arm; \"Locked Loyalty\" inner left lower arm; Flower right hip",
|
||||||
|
"piercings": "Right cheekbone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=8e22a8e0-e28e-4767-ad74-cae7a1ef6f15",
|
||||||
|
"person": "Gianna",
|
||||||
|
"performer_aka": [
|
||||||
|
"No known aliases"
|
||||||
|
],
|
||||||
|
"birthday": "01/01/????",
|
||||||
|
"astrology": "Capricorn",
|
||||||
|
"birthplace": "No data",
|
||||||
|
"gender": "Trans woman",
|
||||||
|
"years_active": "2006-2009",
|
||||||
|
"ethnicity": "Caucasian",
|
||||||
|
"nationality": "No data",
|
||||||
|
"eye_color": "Unknown",
|
||||||
|
"height": "No data",
|
||||||
|
"weight": "No data",
|
||||||
|
"measurements": "No data",
|
||||||
|
"tattoos": "No data",
|
||||||
|
"piercings": "No data"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=ca699282-1b57-4ce7-9bcc-d7799a292e34",
|
||||||
|
"person": "Kirsten",
|
||||||
|
"performer_aka": [
|
||||||
|
"Kirsten Claudia",
|
||||||
|
"Trish"
|
||||||
|
],
|
||||||
|
"birthday": "01/01/????",
|
||||||
|
"astrology": "Capricorn",
|
||||||
|
"birthplace": "No data",
|
||||||
|
"gender": "Trans woman",
|
||||||
|
"ethnicity": "Latin",
|
||||||
|
"nationality": "No data",
|
||||||
|
"hair_colors": "Black/Brown/Light Brown",
|
||||||
|
"eye_color": "Unknown",
|
||||||
|
"height": "No data",
|
||||||
|
"weight": "No data",
|
||||||
|
"measurements": "36DD-24-35",
|
||||||
|
"tattoos": "No data",
|
||||||
|
"piercings": "No data"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=fae84552-50cf-494b-b34f-a22e1a669fd9",
|
||||||
|
"person": "Maya",
|
||||||
|
"performer_aka": [
|
||||||
|
"No known aliases"
|
||||||
|
],
|
||||||
|
"birthday": "01/01/????",
|
||||||
|
"astrology": "Capricorn",
|
||||||
|
"birthplace": "No data",
|
||||||
|
"gender": "Trans woman",
|
||||||
|
"ethnicity": "Latin/Multi-ethnic",
|
||||||
|
"nationality": "No data",
|
||||||
|
"hair_colors": "Black/Dark Brown",
|
||||||
|
"eye_color": "Unknown",
|
||||||
|
"height": "5 feet, 5 inches (165 cm)",
|
||||||
|
"weight": "125 lbs (57 kg)",
|
||||||
|
"measurements": "No data",
|
||||||
|
"tattoos": "No data",
|
||||||
|
"piercings": "No data"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
ethnic,person,href
|
||||||
|
caucasian,_Xxxcsr,https://www.iafd.com/person.rme/id=e989e91a-280b-4628-b79f-1e79653e5686
|
||||||
|
caucasian,00_CUM,https://www.iafd.com/person.rme/id=b0d3d280-c4a1-4723-825e-b87054cc6db4
|
||||||
|
caucasian,10inchdaddy22,https://www.iafd.com/person.rme/id=e532100a-94c8-487b-9b63-28a243ee5f1c
|
||||||
|
caucasian,19yr Old Hole,https://www.iafd.com/person.rme/id=f7873838-8dca-4c6c-87d8-324b440bdf90
|
||||||
|
caucasian,1FFuntop,https://www.iafd.com/person.rme/id=0a4d9829-8642-4de0-b69a-efc8ef75b65a
|
||||||
|
caucasian,2ItalianPigs-1,https://www.iafd.com/person.rme/id=fe6e2401-ff29-432f-a056-3045e92c210e
|
||||||
|
caucasian,2ItalianPigs-2,https://www.iafd.com/person.rme/id=ef1c102d-ec28-4711-a4ca-2dbc7ccde95c
|
||||||
|
caucasian,2Ply,https://www.iafd.com/person.rme/id=9cba7067-aaba-4354-be81-3801e0b49e3c
|
||||||
|
caucasian,314,https://www.iafd.com/person.rme/id=7e8e91f7-6a20-47e5-a104-9bf214bfcd93
|
||||||
|
caucasian,412,https://www.iafd.com/person.rme/id=6d5b3ee3-2c5c-4c5b-97cc-a4403c3099e5
|
||||||
|
caucasian,4satisffaction,https://www.iafd.com/person.rme/id=38519408-e982-4946-8552-6c65a7173c41
|
||||||
|
caucasian,500,https://www.iafd.com/person.rme/id=ec91e07f-2b3c-4395-b8fd-714ef5df0dc2
|
||||||
|
caucasian,6ft Phenom,https://www.iafd.com/person.rme/id=ebb969f3-ded3-4a51-8f4b-c75e2ff888ff
|
||||||
|
caucasian,A. Cherry,https://www.iafd.com/person.rme/id=d2afd63e-8671-4cb0-986a-80857be3bd22
|
||||||
|
caucasian,A. J.,https://www.iafd.com/person.rme/id=680441cb-473e-447d-b7c1-3a535d1907e3
|
||||||
|
caucasian,A. J.,https://www.iafd.com/person.rme/id=fc9ca6eb-dd4c-4981-974c-795c882562d0
|
||||||
|
caucasian,A. Jay Popoff,https://www.iafd.com/person.rme/id=d0d78f5c-f02e-493c-a8e7-8267b51c3e74
|
||||||
|
caucasian,A. Monkey,https://www.iafd.com/person.rme/id=ede17c7e-5fda-47e6-87a8-743dc96c3616
|
||||||
|
caucasian,A. Sebastian Grant,https://www.iafd.com/person.rme/id=f605a2ed-eb28-435e-9778-229afedb415d
|
||||||
|
caucasian,A.C.,https://www.iafd.com/person.rme/id=49e8da8e-6ff1-451f-9e17-2245e584ced5
|
||||||
|
caucasian,A.J.,https://www.iafd.com/person.rme/id=bddc3d19-d238-4c23-916d-b9a924342e25
|
||||||
|
caucasian,A.J.,https://www.iafd.com/person.rme/id=5a9dc024-d304-467d-8c77-2feeba6bbe6b
|
||||||
|
caucasian,A.J.,https://www.iafd.com/person.rme/id=186076fa-d889-4763-bf95-8a8e513a902d
|
||||||
|
caucasian,A.J.,https://www.iafd.com/person.rme/id=046c0d17-88b1-4353-aa66-e4836d826a39
|
||||||
|
caucasian,A.J.,https://www.iafd.com/person.rme/id=f0bf186a-8e21-4280-93c7-f14b67e0b99f
|
||||||
|
caucasian,A.J.,https://www.iafd.com/person.rme/id=f97d3b40-f263-4f7f-bc18-d7237ff742d5
|
||||||
|
caucasian,A.J.,https://www.iafd.com/person.rme/id=9360079c-b1eb-4e04-acee-157e3194e864
|
||||||
|
caucasian,A.J. Addams,https://www.iafd.com/person.rme/id=968f6684-868c-41a5-8c09-56cd3ade1e9e
|
||||||
|
caucasian,A.J. Alexander,https://www.iafd.com/person.rme/id=1c1ede7e-6b9d-4620-bb1c-2542cda4de5e
|
||||||
|
caucasian,A.J. Applegate,https://www.iafd.com/person.rme/id=beae8520-e7c1-419c-be66-8d9675ed0786
|
||||||
|
caucasian,A.J. Bailey,https://www.iafd.com/person.rme/id=19c0ba4f-bad3-4213-8f78-6a68a7602f70
|
||||||
|
caucasian,A.J. Chambers,https://www.iafd.com/person.rme/id=959de668-c69d-4ac3-9004-556e82751ec7
|
||||||
|
caucasian,A.J. Harwood,https://www.iafd.com/person.rme/id=dd1d185d-c7d9-4b60-8176-08b9d1976fd5
|
||||||
|
caucasian,A.J. Long,https://www.iafd.com/person.rme/id=b6ac2c53-5858-4f1f-9a7f-15c81b21149b
|
||||||
|
caucasian,A.J. Long,https://www.iafd.com/person.rme/id=8ab1f8da-093e-4996-8363-f21032dd9240
|
||||||
|
caucasian,A.J. Lynn,https://www.iafd.com/person.rme/id=17322f3f-19e1-44a4-8dfb-fcb8cab90635
|
||||||
|
caucasian,A.J. Martin Jr.,https://www.iafd.com/person.rme/id=b457b4a5-f25f-47af-aaf6-7217ad493fc7
|
||||||
|
caucasian,A.J. Pup,https://www.iafd.com/person.rme/id=219829d8-25e9-41c6-9fe4-b426efdf07cb
|
||||||
|
caucasian,A.J. Rider,https://www.iafd.com/person.rme/id=ce6fbb62-932c-478f-b006-810d6acf1970
|
||||||
|
caucasian,A.J. Steele,https://www.iafd.com/person.rme/id=4bc0502f-e362-4894-a02d-042d380f1255
|
||||||
|
caucasian,A.J. Sylvester,https://www.iafd.com/person.rme/id=a336dafd-dc39-4a2c-b38e-4090045136db
|
||||||
|
caucasian,A.K. Honey,https://www.iafd.com/person.rme/id=9dd95bb1-4fe7-447b-9578-eeac9854fefe
|
||||||
|
caucasian,A.M. Hall,https://www.iafd.com/person.rme/id=2922c3f7-f4f5-4134-87f1-4cbc3e943263
|
||||||
|
caucasian,A.S. Spumpin,https://www.iafd.com/person.rme/id=7949ad9c-ca3a-4b86-8ac0-d6f1c6916ee5
|
||||||
|
caucasian,Aaden Stark,https://www.iafd.com/person.rme/id=da17f06e-2582-424b-9d85-bb1b6ce4ea46
|
||||||
|
caucasian,Aali Kali,https://www.iafd.com/person.rme/id=49aaca01-af5b-40b8-a170-51f71656de6e
|
||||||
|
caucasian,Aaliyah Ca Pelle,https://www.iafd.com/person.rme/id=8c93d76f-2d7a-4e00-a776-9cf77db9e5fa
|
||||||
|
caucasian,Aaliyah Jolie,https://www.iafd.com/person.rme/id=022d49de-b755-41e9-a326-31470f608aee
|
||||||
|
caucasian,Aaliyah Love,https://www.iafd.com/person.rme/id=56a39956-f447-4e7d-afdc-eb57d345a0e6
|
||||||
|
caucasian,Aaliyah Marie,https://www.iafd.com/person.rme/id=7209eacf-6809-43a3-b12e-a34e11978ce0
|
||||||
|
caucasian,Aaliyah May,https://www.iafd.com/person.rme/id=66dcfc26-1168-4d49-8ed0-9265999dc9b9
|
||||||
|
caucasian,Aaliyah Taylor,https://www.iafd.com/person.rme/id=09e02ce8-265b-4032-85ff-9274882a03c9
|
||||||
|
caucasian,Aami,https://www.iafd.com/person.rme/id=bd23fe38-a789-42c2-a52d-bfcc749f6988
|
||||||
|
caucasian,Aana,https://www.iafd.com/person.rme/id=83bf092e-04df-47d3-bffb-4bf944f5e8d5
|
||||||
|
caucasian,Aaralyn,https://www.iafd.com/person.rme/id=0ca0335e-5e5a-44ff-9341-2945417c7159
|
||||||
|
caucasian,Aaralyn Barra,https://www.iafd.com/person.rme/id=12961b1a-4eeb-4de6-b7b6-7af309e98e0d
|
||||||
|
caucasian,Aariah James,https://www.iafd.com/person.rme/id=7c493883-acb1-4926-a7ac-f2539b247951
|
||||||
|
caucasian,Aarielle Alexis,https://www.iafd.com/person.rme/id=81b89f83-32bb-47cf-8a52-6dea4c6f8546
|
||||||
|
caucasian,Aarin Asker,https://www.iafd.com/person.rme/id=a9804ca2-0442-4509-8b7d-52d7fb63b86c
|
||||||
|
caucasian,Aarlyn Jewel,https://www.iafd.com/person.rme/id=2eadade6-5925-470c-a4f9-62cf137f3dc6
|
||||||
|
caucasian,Aarol Renti,https://www.iafd.com/person.rme/id=d132694b-cfa6-44b7-a6ec-5c5728a9152b
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=0bcf2f14-59e7-42b5-ab98-3b72ca8e78d1
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=14c3d85d-fb19-46e6-b783-12d69aef8cfd
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=a795d407-bbd1-4865-972a-4154e3ac87ea
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=ab69ae52-40c1-4934-baa0-f8736e4dec96
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=b87828e6-dfd3-4a2e-990f-2d32b45a22b2
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=bde4a973-aedb-41d2-b0db-7125abff8388
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=13dd1882-177a-45a9-a9a0-2d943270889a
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=ef72fc4f-e4f1-4528-ac76-8b0a791d403d
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=2fef44bd-09f8-4c19-8b6e-da40977eed38
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=34c1a5b2-db2a-4ad6-b86b-b8a3955f2531
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=c291debc-b09f-45d2-b025-15c63ac8dc1c
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=249eb49d-8c9c-4315-8013-5c1e5b90f066
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=48f35b7e-5959-4f61-a3a6-af9d864ebb56
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=31d7393c-e4c0-4819-99e2-827e68c5b3fd
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=adae952d-1a54-43f5-9a07-1c929e460b9c
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=0ba79587-bb74-47f5-a697-28cf0325271d
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=1765cd87-2f1d-4029-a980-75b0b57a0de6
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=a6b539e5-e1be-4aab-8321-1e498ce1886a
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=8f51cb33-715c-42fb-b557-c79447e9d8de
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=2be9c6ce-7c7e-42be-8f1b-ff23ea4b8f0c
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=7ae847fa-f3fa-4aac-8b9a-590b28ec7ece
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=32723ada-239d-448c-afc2-b53d6efe7119
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=e82090a3-cad4-42ae-bbd3-8cbc81f302ed
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=02a276a7-7cfb-495a-b259-c4ced018dfb8
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=aca9732b-93ec-4df8-9b05-f7d082a3a2e7
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=cc0c006c-5418-4c73-8e3d-ad7fd20f8a4a
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=222209d8-35ae-4897-b943-5b9fa37fa349
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=0bd712f9-1c83-4725-81f7-889264c73130
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=baa2df10-3ff8-40b6-8564-496ad4a0896c
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=1ad5029e-0943-4220-9eae-64db6d330037
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=ae6a0389-e608-4341-aa8a-0aa58f041429
|
||||||
|
caucasian,Aaron,https://www.iafd.com/person.rme/id=2c740488-9456-4c3f-8aa1-9f4088d57b60
|
||||||
|
caucasian,Aaron Action,https://www.iafd.com/person.rme/id=0cf3cb49-9a04-4415-9631-1f3e3a321a0c
|
||||||
|
caucasian,Aaron Adams,https://www.iafd.com/person.rme/id=a7eaefab-fbf8-4df9-b231-a926028cb6de
|
||||||
|
caucasian,Aaron Allen,https://www.iafd.com/person.rme/id=a05d5004-7e12-4841-806b-b755dbb44822
|
||||||
|
caucasian,Aaron Anderson,https://www.iafd.com/person.rme/id=bfc896f4-bb66-4c52-b7a1-9ded6179927e
|
||||||
|
caucasian,Aaron Anderson,https://www.iafd.com/person.rme/id=e54cef38-e5c5-4941-905c-bb7166113197
|
||||||
|
caucasian,Aaron Anderson,https://www.iafd.com/person.rme/id=f3227b3b-a412-4d85-8f33-b45250dd816f
|
||||||
|
caucasian,Aaron Andrews,https://www.iafd.com/person.rme/id=f3a67900-7e41-42c0-9d51-10fb93029456
|
||||||
|
caucasian,Aaron Anthony,https://www.iafd.com/person.rme/id=763f8ab6-3d73-443f-bfdf-e427a376fc9d
|
||||||
|
caucasian,Aaron Arres,https://www.iafd.com/person.rme/id=52617535-4a26-4509-bfb9-61c850607cd8
|
||||||
|
caucasian,Aaron Ashford,https://www.iafd.com/person.rme/id=0f879da6-7571-4f40-b477-bffe86c98b63
|
||||||
|
caucasian,Aaron Aubrey,https://www.iafd.com/person.rme/id=41dcda94-e5e9-40f6-8bc9-e016496b28e2
|
||||||
|
caucasian,Aaron Aurora,https://www.iafd.com/person.rme/id=5a8010f7-303f-49d7-83e0-2fa51ae328e8
|
||||||
|
caucasian,Aaron Austin,https://www.iafd.com/person.rme/id=7b47ce4c-7772-48d6-8e00-0c9fcc79e6f5
|
||||||
|
caucasian,Aaron Baker,https://www.iafd.com/person.rme/id=5329d1a6-60f1-4a15-a3e6-7d33ace73a9b
|
||||||
|
caucasian,Aaron Blake,https://www.iafd.com/person.rme/id=677c3d1e-c527-41c4-9be9-b4f0aaef2cdf
|
||||||
|
caucasian,Aaron Brady,https://www.iafd.com/person.rme/id=12d3f5b4-6126-4c7f-9f05-158a35396b01
|
||||||
|
caucasian,Aaron Brags,https://www.iafd.com/person.rme/id=0ac6898f-e6e3-4c01-8b4e-608010266bcf
|
||||||
|
caucasian,Aaron Brandt,https://www.iafd.com/person.rme/id=a9d33459-f5df-44da-a9f4-f0dbbbb96388
|
||||||
|
caucasian,Aaron Bruiser,https://www.iafd.com/person.rme/id=4e8e3dbf-bf78-499f-8181-24e7975248c3
|
||||||
|
caucasian,Aaron Buns,https://www.iafd.com/person.rme/id=08d448a5-ccc0-4b09-a595-7687f3ce69c0
|
||||||
|
caucasian,Aaron Burke,https://www.iafd.com/person.rme/id=da4f84c3-5a72-45c3-9b82-8204ed8a05ee
|
||||||
|
caucasian,Aaron Burns,https://www.iafd.com/person.rme/id=f65e6ef9-5b38-49b1-bab9-89cfd1c6fe4a
|
||||||
|
caucasian,Aaron Cage,https://www.iafd.com/person.rme/id=993af443-e658-4301-a87a-c661cb59bbc4
|
||||||
|
caucasian,Aaron Carpenter,https://www.iafd.com/person.rme/id=b1ef40c7-d950-47b3-b0a5-969c849292b4
|
||||||
|
caucasian,Aaron Chambers,https://www.iafd.com/person.rme/id=8f5d2120-2962-4691-a0a6-5c970ab98172
|
||||||
|
caucasian,Aaron Clayton,https://www.iafd.com/person.rme/id=60335579-134f-4abe-b1b1-9bc3144fe212
|
||||||
|
caucasian,Aaron Colt,https://www.iafd.com/person.rme/id=d85d624e-17d3-4378-8e2b-b188da56ef3d
|
||||||
|
caucasian,Aaron Cox,https://www.iafd.com/person.rme/id=72f132a7-e0ff-45b2-8f86-3e7ce6b12d70
|
||||||
|
caucasian,Aaron Coxx,https://www.iafd.com/person.rme/id=7157bff9-cfc0-447c-84a2-f1e7872ab9ab
|
||||||
|
caucasian,Aaron Daniels,https://www.iafd.com/person.rme/id=f567c8ff-4300-46b0-92f2-b45326a6dcd0
|
||||||
|
caucasian,Aaron Daniels,https://www.iafd.com/person.rme/id=ce866d5d-dd1c-479a-b9fc-b5d7a3ca241f
|
||||||
|
caucasian,Aaron Daniels,https://www.iafd.com/person.rme/id=c4952b70-085e-4895-9ccd-399fa0dcdffe
|
||||||
|
caucasian,Aaron Dickson,https://www.iafd.com/person.rme/id=cad33743-6af6-451e-8c0f-b78c6cc0ef79
|
||||||
|
caucasian,Aaron Diesel,https://www.iafd.com/person.rme/id=acad35f2-a5c7-4d50-b4ce-cb777b0d66ca
|
||||||
|
caucasian,Aaron Donlough,https://www.iafd.com/person.rme/id=0b56fefc-692e-48fa-a188-18ea295ded65
|
||||||
|
caucasian,Aaron Elias,https://www.iafd.com/person.rme/id=a6582f00-ab75-4c9e-9f95-1c04ef524e89
|
||||||
|
caucasian,Aaron Ereon,https://www.iafd.com/person.rme/id=71fd05d1-13f0-45d2-95d4-bb6159cce86a
|
||||||
|
caucasian,Aaron Evans,https://www.iafd.com/person.rme/id=64d26615-a159-437a-81f9-f61ad689be8a
|
||||||
|
caucasian,Aaron French,https://www.iafd.com/person.rme/id=d4a6a561-e998-4894-9d3c-f4e427940efc
|
||||||
|
caucasian,Aaron Gage,https://www.iafd.com/person.rme/id=51ea6379-4edc-431e-baaa-39104fc995cd
|
||||||
|
caucasian,Aaron Galloway,https://www.iafd.com/person.rme/id=d659207f-f1d8-437d-aee8-66d1413f8938
|
||||||
|
caucasian,Aaron Garrett,https://www.iafd.com/person.rme/id=579699d8-562b-4b4b-b236-e7ab4416e52f
|
||||||
|
caucasian,Aaron Giant,https://www.iafd.com/person.rme/id=7b12e8c8-f210-4de1-a3ec-50aa39d11130
|
||||||
|
caucasian,Aaron Goldsmith,https://www.iafd.com/person.rme/id=bcd06596-521e-4e70-a976-5467f77acf15
|
||||||
|
caucasian,Aaron Griffin,https://www.iafd.com/person.rme/id=b93473fe-35f3-44a3-8e6d-3dd2e6d6069b
|
||||||
|
caucasian,Aaron Griffith,https://www.iafd.com/person.rme/id=adef4c93-70ef-42b1-b164-87e3443dbbb8
|
||||||
|
caucasian,Aaron Gunner,https://www.iafd.com/person.rme/id=22e50169-ba71-4ab9-b885-39bd2b1826fe
|
||||||
|
caucasian,Aaron Hartley,https://www.iafd.com/person.rme/id=964ad0d2-fe8e-4c17-8448-e90d4c4ede22
|
||||||
|
caucasian,Aaron Hawke,https://www.iafd.com/person.rme/id=baaf5c00-1dad-4216-9a1b-a3528262ae7e
|
||||||
|
caucasian,Aaron Heights,https://www.iafd.com/person.rme/id=8725e56d-1d69-41b4-91a1-3dcf723066d9
|
||||||
|
caucasian,Aaron Hunter,https://www.iafd.com/person.rme/id=e740bb9d-a8d4-423c-8b79-deb9fd2b8fb4
|
||||||
|
caucasian,Aaron Jackobs,https://www.iafd.com/person.rme/id=6a9399b2-accd-47de-87ed-638a605718fe
|
||||||
|
caucasian,Aaron Jackson,https://www.iafd.com/person.rme/id=eab8a8d4-7f47-4bcd-a674-ac05cec184bf
|
||||||
|
caucasian,Aaron Jacobs,https://www.iafd.com/person.rme/id=212e25cb-6433-4844-97d2-74e468527f88
|
||||||
|
caucasian,Aaron James,https://www.iafd.com/person.rme/id=a92f35f3-6e11-4e1a-a359-1688eacef54b
|
||||||
|
caucasian,Aaron Jay,https://www.iafd.com/person.rme/id=4821c613-c9c1-4d03-8eb3-da1e142d38b9
|
||||||
|
caucasian,Aaron Kellar,https://www.iafd.com/person.rme/id=4a11c374-bd8b-43d5-9617-d494fa544c8b
|
||||||
|
caucasian,Aaron Kelly,https://www.iafd.com/person.rme/id=2349a3f9-3d6b-4bf0-8346-fa42a420f4dc
|
||||||
|
caucasian,Aaron Kicks,https://www.iafd.com/person.rme/id=dd6b5da8-8752-4a95-b5f9-8a103fa6c32a
|
||||||
|
caucasian,Aaron King,https://www.iafd.com/person.rme/id=091c022f-8a61-40d8-ac20-a4ffdf19abec
|
||||||
|
caucasian,Aaron Kline,https://www.iafd.com/person.rme/id=00427092-cb65-4f9d-8fa1-82952cdde94f
|
||||||
|
caucasian,Aaron Lamb,https://www.iafd.com/person.rme/id=bbe41e10-ccec-4263-b097-dd12ca037c77
|
||||||
|
caucasian,Aaron Landcaster,https://www.iafd.com/person.rme/id=bc136a34-c749-482c-8a62-ea175a3a1c09
|
||||||
|
caucasian,Aaron Lautner,https://www.iafd.com/person.rme/id=b9009df9-a668-45ae-b54f-225c3ec137b7
|
||||||
|
caucasian,Aaron Lennox,https://www.iafd.com/person.rme/id=6487b44e-3b01-4cdc-9361-46a003892503
|
||||||
|
caucasian,Aaron Light,https://www.iafd.com/person.rme/id=cf68690a-a911-4679-8cc4-a3b8ad090acc
|
||||||
|
caucasian,Aaron London,https://www.iafd.com/person.rme/id=795300a8-ac6a-468d-ba81-fce65b3bf963
|
||||||
|
caucasian,Aaron Luk,https://www.iafd.com/person.rme/id=1946f47d-1724-4796-a7a3-1bc45c7444dc
|
||||||
|
caucasian,Aaron Machi,https://www.iafd.com/person.rme/id=a10cce9b-d8d6-46ef-9eec-cd5a1040a5f0
|
||||||
|
caucasian,Aaron Maldini,https://www.iafd.com/person.rme/id=955716e4-6c9c-4bb2-b90b-e0294364fc03
|
||||||
|
caucasian,Aaron Manson,https://www.iafd.com/person.rme/id=55ecc9c3-d061-4850-b43c-cab8c0c8e246
|
||||||
|
caucasian,Aaron Mark,https://www.iafd.com/person.rme/id=3c847bf4-8d4a-4d66-89ef-d06a26cc2427
|
||||||
|
caucasian,Aaron Martin,https://www.iafd.com/person.rme/id=d85ee393-f35b-4f93-a429-ea8a2bd077ae
|
||||||
|
caucasian,Aaron Master,https://www.iafd.com/person.rme/id=0ae3fc18-85e2-49f9-91b5-7429751ae2f9
|
||||||
|
caucasian,Aaron Michaels,https://www.iafd.com/person.rme/id=e429e641-9a06-4e25-af3b-b60b78989ac6
|
||||||
|
@@ -0,0 +1,842 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "_Xxxcsr",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=e989e91a-280b-4628-b79f-1e79653e5686"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "00_CUM",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=b0d3d280-c4a1-4723-825e-b87054cc6db4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "10inchdaddy22",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=e532100a-94c8-487b-9b63-28a243ee5f1c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "19yr Old Hole",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=f7873838-8dca-4c6c-87d8-324b440bdf90"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "1FFuntop",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=0a4d9829-8642-4de0-b69a-efc8ef75b65a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "2ItalianPigs-1",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=fe6e2401-ff29-432f-a056-3045e92c210e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "2ItalianPigs-2",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=ef1c102d-ec28-4711-a4ca-2dbc7ccde95c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "2Ply",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=9cba7067-aaba-4354-be81-3801e0b49e3c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "314",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=7e8e91f7-6a20-47e5-a104-9bf214bfcd93"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "412",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=6d5b3ee3-2c5c-4c5b-97cc-a4403c3099e5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "4satisffaction",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=38519408-e982-4946-8552-6c65a7173c41"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "500",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=ec91e07f-2b3c-4395-b8fd-714ef5df0dc2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "6ft Phenom",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=ebb969f3-ded3-4a51-8f4b-c75e2ff888ff"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A. Cherry",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=d2afd63e-8671-4cb0-986a-80857be3bd22"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A. J.",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=680441cb-473e-447d-b7c1-3a535d1907e3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A. J.",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=fc9ca6eb-dd4c-4981-974c-795c882562d0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A. Jay Popoff",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=d0d78f5c-f02e-493c-a8e7-8267b51c3e74"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A. Monkey",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=ede17c7e-5fda-47e6-87a8-743dc96c3616"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A. Sebastian Grant",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=f605a2ed-eb28-435e-9778-229afedb415d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.C.",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=49e8da8e-6ff1-451f-9e17-2245e584ced5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J.",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=bddc3d19-d238-4c23-916d-b9a924342e25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J.",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=5a9dc024-d304-467d-8c77-2feeba6bbe6b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J.",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=186076fa-d889-4763-bf95-8a8e513a902d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J.",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=046c0d17-88b1-4353-aa66-e4836d826a39"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J.",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=f0bf186a-8e21-4280-93c7-f14b67e0b99f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J.",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=f97d3b40-f263-4f7f-bc18-d7237ff742d5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J.",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=9360079c-b1eb-4e04-acee-157e3194e864"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Addams",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=968f6684-868c-41a5-8c09-56cd3ade1e9e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Alexander",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=1c1ede7e-6b9d-4620-bb1c-2542cda4de5e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Applegate",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=beae8520-e7c1-419c-be66-8d9675ed0786"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Bailey",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=19c0ba4f-bad3-4213-8f78-6a68a7602f70"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Chambers",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=959de668-c69d-4ac3-9004-556e82751ec7"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Harwood",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=dd1d185d-c7d9-4b60-8176-08b9d1976fd5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Long",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=b6ac2c53-5858-4f1f-9a7f-15c81b21149b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Long",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=8ab1f8da-093e-4996-8363-f21032dd9240"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Lynn",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=17322f3f-19e1-44a4-8dfb-fcb8cab90635"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Martin Jr.",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=b457b4a5-f25f-47af-aaf6-7217ad493fc7"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Pup",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=219829d8-25e9-41c6-9fe4-b426efdf07cb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Rider",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=ce6fbb62-932c-478f-b006-810d6acf1970"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Steele",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=4bc0502f-e362-4894-a02d-042d380f1255"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.J. Sylvester",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=a336dafd-dc39-4a2c-b38e-4090045136db"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.K. Honey",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=9dd95bb1-4fe7-447b-9578-eeac9854fefe"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.M. Hall",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=2922c3f7-f4f5-4134-87f1-4cbc3e943263"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "A.S. Spumpin",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=7949ad9c-ca3a-4b86-8ac0-d6f1c6916ee5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaden Stark",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=da17f06e-2582-424b-9d85-bb1b6ce4ea46"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aali Kali",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=49aaca01-af5b-40b8-a170-51f71656de6e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaliyah Ca Pelle",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=8c93d76f-2d7a-4e00-a776-9cf77db9e5fa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaliyah Jolie",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=022d49de-b755-41e9-a326-31470f608aee"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaliyah Love",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=56a39956-f447-4e7d-afdc-eb57d345a0e6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaliyah Marie",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=7209eacf-6809-43a3-b12e-a34e11978ce0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaliyah May",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=66dcfc26-1168-4d49-8ed0-9265999dc9b9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaliyah Taylor",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=09e02ce8-265b-4032-85ff-9274882a03c9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aami",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=bd23fe38-a789-42c2-a52d-bfcc749f6988"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aana",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=83bf092e-04df-47d3-bffb-4bf944f5e8d5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaralyn",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=0ca0335e-5e5a-44ff-9341-2945417c7159"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaralyn Barra",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=12961b1a-4eeb-4de6-b7b6-7af309e98e0d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aariah James",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=7c493883-acb1-4926-a7ac-f2539b247951"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aarielle Alexis",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=81b89f83-32bb-47cf-8a52-6dea4c6f8546"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aarin Asker",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=a9804ca2-0442-4509-8b7d-52d7fb63b86c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aarlyn Jewel",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=2eadade6-5925-470c-a4f9-62cf137f3dc6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aarol Renti",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=d132694b-cfa6-44b7-a6ec-5c5728a9152b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=0bcf2f14-59e7-42b5-ab98-3b72ca8e78d1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=14c3d85d-fb19-46e6-b783-12d69aef8cfd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=a795d407-bbd1-4865-972a-4154e3ac87ea"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=ab69ae52-40c1-4934-baa0-f8736e4dec96"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=b87828e6-dfd3-4a2e-990f-2d32b45a22b2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=bde4a973-aedb-41d2-b0db-7125abff8388"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=13dd1882-177a-45a9-a9a0-2d943270889a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=ef72fc4f-e4f1-4528-ac76-8b0a791d403d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=2fef44bd-09f8-4c19-8b6e-da40977eed38"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=34c1a5b2-db2a-4ad6-b86b-b8a3955f2531"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=c291debc-b09f-45d2-b025-15c63ac8dc1c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=249eb49d-8c9c-4315-8013-5c1e5b90f066"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=48f35b7e-5959-4f61-a3a6-af9d864ebb56"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=31d7393c-e4c0-4819-99e2-827e68c5b3fd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=adae952d-1a54-43f5-9a07-1c929e460b9c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=0ba79587-bb74-47f5-a697-28cf0325271d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=1765cd87-2f1d-4029-a980-75b0b57a0de6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=a6b539e5-e1be-4aab-8321-1e498ce1886a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=8f51cb33-715c-42fb-b557-c79447e9d8de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=2be9c6ce-7c7e-42be-8f1b-ff23ea4b8f0c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=7ae847fa-f3fa-4aac-8b9a-590b28ec7ece"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=32723ada-239d-448c-afc2-b53d6efe7119"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=e82090a3-cad4-42ae-bbd3-8cbc81f302ed"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=02a276a7-7cfb-495a-b259-c4ced018dfb8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=aca9732b-93ec-4df8-9b05-f7d082a3a2e7"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=cc0c006c-5418-4c73-8e3d-ad7fd20f8a4a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=222209d8-35ae-4897-b943-5b9fa37fa349"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=0bd712f9-1c83-4725-81f7-889264c73130"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=baa2df10-3ff8-40b6-8564-496ad4a0896c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=1ad5029e-0943-4220-9eae-64db6d330037"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=ae6a0389-e608-4341-aa8a-0aa58f041429"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=2c740488-9456-4c3f-8aa1-9f4088d57b60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Action",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=0cf3cb49-9a04-4415-9631-1f3e3a321a0c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Adams",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=a7eaefab-fbf8-4df9-b231-a926028cb6de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Allen",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=a05d5004-7e12-4841-806b-b755dbb44822"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Anderson",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=bfc896f4-bb66-4c52-b7a1-9ded6179927e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Anderson",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=e54cef38-e5c5-4941-905c-bb7166113197"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Anderson",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=f3227b3b-a412-4d85-8f33-b45250dd816f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Andrews",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=f3a67900-7e41-42c0-9d51-10fb93029456"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Anthony",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=763f8ab6-3d73-443f-bfdf-e427a376fc9d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Arres",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=52617535-4a26-4509-bfb9-61c850607cd8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Ashford",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=0f879da6-7571-4f40-b477-bffe86c98b63"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Aubrey",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=41dcda94-e5e9-40f6-8bc9-e016496b28e2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Aurora",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=5a8010f7-303f-49d7-83e0-2fa51ae328e8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Austin",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=7b47ce4c-7772-48d6-8e00-0c9fcc79e6f5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Baker",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=5329d1a6-60f1-4a15-a3e6-7d33ace73a9b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Blake",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=677c3d1e-c527-41c4-9be9-b4f0aaef2cdf"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Brady",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=12d3f5b4-6126-4c7f-9f05-158a35396b01"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Brags",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=0ac6898f-e6e3-4c01-8b4e-608010266bcf"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Brandt",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=a9d33459-f5df-44da-a9f4-f0dbbbb96388"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Bruiser",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=4e8e3dbf-bf78-499f-8181-24e7975248c3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Buns",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=08d448a5-ccc0-4b09-a595-7687f3ce69c0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Burke",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=da4f84c3-5a72-45c3-9b82-8204ed8a05ee"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Burns",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=f65e6ef9-5b38-49b1-bab9-89cfd1c6fe4a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Cage",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=993af443-e658-4301-a87a-c661cb59bbc4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Carpenter",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=b1ef40c7-d950-47b3-b0a5-969c849292b4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Chambers",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=8f5d2120-2962-4691-a0a6-5c970ab98172"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Clayton",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=60335579-134f-4abe-b1b1-9bc3144fe212"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Colt",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=d85d624e-17d3-4378-8e2b-b188da56ef3d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Cox",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=72f132a7-e0ff-45b2-8f86-3e7ce6b12d70"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Coxx",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=7157bff9-cfc0-447c-84a2-f1e7872ab9ab"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Daniels",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=f567c8ff-4300-46b0-92f2-b45326a6dcd0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Daniels",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=ce866d5d-dd1c-479a-b9fc-b5d7a3ca241f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Daniels",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=c4952b70-085e-4895-9ccd-399fa0dcdffe"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Dickson",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=cad33743-6af6-451e-8c0f-b78c6cc0ef79"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Diesel",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=acad35f2-a5c7-4d50-b4ce-cb777b0d66ca"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Donlough",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=0b56fefc-692e-48fa-a188-18ea295ded65"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Elias",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=a6582f00-ab75-4c9e-9f95-1c04ef524e89"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Ereon",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=71fd05d1-13f0-45d2-95d4-bb6159cce86a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Evans",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=64d26615-a159-437a-81f9-f61ad689be8a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron French",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=d4a6a561-e998-4894-9d3c-f4e427940efc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Gage",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=51ea6379-4edc-431e-baaa-39104fc995cd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Galloway",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=d659207f-f1d8-437d-aee8-66d1413f8938"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Garrett",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=579699d8-562b-4b4b-b236-e7ab4416e52f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Giant",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=7b12e8c8-f210-4de1-a3ec-50aa39d11130"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Goldsmith",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=bcd06596-521e-4e70-a976-5467f77acf15"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Griffin",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=b93473fe-35f3-44a3-8e6d-3dd2e6d6069b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Griffith",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=adef4c93-70ef-42b1-b164-87e3443dbbb8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Gunner",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=22e50169-ba71-4ab9-b885-39bd2b1826fe"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Hartley",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=964ad0d2-fe8e-4c17-8448-e90d4c4ede22"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Hawke",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=baaf5c00-1dad-4216-9a1b-a3528262ae7e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Heights",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=8725e56d-1d69-41b4-91a1-3dcf723066d9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Hunter",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=e740bb9d-a8d4-423c-8b79-deb9fd2b8fb4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Jackobs",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=6a9399b2-accd-47de-87ed-638a605718fe"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Jackson",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=eab8a8d4-7f47-4bcd-a674-ac05cec184bf"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Jacobs",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=212e25cb-6433-4844-97d2-74e468527f88"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron James",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=a92f35f3-6e11-4e1a-a359-1688eacef54b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Jay",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=4821c613-c9c1-4d03-8eb3-da1e142d38b9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Kellar",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=4a11c374-bd8b-43d5-9617-d494fa544c8b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Kelly",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=2349a3f9-3d6b-4bf0-8346-fa42a420f4dc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Kicks",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=dd6b5da8-8752-4a95-b5f9-8a103fa6c32a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron King",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=091c022f-8a61-40d8-ac20-a4ffdf19abec"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Kline",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=00427092-cb65-4f9d-8fa1-82952cdde94f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Lamb",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=bbe41e10-ccec-4263-b097-dd12ca037c77"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Landcaster",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=bc136a34-c749-482c-8a62-ea175a3a1c09"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Lautner",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=b9009df9-a668-45ae-b54f-225c3ec137b7"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Lennox",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=6487b44e-3b01-4cdc-9361-46a003892503"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Light",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=cf68690a-a911-4679-8cc4-a3b8ad090acc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron London",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=795300a8-ac6a-468d-ba81-fce65b3bf963"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Luk",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=1946f47d-1724-4796-a7a3-1bc45c7444dc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Machi",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=a10cce9b-d8d6-46ef-9eec-cd5a1040a5f0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Maldini",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=955716e4-6c9c-4bb2-b90b-e0294364fc03"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Manson",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=55ecc9c3-d061-4850-b43c-cab8c0c8e246"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Mark",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=3c847bf4-8d4a-4d66-89ef-d06a26cc2427"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Martin",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=d85ee393-f35b-4f93-a429-ea8a2bd077ae"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Master",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=0ae3fc18-85e2-49f9-91b5-7429751ae2f9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ethnic": "caucasian",
|
||||||
|
"person": "Aaron Michaels",
|
||||||
|
"href": "https://www.iafd.com/person.rme/id=e429e641-9a06-4e25-af3b-b60b78989ac6"
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,90 @@
|
|||||||
|
"""
|
||||||
|
Script Name:
|
||||||
|
Description: 从 https://www.iafd.com 上获取信息。利用cloudscraper绕过cloudflare
|
||||||
|
detail_fetch.py 从本地已经保存的列表数据,逐个拉取详情,并输出到文件。
|
||||||
|
list_fetch_astro.py 按照星座拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_birth.py 按照生日拉取数据,获得演员的信息列表。数据量适中,各详细字段较全
|
||||||
|
list_fetch_ethnic.py 按照人种拉取数据,获得演员的信息列表。数据量大,但详细字段很多无效的
|
||||||
|
list_merge.py 上面三个列表的数据,取交集,得到整体数据。
|
||||||
|
iafd_scrape.py 借助 https://github.com/stashapp/CommunityScrapers 实现的脚本,可以输入演员的 iafd链接,获取兼容 stashapp 格式的数据。(作用不大,因为国籍、照片等字段不匹配)
|
||||||
|
|
||||||
|
html_format.py 负责读取已经保存的html目录, 提取信息,格式化输出。
|
||||||
|
data_merge.py 负责合并数据,它把从 iafd, javhd, thelordofporn 以及搭建 stashapp, 从上面更新到的演员数据(需导出)进行合并;
|
||||||
|
stashdb_merge.py 负责把从stashapp中导出的单个演员的json文件, 批量合并并输出; 通常我们需要把stashapp中导出的批量文件压缩并传输到data/tmp目录,解压后合并
|
||||||
|
从而获取到一份完整的数据列表。
|
||||||
|
|
||||||
|
Author: [Your Name]
|
||||||
|
Created Date: YYYY-MM-DD
|
||||||
|
Last Modified: YYYY-MM-DD
|
||||||
|
Version: 1.0
|
||||||
|
|
||||||
|
Modification History:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
- YYYY-MM-DD [Your Name]:
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import csv
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# 配置日志
|
||||||
|
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# 输入和输出目录
|
||||||
|
input_dir = 'data/tmp' # 假设metadata目录在当前目录下
|
||||||
|
output_json_file = 'stashdb.json'
|
||||||
|
output_csv_file = 'stashdb.csv'
|
||||||
|
|
||||||
|
# 用于保存所有的条目
|
||||||
|
data_list = []
|
||||||
|
|
||||||
|
# 遍历metadata文件夹,读取所有json文件
|
||||||
|
for filename in os.listdir(input_dir):
|
||||||
|
if filename.endswith('.json'):
|
||||||
|
file_path = os.path.join(input_dir, filename)
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(file_path, 'r', encoding='utf-8') as file:
|
||||||
|
data = json.load(file)
|
||||||
|
|
||||||
|
# 提取需要的字段
|
||||||
|
person = {
|
||||||
|
'name': data.get('name'),
|
||||||
|
'gender': data.get('gender'),
|
||||||
|
'birthdate': data.get('birthdate'),
|
||||||
|
'ethnicity': data.get('ethnicity'),
|
||||||
|
'country': data.get('country'),
|
||||||
|
'height': data.get('height'),
|
||||||
|
'measurements': data.get('measurements'),
|
||||||
|
'fake_tits': data.get('fake_tits'),
|
||||||
|
'career_length': data.get('career_length'),
|
||||||
|
'aliases': ', '.join(data.get('aliases', [])) # 连接aliases数组元素
|
||||||
|
}
|
||||||
|
|
||||||
|
# 将数据添加到列表中
|
||||||
|
data_list.append(person)
|
||||||
|
logger.info(f"Processed file: {filename}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error processing file {filename}: {e}")
|
||||||
|
|
||||||
|
# 输出到 JSON 文件
|
||||||
|
try:
|
||||||
|
with open(output_json_file, 'w', encoding='utf-8') as json_file:
|
||||||
|
json.dump(data_list, json_file, ensure_ascii=False, indent=4)
|
||||||
|
logger.info(f"Data successfully written to {output_json_file}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error writing JSON file: {e}")
|
||||||
|
|
||||||
|
# 输出到 CSV 文件
|
||||||
|
try:
|
||||||
|
with open(output_csv_file, 'w', newline='', encoding='utf-8') as csv_file:
|
||||||
|
writer = csv.DictWriter(csv_file, fieldnames=data_list[0].keys())
|
||||||
|
writer.writeheader()
|
||||||
|
writer.writerows(data_list)
|
||||||
|
logger.info(f"Data successfully written to {output_csv_file}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error writing CSV file: {e}")
|
||||||
Reference in New Issue
Block a user