# Fanqie Screenshot

> 截图番茄小说榜单页面 - 支持新书榜、阅读榜的可视化截图，用于市场分析和竞品研究

- Skill: `mhkz/fanqie-screenshot` (Agent Skill)
- Install (CLI): `npx skillmds@latest add mhkz/fanqie-screenshot`
- Raw SKILL.md: https://api.skillmd.com/api/skills/mhkz/fanqie-screenshot/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Research & Search
- Author: mhkz (https://skillmd.com/u/mhkz)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/mhkz/fanqie-screenshot

---


# 番茄榜单截图 (fanqie-screenshot)

当用户需要截取番茄小说榜单页面时使用此技能。

## 触发词

截图榜单、榜单截图、扫榜截图、screenshot rank、截图番茄

## 使用场景

- 可视化查看榜单页面布局
- 保存榜单快照用于对比分析
- 研究热门书籍封面和排版风格
- 批量截取多个分类进行市场调研

## 前置要求

需要安装 Playwright（首次使用会自动安装）：

```bash
# 创建虚拟环境并安装
python3 -m venv /tmp/playwright_env
source /tmp/playwright_env/bin/activate
pip install playwright -q
python -m playwright install chromium
```

## 榜单URL格式

```
https://fanqienovel.com/rank/{gender}_{type}_{category_id}
```

参数说明：
- `gender`: 1=男频, 0=女频
- `type`: 1=新书榜, 2=阅读榜
- `category_id`: 分类ID

## 分类ID映射

### 男频分类 (19个)

| ID | 分类名 | ID | 分类名 |
|----|--------|----|--------|
| 1141 | 西方奇幻 | 1140 | 东方仙侠 |
| 8 | 科幻末世 | 261 | 都市日常 |
| 124 | 都市修真 | 1014 | 都市高武 |
| 273 | 历史古代 | 27 | 战神赘婿 |
| 263 | 都市种田 | 258 | 传统玄幻 |
| 272 | 历史脑洞 | 539 | 悬疑脑洞 |
| 262 | 都市脑洞 | 257 | 玄幻脑洞 |
| 751 | 悬疑灵异 | 504 | 抗战谍战 |
| 746 | 游戏体育 | 718 | 动漫衍生 |
| 1016 | 男频衍生 | | |

### 女频分类 (18个)

| ID | 分类名 | ID | 分类名 |
|----|--------|----|--------|
| 1139 | 古风世情 | 8 | 科幻末世 |
| 746 | 游戏体育 | 1015 | 女频衍生 |
| 248 | 玄幻言情 | 23 | 种田 |
| 79 | 年代 | 267 | 现言脑洞 |
| 246 | 宫斗宅斗 | 539 | 悬疑脑洞 |
| 253 | 古言脑洞 | 24 | 快穿 |
| 749 | 青春甜宠 | 745 | 星光璀璨 |
| 747 | 女频悬疑 | 750 | 职场婚恋 |
| 748 | 豪门总裁 | 1017 | 民国言情 |

## Python截图代码

### 单个分类截图

```python
#!/usr/bin/env python3
"""番茄小说榜单截图工具"""
from playwright.sync_api import sync_playwright
import os
from datetime import datetime

# 分类映射
MALE_CATEGORIES = {
    "1141": "西方奇幻", "1140": "东方仙侠", "8": "科幻末世",
    "261": "都市日常", "124": "都市修真", "1014": "都市高武",
    "273": "历史古代", "27": "战神赘婿", "263": "都市种田",
    "258": "传统玄幻", "272": "历史脑洞", "539": "悬疑脑洞",
    "262": "都市脑洞", "257": "玄幻脑洞", "751": "悬疑灵异",
    "504": "抗战谍战", "746": "游戏体育", "718": "动漫衍生",
    "1016": "男频衍生"
}

FEMALE_CATEGORIES = {
    "1139": "古风世情", "8": "科幻末世", "746": "游戏体育",
    "1015": "女频衍生", "248": "玄幻言情", "23": "种田",
    "79": "年代", "267": "现言脑洞", "246": "宫斗宅斗",
    "539": "悬疑脑洞", "253": "古言脑洞", "24": "快穿",
    "749": "青春甜宠", "745": "星光璀璨", "747": "女频悬疑",
    "750": "职场婚恋", "748": "豪门总裁", "1017": "民国言情"
}

def screenshot_rank(gender, rank_type, category_id, output_dir="/tmp"):
    """
    截取单个榜单页面

    Args:
        gender: 1=男频, 0=女频
        rank_type: 1=新书榜, 2=阅读榜
        category_id: 分类ID
        output_dir: 输出目录

    Returns:
        截图文件路径
    """
    url = f"https://fanqienovel.com/rank/{gender}_{rank_type}_{category_id}"

    # 获取分类名称
    categories = MALE_CATEGORIES if gender == 1 else FEMALE_CATEGORIES
    cat_name = categories.get(str(category_id), f"unknown_{category_id}")

    # 生成文件名
    gender_str = "male" if gender == 1 else "female"
    type_str = "newbook" if rank_type == 1 else "reading"
    timestamp = datetime.now().strftime("%Y%m%d")
    filename = f"fanqie_{gender_str}_{type_str}_{cat_name}_{timestamp}.png"
    output_path = os.path.join(output_dir, filename)

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page(viewport={"width": 1280, "height": 900})
        page.goto(url, wait_until="networkidle", timeout=30000)
        page.wait_for_timeout(2000)  # 等待动态内容加载
        page.screenshot(path=output_path, full_page=True)
        browser.close()

    print(f"截图已保存: {output_path}")
    return output_path


def screenshot_all_categories(gender=1, rank_type=1, output_dir="/tmp/fanqie_screenshots"):
    """
    批量截取所有分类

    Args:
        gender: 1=男频, 0=女频
        rank_type: 1=新书榜, 2=阅读榜
        output_dir: 输出目录
    """
    os.makedirs(output_dir, exist_ok=True)
    categories = MALE_CATEGORIES if gender == 1 else FEMALE_CATEGORIES

    results = []
    for cat_id, cat_name in categories.items():
        print(f"正在截图: {cat_name} ({cat_id})")
        try:
            path = screenshot_rank(gender, rank_type, cat_id, output_dir)
            results.append({"category": cat_name, "path": path, "success": True})
        except Exception as e:
            print(f"截图失败: {cat_name} - {e}")
            results.append({"category": cat_name, "error": str(e), "success": False})

    return results


# 使用示例
if __name__ == "__main__":
    # 单个分类截图
    # screenshot_rank(1, 1, 124)  # 男频新书榜-都市修真

    # 批量截图所有男频新书榜
    screenshot_all_categories(gender=1, rank_type=1)
```

### 快速截图命令

```bash
# 激活环境
source /tmp/playwright_env/bin/activate

# 单个分类截图（都市修真新书榜）
python3 << 'EOF'
from playwright.sync_api import sync_playwright
url = "https://fanqienovel.com/rank/1_1_124"
with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page(viewport={"width": 1280, "height": 900})
    page.goto(url, wait_until="networkidle", timeout=30000)
    page.wait_for_timeout(2000)
    page.screenshot(path="/tmp/fanqie_rank.png", full_page=True)
    browser.close()
    print("截图已保存: /tmp/fanqie_rank.png")
EOF
```

## 使用方法

1. **快速截图单个分类**:
   ```
   截图 https://fanqienovel.com/rank/1_1_124
   ```

2. **指定分类截图**:
   ```
   截图番茄都市修真新书榜
   ```

3. **批量截图**:
   ```
   批量截图男频所有新书榜
   ```

## 输出位置

- 单个截图默认保存到 `/tmp/`
- 批量截图保存到 `/tmp/fanqie_screenshots/`
- 文件命名格式: `fanqie_{gender}_{type}_{category}_{date}.png`

## 注意事项

1. 首次使用需要安装 Playwright 和 Chromium（约 200MB）
2. 截图需要网络连接
3. 建议批量截图时添加适当延迟，避免请求过快
4. 截图为全页面截图，包含完整榜单内容

