Skip to content

Repository files navigation

🦞 RankPilot · 本地优先的 On-Page SEO 优化工作台

🌐 语言 / Language:简体中文繁體中文English

Python Dependencies License Tests Version

🔎 不花一分钱、不注册账号、不上传页面,在本机把整站爬一遍,按「焦点关键词」逐页体检 On-Page SEO,输出可直接行动的优化报告。纯 Python 标准库实现,零运行时第三方依赖,Windows / macOS / Linux 全平台可跑。


🎉 项目介绍

RankPilot 是什么? RankPilot 是一款面向开发者、独立站长、技术写作者与增长团队的站内 SEO(On-Page SEO)审计与内容优化工作台。给它一个线上网址,或一个本地 HTML 目录,它就会:

  1. 🕷️ 礼貌地抓取(或离线读取)整站页面;
  2. 🎯 以你指定的**焦点关键词(Focus Keyword)**为核心,逐页分析标题、描述、标题层级、正文密度、可读性、图片 alt、内链结构;
  3. 🕸️ 自动构建内链图谱,找出孤儿页、断链、点击过深的页面;
  4. 🧬 检测重复标题 / 描述 / H1 与近似重复正文
  5. 📊 给出百分制评分与 A–F 等级,并导出控制台 / JSON / CSV / Markdown / 单文件 HTML 五种报告。

它解决什么痛点?

  • 💸 Semrush、Ahrefs 等工具订阅昂贵、套件臃肿,且**站点体检(Site Audit)**这类本可在本地完成的工作也要付费、还要把页面数据上传;
  • 🔒 未上线的内测站、内网站、本地草稿根本无法交给 SaaS 工具抓取;
  • 🧑‍💻 开发者更想要一个能进 CI、能出机器可读结果、能对比每次优化得分的命令行工具,而不是又一个营销后台。

自研差异化亮点(相对同类产品)

  • 零 API Key、零账号、零联网也能用:离线模式直接审计本地目录,页面与关键词永不出本机;
  • 🎯 关键词驱动而非运维健康检查:围绕 Yoast 式焦点关键词工作流(密度 / 位置 / 首段 / slug / 图片 alt),而不是只看 SSL、DNS、响应头;
  • 🕸️ 整站视角:内链图谱、孤儿页、点击深度、跨页重复内容,而非只检查单个 URL;
  • 📈 跨轮趋势对比:每次运行自动留痕,优化前后得分变化一目了然,可直接当 CI 质量门禁(--min-score);
  • 🧱 真正零依赖:不依赖 requests / bs4 / lxml,全部基于标准库,pip install 不拖入任何传递依赖,也可直接用单文件 rankpilot.pyz 运行;
  • 🌏 中英文混合内容感知:分词、密度、可读性同时兼容拉丁语种与中日韩文字。

灵感来源:GitHub Trending 上的开源 Semrush/Ahrefs 替代项目验证了「人人可用的 SEO 工具」这一真实需求,但它依赖付费数据 API 与 Docker 部署。RankPilot 取其「Site Audit」产品逻辑,做了完全独立的自研实现,并把最核心、最隐私敏感的站内优化能力做到本地、零依赖、开箱即用。

📸 运行截图 / 演示动图占位:docs/demo-console.png(控制台报告)、docs/demo-html-report.png(HTML 报告)


✨ 核心特性

🕷️ 抓取与输入

  • 礼貌 BFS 爬虫:同域约束、抓取深度 / 页数上限、请求间隔、超时重试、自定义请求头、HTTP Basic Auth
  • 遵守 robots.txt:自动解析 DisallowCrawl-delay(可用 --ignore-robots 关闭)
  • 完全离线模式:直接审计本地 HTML 文件 / 目录,并基于文件系统检测离线断链
  • 健壮解析器:基于 html.parser,容错畸形 HTML,自动识别 UTF-8 / GB18030 等编码

