用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/mhkz/fanqie-novels-skills --skill fanqie-rank命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | fanqie-rank |
| description | 当用户需要获取番茄小说榜单数据(新书榜、阅读榜)时使用此技能 - 分析番茄小说各分类竞争程度、获取热门书籍信息(书名、作者、简介、在读数、字数)、了解当前市场趋势和热门题材 |
| allowed-tools | Read, Bash |
当用户需要获取番茄小说榜单数据(新书榜、阅读榜)时使用此技能。
番茄榜单、新书榜、阅读榜、榜单数据、抓取榜单、fanqie rank
https://fanqienovel.com/rank/{gender}_{type}_{category_id}
参数说明:
gender: 1=男频, 0=女频type: 1=新书榜, 2=阅读榜category_id: 分类ID| ID | 分类名 | ID | 分类名 |
|---|---|---|---|
| 1141 | 西方奇幻 | 1140 | 东方仙侠 |
| 8 | 科幻末世 | 261 | 都市日常 |
| 124 | 都市修真 | 1014 | 都市高武 |
| 273 | 历史古代 | 27 | 战神赘婿 |
| 263 | 都市种田 | 258 | 传统玄幻 |
| 272 | 历史脑洞 | 539 | 悬疑脑洞 |
| 262 | 都市脑洞 | 257 | 玄幻脑洞 |
| 751 | 悬疑灵异 | 504 | 抗战谍战 |
| 746 | 游戏体育 | 718 | 动漫衍生 |
| 1016 | 男频衍生 |
| ID | 分类名 | ID | 分类名 |
|---|---|---|---|
| 1139 | 古风世情 | 8 | 科幻末世 |
| 746 | 游戏体育 | 1015 | 女频衍生 |
| 248 | 玄幻言情 | 23 | 种田 |
| 79 | 年代 | 267 | 现言脑洞 |
| 246 | 宫斗宅斗 | 539 | 悬疑脑洞 |
| 253 | 古言脑洞 | 24 | 快穿 |
| 749 | 青春甜宠 | 745 | 星光璀璨 |
| 747 | 女频悬疑 | 750 | 职场婚恋 |
| 748 | 豪门总裁 | 1017 | 民国言情 |
根据榜首在读数判断:
番茄小说榜单页面使用字体加密,直接提取会得到乱码。
解决方案: 通过书籍详情页 /page/{bookId} 获取真实书名,该页面不使用字体加密。
页面数据存储在 window.__INITIAL_STATE__ JSON中:
rank.book_list: 书籍列表bookId, bookName(加密), author(加密), abstract(加密), read_count, wordNumber#!/usr/bin/env python3
import json
import re
import urllib.request
import time
from pathlib import Path
# 分类映射
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": , : ,
: , : , : ,
: , : , : ,
: , : , : ,
: , : , :
}
():
url =
headers = {: }
req = urllib.request.Request(url, headers=headers)
urllib.request.urlopen(req, timeout=) resp:
resp.read().decode()
():
= re.search(, html, re.DOTALL)
:
json.loads(.group())
():
url =
headers = {: }
req = urllib.request.Request(url, headers=headers)
:
urllib.request.urlopen(req, timeout=) resp:
content = resp.read().decode()
book_name = re.search(, content)
author = re.search(, content)
abstract = re.search(, content)
{
: book_name.group() book_name ,
: author.group() author ,
: abstract.group() abstract
}
Exception e:
()
():
read_wan = top_read /
read_wan > :
read_wan > :
read_wan > :
read_wan > :
:
():
()
html = fetch_rank_page(gender, rank_type, category_id)
data = parse_initial_state(html)
data data:
book_list = data[].get(, [])[:]
results = []
i, book (book_list, ):
book_id = book.get(, )
read_count = (book.get(, ))
word_count = (book.get(, ))
real_info = get_real_book_info(book_id)
time.sleep()
real_info:
results.append({
: i,
: real_info[],
: real_info[],
: real_info[],
: read_count / ,
: word_count /
})
results
():
lines = [, , , ]
sorted_cats = (all_data.items(),
key= x: x[][], reverse=)
cat_name, cat_data sorted_cats:
level = cat_data[]
top_read = cat_data[]
lines.append()
lines.append()
book cat_data[]:
lines.append()
lines.append()
lines.append()
book[]:
abstract = book[][:] + (book[]) > book[]
lines.append()
lines.append()
lines.append()
lines.append()
.join(lines)
():
gender =
rank_type =
categories = MALE_CATEGORIES gender == FEMALE_CATEGORIES
all_data = {}
cat_id, cat_name categories.items():
books = scrape_category(gender, rank_type, cat_id, cat_name)
books:
top_read = books[][] books
all_data[cat_name] = {
: get_competition_level(top_read * ),
: books,
: top_read
}
time.sleep()
md = generate_markdown(all_data, )
output_path = Path()
output_path.write_text(md, encoding=)
()
__name__ == :
main()
gender 和 rank_type 变量fanqie-newbook-data.md最新抓取的完整数据保存在:
novel-writer-skills/templates/knowledge-base/genres/fanqie-male-newbook-top10.mdnovel-writer-skills/templates/knowledge-base/genres/fanqie-trends-2025.md