Skip to content

Repository files navigation

🔎 SEOForge — 零依赖全站 SEO 审计与评分引擎

语言切换:简体中文 · 繁體中文 · English

面向开发者的本地优先(local-first)、可完全离线运行的 SEO 爬虫审计工具。 既可以爬取线上站点,也可以直接审计本地构建产物目录;内置 36 条 SEO 规则,输出透明的 0–100 分与 A–F 评级,支持文本 / JSON / Markdown / 单文件 HTML 四种报告;零第三方依赖,仅靠 Python 3.8+ 标准库运行。

SEOForge 终端演示截图占位


🎉 项目介绍

🧭 项目定位

SEOForge 是一款命令行「技术型站内 SEO」审计引擎,工作方式像一位资深 SEO 工程师:从一个入口 URL 出发,礼貌地爬取整站,构建内链图谱,交叉核对 robots.txtsitemap.xml,逐页解析 HTML 文档,并对每个问题说明 错在哪里、为什么重要、应该怎么改

😣 解决的痛点

  • Semrush / Ahrefs 一类商业 SEO 套件价格昂贵、爬取额度受限,且页面数据必须上云;
  • 多数开源检查器一次只能查一个页面,发现不了跨页问题:重复标题、孤儿页面、 sitemap 覆盖缺口、重定向链等;
  • SEO 问题往往在上线之后才被发现,可静态构建产物里其实早已包含排查所需的全部信息。

✨ 自研差异化亮点

  1. 全站视角,而非单页检查:BFS 爬取 + 入链/出链图谱 + 爬取深度 + 重定向链记录;
  2. 跨页智能分析:重复 title/description、近重复正文(5-shingle Jaccard 相似度)、 孤儿页面、sitemap 覆盖度差异比对;
  3. 双输入模式:线上 URL 用 audit,本地 dist/ 目录用 lint,让 SEO 成为 部署前即可离线执行的门禁
  4. 评分量规完全透明:四大类目固定分值预算(内容 40 · 可抓取性 30 · 链接 20 · 体验 10),页面级问题按页面数归一化,大站不会因页面多而被重复惩罚;
  5. CI 原生设计--threshold 分数门禁 + --fail-on 严重度门禁,退出码语义稳定, 一行命令接入 GitHub Actions / GitLab CI;
  6. 极致可移植:纯标准库实现,没有依赖安装链,Windows / macOS / Linux、 受限 CI 与内网离线环境均可运行。

💡 灵感来源

项目灵感来自近期开源社区对「可自托管 SEO 工具」(Semrush/Ahrefs 的开源替代) 的高涨热情。未复制任何第三方代码,SEOForge 为完全独立的净室实现,聚焦于 每个开发者都能在本地跑起来的部分——技术型站内 SEO 审计。


✨ 核心特性

🧭 爬取与发现

  • 🌐 同站 BFS 爬虫,受控线程池 + 礼貌延迟
  • 🤝 类 RFC 9309 的 robots.txt 解析:通配符、$、最长匹配优先、 Crawl-delaySitemap: 发现
  • 🗺️ 支持 XML urlset / sitemap 索引 / 纯文本三种 sitemap
  • 🔁 完整记录重定向链(长链与环路)
  • 🔀 URL 包含/忽略正则、额外 sitemap、自定义 User-Agent
  • 📁 本地目录模式:自动解析相对链接与 index.html 目录索引

🧪 36 条内置规则(四大类目)

类目 分值预算 代表性规则
内容与元数据 40 标题/描述存在性与长度、H1 结构、标题层级顺序、Open Graph、Twitter Card、canonical、lang、JSON-LD、薄内容、无意义锚文本、重复标题/描述近重复正文
抓取与索引 30 robots 全站封禁、sitemap 缺失、sitemap 覆盖缺口、sitemap 死链、混合内容、重定向链、HTTPS、viewport/charset
链接结构 20 内链死链孤儿页面、埋藏过深页面、链接数过多
性能与体验 10 HTML 体积过大、响应过慢、favicon、图片缺少 alt

执行 seoforge rules 可查看完整规则目录(编号 / 严重度 / 权重)。

📊 评分与报告

  • 🎯 0–100 总分、A–F 评级、四类目分项得分
  • 📄 四种报告:终端文本、机器可读 JSON、Markdown、单文件 HTML (内联 CSS + 原生 JS 筛选,离线双击即可打开)
  • 🚦 CI 门禁:分数阈值 + 严重度触发,退出码稳定可编排