🎯 焦点关键词分析(核心)

  • 出现次数、关键词密度(可配置理想区间,默认 0.5%–2.5%,自动识别堆砌)
  • 关键词在 title / meta description / H1 / H2-H3 / 首段 / URL slug / 图片 alt 的覆盖情况
  • 标题中的关键词位置检测,支持英文短语边界与中文子串两种匹配

📝 内容与可读性

  • 正文词量(术语数)评估,识别薄内容 / 空页面
  • 平均句长、长句占比、段落长度、英文 Flesch Reading Ease 可读性指数、中文句长统计

🧱 页面元素体检(40+ 规则,6 大分类)

  • Meta:title 缺失 / 过长过短、description、canonical(相对路径 / 跨页指向)、robots noindex
  • 结构:H1 缺失 / 多个 H1、跳级标题、废弃标签、<!DOCTYPE>、内联样式
  • 技术:viewport、charset、html lang、HTTPS 混合内容(mixed content)
  • 社交/结构化数据:Open Graph 完整性、Twitter Card、JSON-LD 存在性与JSON 合法性校验
  • 链接/图片:缺失 alt、空 alt、懒加载、泛化锚文本(“点击这里 / click here”)、死胡同页、URL 大小写 / 下划线 / 长度

🕸️ 站内结构

  • 内链入度 / 出度 / 点击深度计算
  • 孤儿页(无任何内链指向)识别
  • 内链断链(线上 4xx/5xx、离线文件缺失)汇总
  • 重复 title / description / H1,以及基于 5-gram Jaccard 相似度的近似重复正文检测

📤 输出与集成

  • 🖥️ 带等级配色的控制台报告--no-color 可关闭)
  • 🧾 report.json(完整机器可读结果)、report.csv(问题清单平铺)、report.md
  • 🖨️ 单文件 HTML 报告:内嵌 CSS、评分仪表盘、分类得分条、SERP/社媒卡片预览、问题筛选搜索,零外链、可离线发送
  • 🔎 preview 子命令:在终端预览 Google 搜索摘要与社交分享卡片
  • ⚖️ compare 子命令:对比两次 JSON 报告的逐页得分变化
  • 🔁 历史趋势:输出目录自动维护最近 10 次得分
  • 🚦 CI 门禁:--min-score 低于阈值时以非零码退出

🚀 快速开始

📋 环境要求

项目 要求
Python 3.8 / 3.9 / 3.10 / 3.11 / 3.12(仅标准库)
操作系统 Windows、macOS、Linux 全平台
网络 在线模式需要能访问目标站点;离线模式完全不需要网络
第三方依赖 运行时零依赖;仅开发测试可选装 pytest

📦 安装方式(任选其一)

方式一:pip 安装(推荐,获得 rankpilot 命令)

git clone https://github.com/gitstq/rankpilot.git
cd rankpilot
pip install .
rankpilot --version

或以可编辑模式参与开发:

pip install -e .

方式二:单文件运行,免安装(最干净)

python scripts/build.py          # 生成 dist/rankpilot.pyz(只用标准库)
python dist/rankpilot.pyz --version

⚡ 三条命令上手

# 1) 在线爬取并审计一个站点(最多 50 页、深度 3),结果写入 ./report-out
rankpilot run https://example.com --keyword "example keyword" -o ./report-out

# 2) 完全离线:审计本地构建产物目录(未上线也能体检)
rankpilot audit ./dist-site -o ./report-out

# 3) 只看某个页面在 Google 结果里长什么样
rankpilot preview https://example.com/about

免安装时把 rankpilot 换成 python dist/rankpilot.pyz,或用 PYTHONPATH=src python -m rankpilot ...


📖 详细使用指南

🧰 子命令总览

子命令 作用 典型场景
run <url> 在线抓取并审计 线上站点日常巡检
audit <path> 离线审计文件/目录 本地构建产物、内网页面、草稿
preview <url|file> 输出 SERP + 社交卡片预览 改完标题描述快速自检
compare <a.json> <b.json> 对比两份报告逐页得分 验证一轮优化是否提分

🗝️ 为不同页面指定不同焦点关键词

