项目背景
Kenshi 拥有丰富的游戏内容,其 Wiki 是玩家获取信息的重要来源。本项目对 Kenshi 游戏 Wiki 进行系统性数据采集,涵盖阵营(factions)、世界书(worldbook)等核心游戏数据,为后续的游戏分析工具提供数据支撑。
技术挑战
反爬虫对抗
Wiki 平台通常有反爬虫机制,需要多层匿名保护:
| 层级 | 方案 |
|---|---|
| 指纹伪装 | curl_cffi 模拟 Chrome 131 TLS 指纹 |
| IP 隐藏 | 免费代理池自动轮换,支持 Tor 网络 |
| 行为模拟 | 2-5 秒智能延迟 + 30% 概率人类长延迟 |
| 失效恢复 | 自动检测并移除失效代理,自动重试 |
爬虫实现
from curl_cffi import requests
# 模拟 Chrome 131 TLS 指纹
session = requests.Session(impersonate="chrome131")
def crawl_page(url, proxy=None):
proxies = {"http": proxy, "https": proxy} if proxy else None
response = session.get(url, proxies=proxins, timeout=30)
return response.text多轮爬取策略
采用渐进式策略确保数据覆盖完整:
快速爬取 → 安全爬取 → 深度爬取 → 链接发现 → 补充爬取
各轮次目标
| 轮次 | 目标 | 特点 |
|---|---|---|
| 快速爬取 | 主要页面 | 短延迟,快速覆盖 |
| 安全爬取 | 重要页面 | 长延迟,确保成功 |
| 深度爬取 | 详细内容 | 解析子页面 |
| 链接发现 | 新发现的链接 | 扩大覆盖范围 |
| 补充爬取 | 失败重试 | 填补遗漏 |
数据清洗流程
def clean_data(raw_data):
# 1. 合并多轮爬取结果
all_pages = merge_crawl_results(raw_data)
# 2. 去重(基于页面标题与内容哈希)
unique_pages = deduplicate(all_pages)
# 3. 清洗无效字段
cleaned = clean_fields(unique_pages)
# 4. 格式统一
return normalize_structure(cleaned)清洗步骤
- 加载合并:将多轮爬取结果加载并合并
- 去重处理:基于页面标题与内容哈希去重
- 字段清洗:移除无效字段,统一格式
- 结构化输出:生成 JSON 数据集
输出成果
| 文件 | 内容 |
|---|---|
all_factions.json | 阵营结构化数据 |
kenshi_worldbook.json | 世界书条目 |
kenshi_full_data.json | 完整数据集 |
kenshi_clean_database/ | 清洗后的分类输出 |
使用方法
# 安装依赖
pip install curl_cffi beautifulsoup4
# 运行爬虫
python run_safe_crawl.py
# 数据清洗
python clean_and_merge.py注意事项
- 请遵守 Wiki 的 robots.txt 和使用条款
- 建议在非高峰时段运行爬虫
- 数据仅供学习和研究使用
相关链接
最后更新: 2026-03-26