🛡️ 安全与隐私

  • 🏠 全部计算在本机完成,无任何分析、遥测与云端上传
  • 🧱 仅依赖标准库,供应链就是 Python 本身
  • 🐢 默认礼貌爬取:遵守 robots、限制并发、请求间隔

🚀 快速开始

🧰 环境要求

  • Python 3.8 及以上(已在 3.8 / 3.10 / 3.12 验证)
  • 支持 Windows 10+、macOS、Linux
  • 运行期零第三方依赖,甚至不必创建虚拟环境

📦 安装

# 方式一:源码可编辑安装(当前推荐)
git clone https://github.com/gitstq/seoforge.git
cd seoforge
python3 -m pip install -e .
seoforge --version

# 方式二:构建通用 wheel 后随处安装
python3 -m pip install build
python3 -m build
python3 -m pip install dist/seoforge-1.0.0-py2.py3-none-any.whl

# 方式三:免安装直接运行
python3 -m seoforge --version

🌐 审计线上站点

# 文本报告,最多爬取 100 个页面
seoforge audit https://example.com --max-pages 100 --delay 200

# 生成可分享的单文件 HTML 报告
seoforge audit https://example.com -f html -o report.html

# 输出机器可读 JSON,供下游工具消费
seoforge audit https://example.com -f json -o report.json

📁 离线审计本地构建产物(部署前)

# 在 npm run build / hugo / mkdocs build 等构建完成之后
seoforge lint ./dist --base-url https://www.example.com/

⚡ 60 秒离线体验

make demo-local        # 在临时目录生成示例站点并完成审计
#
bash scripts/local_demo.sh

📖 详细使用指南

命令总览

seoforge audit <url>  [参数]   # 爬取并审计线上站点
seoforge lint  <目录> [参数]   # 审计本地静态构建目录
seoforge rules                 # 列出全部 36 条规则

audit 参数说明