全站只用一个关键词并不现实。可以用 JSON 映射,按 URL 子串分配关键词:

rankpilot run https://example.com --keyword-map kw.json -o ./out

kw.json 示例(见 examples/keyword-map.example.json):

{
  "default_keyword": "seo audit",
  "rules": [
    { "match": "/blog/", "keyword": "technical seo guide" },
    { "match": "/pricing", "keyword": "seo audit pricing" }
  ]
}

🎛️ 在线抓取常用参数

rankpilot run https://example.com \
  --keyword "seo audit" \
  --max-pages 100 \        # 最多抓取页数(默认 50)
  --max-depth 4 \          # 最大点击深度(默认 3)
  --delay 0.5 \            # 同域请求间隔秒数,礼貌抓取(默认 0.3)
  --timeout 15 \           # 单页超时秒数
  --include-subdomains \   # 允许抓取子域
  --header "Cookie: x=1" \ # 自定义请求头(可重复)
  --auth-user u --auth-pass p \  # HTTP Basic 认证
  --ignore-robots \        # 跳过 robots.txt 限制(请自行负责)
  -v                       # 输出抓取过程

📤 选择报告格式

# 默认在 -o 目录下生成全部格式并同时打印控制台报告
rankpilot audit ./site -o ./out --format all

# 只要 JSON(自动化流水线)
rankpilot run https://example.com --format json -o ./out

# 组合格式
rankpilot audit ./site --format console,html,md -o ./out

格式清单:consolejsoncsvmdhtmlall

🚦 接入 CI 当质量门禁

页面得分低于 85 即让流水线失败:

rankpilot run https://staging.example.com --max-pages 20 --min-score 85 --format json -o ci-out
echo "exit code = $?"

📈 优化前后对比

rankpilot audit ./site-v1 --format json -o v1
rankpilot audit ./site-v2 --format json -o v2
rankpilot compare v1/report.json v2/report.json
# Overall: 71.5 → 84.0 (+12.5),并逐页列出涨跌

🧮 评分机制说明

  • 每个分类从 100 分起扣:error 扣 18、warning 扣 8、notice 扣 3,分类得分下限 0;
  • 页面总分按权重加权:内容 28% · Meta 22% · 结构 17% · 链接 13% · 技术 12% · 社交 8%
  • 站点得分为全部页面平均;等级线:A ≥ 90、B ≥ 80、C ≥ 70、D ≥ 55、E ≥ 40,其余为 F;
  • 4xx/5xx 错误页只记录传输层错误,不重复叠加内容规则,避免噪声。

🗂️ 工程结构

rankpilot/
├── src/rankpilot/
│   ├── cli.py            # 命令行入口(run/audit/preview/compare)
│   ├── crawler.py        # 在线 BFS 爬虫 + 离线目录加载
│   ├── parser_html.py    # 标准库 HTML 解析器
│   ├── content.py        # 关键词 / 可读性 / 近似重复
│   ├── rules.py          # 40+ 条 SEO 规则引擎
│   ├── graph.py          # 内链图谱 / 孤儿页 / 深度
│   ├── score.py          # 加权评分
│   ├── preview.py        # SERP / 社交卡片预览
│   ├── engine.py         # 流水线编排
│   └── report/           # console / json / csv / md / html 渲染
├── tests/                # 31 个 unittest + 本地站点夹具
├── scripts/build.py      # 跨平台单文件打包(zipapp)
└── pyproject.toml

❓ 常见问题(FAQ)

Q:真的一个第三方包都不装吗? A:是的,运行时只用 Python 标准库(urllib、html.parser、json、csv…)。requirements.txt 里没有任何包;pytest 仅为可选开发依赖。

Q:会把我的页面或关键词上传到哪里吗? A:不会。在线模式只与你指定的目标站点通信(请求其自身页面与该站 robots.txt);离线模式完全不联网。报告默认只写入本机目录。

Q:为什么不做关键词调研 / 反链 / 排名追踪? A:这些依赖搜索引擎结果页或第三方数据 API,与「本地、隐私、零依赖」的定位冲突。RankPilot 专注你能完全自控的站内优化;这类外部数据能力正是其他工具的领域。

Q:单页应用(JS 渲染)能审计吗? A:RankPilot 不执行 JavaScript,分析的是服务器返回的原始 HTML。对 SSR / SSG / 静态站效果最佳;纯 CSR 页面建议先导出渲染后的 HTML 再用 audit 离线分析。

Q:抓取会给目标站造成压力吗? A:默认串行抓取、带 0.3s 间隔、遵守 robots.txt,并有页数与深度上限,属于礼貌爬虫。请仅对你拥有或获许审计的站点使用。


💡 设计思路与迭代规划

🧭 设计理念

  1. 本地优先、隐私优先:数据不出机器,断网可用;
  2. 确定性优先:规则不依赖任何大模型或在线服务,同一份输入永远得到同一份结果,适合 CI;
  3. 零依赖是特性不是约束:标准库覆盖需求时绝不引第三方,安装与审计永远稳定可复现;
  4. 建议必须可执行:每条问题都附带 how-to-fix,而不是只给一个吓人的分数。

🛣️ 迭代路线图(Roadmap)

  • sitemap.xml / RSS 发现并作为抓取种子
  • hreflang 多语言簇一致性检查
  • 页面体积 / 未压缩资源等性能信号(基于响应头与引用资源)
  • HTML 报告内链图谱的可交互可视化
  • SARIF 输出,直接对接代码扫描平台
  • 更多语言的可读性模型(日语、韩语、欧洲语种)
  • 规则配置文件(自定义阈值、按需启停规则)

欢迎在 Issues 区提需求,也欢迎在 Discussions 讨论方向。社区贡献方向:新规则、新报告格式、可读性模型、测试夹具。


📦 打包与部署指南

RankPilot 属于脚本 / 工具库类项目,无需安装即可运行,也不依赖任何外部服务,因此不发布二进制 Release。三种使用/分发方式:

方式 A:单文件 zipapp(跨平台、免安装)

python scripts/build.py          # 产物:dist/rankpilot.pyz
python dist/rankpilot.pyz audit ./site -o ./out

rankpilot.pyz 在任何装有 Python 3.8+ 的 Windows / macOS / Linux 上均可运行。

方式 B:pip 分发给团队

pip install .                    # 本地安装
pip install "git+https://github.com/gitstq/rankpilot.git"   # 他人直接从 Git 安装

方式 C:容器 / CI 中使用(示例)

FROM python:3.12-slim
WORKDIR /app
COPY . /app
RUN pip install --no-cache-dir .
ENTRYPOINT ["rankpilot"]
docker build -t rankpilot .
docker run --rm -v "$PWD/site:/site" rankpilot audit /site -o /site/out

兼容环境:Python 3.8+,操作系统无关;控制台颜色在非 TTY 环境自动降级,也可显式加 --no-color


🤝 贡献指南

欢迎 PR!提交前请阅读完整的 CONTRIBUTING.md。简要约定:

  • 提交信息遵循 Angular 规范feat: / fix: / docs: / refactor: / test:
  • 不得引入运行时第三方依赖(标准库优先);
  • 新规则请同时补 tests/ 单测,并保证 python -m unittest discover -s tests 全绿;
  • 新增/修改用户可见能力时,同步更新三语文档。
# 提交前自检
python -m compileall src
PYTHONPATH=src python -m unittest discover -s tests -v
python scripts/build.py

安全问题请私下联系维护者,不要在公开 Issue 中披露利用细节。


📄 开源协议

本项目基于 MIT License 开源,可自由使用、修改、分发与商用,保留版权声明即可。


如果 RankPilot 帮你省下了一次 SaaS 订阅,欢迎给个 ⭐ Star 支持!

About

🦞 RankPilot - 本地优先零依赖的 On-Page SEO 优化工作台 CLI | Local-first, zero-dependency on-page SEO audit workbench: crawler, focus-keyword analysis, internal-link graph & multi-format reports

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages