add some scripts.
This commit is contained in:
31
scripts/iafd/config.py
Normal file
31
scripts/iafd/config.py
Normal file
@ -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()
|
||||||
|
])
|
||||||
34294
scripts/iafd/data/iafd_merge.csv
Normal file
34294
scripts/iafd/data/iafd_merge.csv
Normal file
File diff suppressed because it is too large
Load Diff
1028792
scripts/iafd/data/iafd_merge.json
Normal file
1028792
scripts/iafd/data/iafd_merge.json
Normal file
File diff suppressed because it is too large
Load Diff
1
scripts/iafd/data/iafd_meta.json
Symbolic link
1
scripts/iafd/data/iafd_meta.json
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../result/iafd_meta.json
|
||||||
1
scripts/iafd/data/javhd_meta.json
Symbolic link
1
scripts/iafd/data/javhd_meta.json
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
/root/scripts/javhd/result/models_detail.json
|
||||||
10110
scripts/iafd/data/stashdb.csv
Normal file
10110
scripts/iafd/data/stashdb.csv
Normal file
File diff suppressed because it is too large
Load Diff
121310
scripts/iafd/data/stashdb.json
Normal file
121310
scripts/iafd/data/stashdb.json
Normal file
File diff suppressed because it is too large
Load Diff
1
scripts/iafd/data/thelordofporn_meta.json
Symbolic link
1
scripts/iafd/data/thelordofporn_meta.json
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
/root/scripts/thelordofporn/result/actress_detail.json
|
||||||
236
scripts/iafd/data_merge.py
Normal file
236
scripts/iafd/data_merge.py
Normal file
@ -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}")
|
||||||
216
scripts/iafd/detail_fetch.py
Normal file
216
scripts/iafd/detail_fetch.py
Normal file
@ -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
|
||||||
|
|||||||
163
scripts/iafd/iafd_scrape.py
Normal file
163
scripts/iafd/iafd_scrape.py
Normal file
@ -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()
|
||||||
140
scripts/iafd/list_fetch_astro.py
Normal file
140
scripts/iafd/list_fetch_astro.py
Normal file
@ -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.")
|
||||||
152
scripts/iafd/list_fetch_birth.py
Normal file
152
scripts/iafd/list_fetch_birth.py
Normal file
@ -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()
|
||||||
153
scripts/iafd/list_fetch_ethnic.py
Normal file
153
scripts/iafd/list_fetch_ethnic.py
Normal file
@ -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.")
|
||||||
99
scripts/iafd/list_merge.py
Normal file
99
scripts/iafd/list_merge.py
Normal file
@ -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()
|
||||||
34867
scripts/iafd/result/astro.csv
Normal file
34867
scripts/iafd/result/astro.csv
Normal file
File diff suppressed because it is too large
Load Diff
209198
scripts/iafd/result/astro.json
Normal file
209198
scripts/iafd/result/astro.json
Normal file
File diff suppressed because it is too large
Load Diff
34867
scripts/iafd/result/birth.csv
Normal file
34867
scripts/iafd/result/birth.csv
Normal file
File diff suppressed because it is too large
Load Diff
209198
scripts/iafd/result/birth.json
Normal file
209198
scripts/iafd/result/birth.json
Normal file
File diff suppressed because it is too large
Load Diff
9
scripts/iafd/result/detail.csv
Normal file
9
scripts/iafd/result/detail.csv
Normal file
@ -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
|
||||||
|
169
scripts/iafd/result/detail.json
Normal file
169
scripts/iafd/result/detail.json
Normal file
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
169
scripts/iafd/result/ethnic.csv
Normal file
169
scripts/iafd/result/ethnic.csv
Normal file
@ -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
|
||||||
|
842
scripts/iafd/result/ethnic.json
Normal file
842
scripts/iafd/result/ethnic.json
Normal file
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
34867
scripts/iafd/result/merged.csv
Normal file
34867
scripts/iafd/result/merged.csv
Normal file
File diff suppressed because it is too large
Load Diff
139466
scripts/iafd/result/merged.json
Normal file
139466
scripts/iafd/result/merged.json
Normal file
File diff suppressed because it is too large
Load Diff
90
scripts/iafd/stashdb_merge.py
Normal file
90
scripts/iafd/stashdb_merge.py
Normal file
@ -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