参数 默认值 说明
--max-pages N 100 爬取预算(HTML 页面 + 被探测的内链资源总数)
--workers N 4 并发抓取线程数
--delay MS 200 请求派发之间的礼貌间隔(毫秒)
--timeout S 10 单请求超时(秒)
--no-robots 关闭 忽略 robots.txt(仅限自有站点
--include 正则 只爬取匹配的 URL(可重复)
--ignore-path 正则 跳过匹配的 URL(可重复)
--sitemap URL 额外指定 sitemap(可重复)
--user-agent UA SEOForgeBot/1.0 自定义 User-Agent
-f, --format text text / json / md / html
-o, --output F 标准输出 报告写入文件
--ignore-rule ID 关闭指定规则,如 P17(可重复)
--threshold N 0 CI 门禁:低于 N 分即失败
--fail-on never error / warning / never
-v, --verbose 关闭 向 stderr 打印爬取进度

lint 参数说明

参数 默认值 说明
--base-url URL http://localhost/ 解析相对链接与 sitemap 时使用的逻辑站点地址
其余 与上表相同的报告/门禁参数(-f-o--ignore-rule--threshold--fail-on

🧑‍💻 典型使用场景

1. CI 质量门禁:低于 85 分或出现 error 即失败

seoforge audit https://staging.example.com \
  --max-pages 200 --threshold 85 --fail-on error -f md -o seo.md
# 退出码:0 通过 · 1 门禁失败 · 2 运行时错误

2. 静态站点部署前离线检查

seoforge lint ./public --base-url https://example.com \
  --threshold 90 --fail-on warning -f html -o seo-report.html

3. 只审计某个路径,并关闭个别噪声规则

seoforge audit https://example.com/docs \
  --include '^https://example.com/docs/' \
  --ignore-path '/docs/legacy/' \
  --ignore-rule P17 --ignore-rule P12

4. 用 JSON 做问题趋势对比(配合 jq)

seoforge audit https://example.com -f json > "$(date +%F).json"
jq '.counts, .score' 2026-08-31.json

🧮 评分机制说明

每条规则都归属一个类目并带有固定权重。站点级问题直接扣分;页面级问题 按已爬取 HTML 页面数取平均后 × 5,避免千页站点被重复惩罚千次。各类目 扣分不超过其分值预算:

类目 最高扣分
内容与元数据 40
抓取与索引 30
链接结构 20
性能与体验 10

评级:A ≥ 90 · B ≥ 80 · C ≥ 70 · D ≥ 60 · F < 60

🖼️ 截图与示例输出

  • 终端报告:docs/screenshots/terminal-demo.png(占位,可自行替换)
  • HTML 报告:docs/screenshots/html-report.png(占位)
  • 随时可通过 make demo-local 重新生成真实样例

💡 设计思路与迭代规划

🧩 设计理念

  • 本地优先、可离线:审计必须能在受限的 CI 容器里跑通;
  • 零依赖是特性而非妥协:每个第三方依赖都是供应链、兼容性与维护成本, 而 HTTP、HTML 解析、线程、压缩标准库已全部覆盖;
  • 规则即数据:每条规则都是一个带稳定编号(Pxx 页面级、Sxx 站点级) 的小型纯函数,报告结果可逐版本 diff;
  • 解释而非恐吓:每个问题都附带可执行的修复建议。

🛠️ 技术选型原因

Python 标准库全家桶:urllib(HTTP 与重定向)、html.parser(对真实世界 畸形 HTML 足够宽容)、concurrent.futures(受控并发)、gzip/zlib (压缩)、unittest(自包含测试)。没有原生编译步骤、没有平台 wheel、 没有版本冲突。

🗺️ 后续迭代计划

  • 支持 pyproject.toml / .seoforge.toml 配置文件驱动规则参数
  • 两次审计结果的 HTML 差异对比(回归视图)
  • hreflang 语言簇校验与国际化检查
  • 可选的渲染后 DOM 类 Core Web Vitals 启发式检查
  • SARIF 输出,接入代码扫描看板
  • JUnit XML 输出,接入 CI 测试报告器

🌱 社区贡献方向

新增规则、修复建议的多语言本地化、针对真实畸形 HTML 的解析加固、 更多报告主题,详见 CONTRIBUTING.md


📦 打包与部署指南

SEOForge 属于开发者工具 / 工具库,以源码与通用 wheel 形式发布, 不需要任何平台相关的可执行文件。

🖥️ 兼容环境

环境 支持情况
Python 3.8 / 3.9 / 3.10 / 3.11 / 3.12
操作系统 Linux、macOS、Windows(原生 / WSL)
运行依赖
网络要求 audit 模式需要;lint 模式完全不需要

🏗️ 构建分发包

python3 -m pip install build
python3 -m build           # 产物位于 dist/:.tar.gz 与 .whl

🔌 接入 GitHub Actions

# .github/workflows/seo.yml
name: seo-gate
on: [push, pull_request]
jobs:
  seo:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: { python-version: "3.12" }
      - run: pip install .
      - name: 审计本地构建产物
        run: |
          npm run build || true
          seoforge lint ./dist --base-url https://example.com \
            --threshold 85 --fail-on error -f html -o seo.html
      - uses: actions/upload-artifact@v4
        with: { name: seo-report, path: seo.html }

🐳 不安装、Docker 临时运行

docker run --rm -v "$PWD:/site:ro" python:3.12-slim \
  sh -c "pip install --quiet seoforge 2>/dev/null || true; \
         cd /site && python -m seoforge lint . --base-url https://example.com"

❓ 常见问题(FAQ)

Q:会执行 JavaScript 吗? 不会。工具分析服务端返回的原始 HTML,以保证快速与零依赖。JS 渲染型 SPA 建议先做静态生成,再用 lint 模式审计构建产物。

Q:和 Lighthouse 有什么区别? Lighthouse 聚焦单个渲染后页面的性能与体验指标;SEOForge 聚焦整站: 内链图谱、sitemap/robots 覆盖、跨页重复与孤儿页面,并面向 CI 门禁设计。

Q:会不会把服务器压垮? 不会。默认遵守 robots、4 并发、200ms 派发间隔,可用 --workers--delay 自行调节。

Q:为什么不检查外链? 这是刻意的设计:只抓取同站链接以保持礼貌与边界可控;外链 URL 已在数据 模型中采集,留作后续规则扩展。

Q:某条规则不适合我的站点怎么办?--ignore-rule 编号 单次关闭,并欢迎携带最小复现样例提交 Issue。


🤝 贡献指南

欢迎提交 Issue 与 PR。规则编写规范、测试要求与 Angular 提交规范 (feat: / fix: / docs: / test: / refactor: / chore:) 请先阅读 CONTRIBUTING.md

📄 开源协议

基于 MIT 协议开源,详见 LICENSE

About

🔎 SEOForge — 零依赖全站SEO审计与评分引擎CLI | Local-first zero-dependency whole-site SEO audit, scoring & reporting: 36 rules, audit/lint modes, CI gate, 4 report formats

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages