1. Fandom Wiki爬虫项目背景与挑战
Fandom作为全球最大的粉丝文化维基托管平台,承载着数以万计的影视、游戏、动漫主题社区。去年在分析《艾尔登法环》玩家行为时,我需要批量获取游戏维基中的武器数据,这才发现Fandom的防爬策略远比想象中复杂。传统的requests+BeautifulSoup组合在动态加载内容面前完全失效,而直接上Selenium又频繁触发429错误。经过两周的反复试错,最终形成这套兼顾效率和稳定性的解决方案。
2. 技术选型与工具链搭建
2.1 核心工具对比
- Selenium:必备工具用于处理动态渲染,实测Chrome Driver比GeckoDriver更稳定
- requests-html:异步请求利器,但Fandom的Cloudflare防护会拦截其请求
- Pyppeteer:无头浏览器方案,配置复杂度高且内存占用大
- 最终方案:Selenium+requests组合,前者突破前端防护,后者处理静态资源
关键提示:必须使用
selenium-wire替代标准selenium,才能捕获Ajax请求
2.2 环境配置要点
python复制# 必须的依赖库
pip install selenium-wire webdriver-manager fake-useragent
浏览器驱动推荐使用webdriver-manager自动管理:
python复制from seleniumwire import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
3. 反爬虫机制破解实战
3.1 请求频率控制
Fandom的限流策略非常严格:
- 单个IP连续请求超过5次/分钟会触发429错误
- 解决方案:随机延迟+代理池组合
python复制import random
import time
def random_delay():
time.sleep(random.uniform(1.2, 3.5))
3.2 动态加载内容捕获
通过Selenium-wire监控XHR请求:
python复制def capture_api_requests(driver, url):
driver.get(url)
for request in driver.requests:
if request.response and '/api/v1/' in request.url:
print(request.url, request.response.status_code)
3.3 验证码处理方案
当检测到验证码时自动执行:
- 保存当前页面截图
- 自动降低请求频率至1次/分钟
- 通过Twilio短信服务通知人工干预
4. 数据提取与清洗技巧
4.1 正文抽取策略
Fandom页面的内容分布规律:
html复制<div class="mw-parser-output">
<!-- 真实内容区域 -->
</div>
但需注意广告模块的干扰:
python复制# 移除所有干扰元素
driver.execute_script("""
document.querySelectorAll('.ad-slot, .global-navigation').forEach(e => e.remove())
""")
4.2 特殊数据处理
- 信息框:转换为Markdown表格
- 分类标签:建立层级关系树
- 跨语言链接:自动补全URL
5. 性能优化方案
5.1 请求缓存机制
使用SQLite建立本地缓存:
python复制import sqlite3
def get_page(url):
conn = sqlite3.connect('cache.db')
cursor = conn.execute('SELECT content FROM cache WHERE url=?', (url,))
if row := cursor.fetchone():
return row[0]
# ...正常抓取逻辑...
5.2 分布式爬虫架构
当需要爬取整个wiki时采用:
- 主节点负责生成sitemap
- 工作节点通过Redis获取任务
- 使用Celery实现任务队列
6. 常见错误排查手册
| 错误代码 | 原因分析 | 解决方案 |
|---|---|---|
| 429 Too Many Requests | 请求频率超限 | 立即暂停1小时,切换代理IP |
| 403 Forbidden | 用户代理被识别 | 使用fake-useragent轮换UA |
| 500 Server Error | Fandom服务器问题 | 重试3次后跳过该页面 |
| ElementNotInteractable | 页面未完全加载 | 增加显式等待时间 |
7. 法律与伦理边界
重要注意事项:
- 严格遵守robots.txt规定(部分wiki禁止爬取)
- 单日抓取量控制在1000页以内
- 数据仅用于个人研究
- 商业用途需联系Fandom获取授权
这套方案经过三个月生产环境验证,稳定抓取了超过5万页游戏wiki数据。最关键的教训是:不要尝试用单一技术解决所有问题,灵活组合不同工具才能突破复杂防护。最近发现他们升级了人机验证机制,下一步准备研究Puppeteer的隐身模式方案。
