Skip to main content
Glama

escalator

给它一个 URL,就能得到干净的 Markdown。它会爬升到可行的最低一级阶梯——先尝试普通 HTTP 抓取,再通过住宅代理走同样的抓取,最后才用隐身浏览器——并在第一个返回真实内容的层级停下。

$ escalator scrape https://en.wikipedia.org/wiki/Web_scraping | head -3
# Web scraping

**Web scraping**, **web harvesting**, or **web data extraction** is [data scraping](...)

快速开始

# 1. install uv (https://docs.astral.sh/uv/getting-started/installation/)
curl -LsSf https://astral.sh/uv/install.sh | sh

# 2. configure this machine -- finds your browser, or fetches one
uvx escalator init

# 3. use it
uvx escalator scrape https://en.wikipedia.org/wiki/Web_scraping

这就是全部的上手流程。init 会写入一个配置文件,首次运行前无需手动编辑任何内容。如果有什么看起来不对:运行 escalator doctor

在最小化 Linux 上(裸容器、全新 VPS),Chrome 需要桌面系统已自带的系统库。escalator 不会替你安装它们——它会打印出确切的 apt-get 命令,escalator doctor 会重复显示该命令。只需一条命令,一次即可:

sudo apt-get update && sudo apt-get install -y \
  libnss3 libnspr4 libatk1.0-0t64 libatk-bridge2.0-0t64 libcups2t64 libdrm2 \
  libxkbcommon0 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxrandr2 \
  libgbm1 libglib2.0-0t64 libpango-1.0-0 libcairo2 libasound2t64 \
  libatspi2.0-0t64 libxcb1 libdbus-1-3 libexpat1

默认不附带任何东西,这是设计使然。 escalator 以未配置状态发布——不捆绑浏览器、不捆绑代理、没有遥测,也不会在其自身目录之外写入任何内容。init 的存在是为了让配置变成两分钟的对话,而不是一场 README 寻宝游戏。

Related MCP server: Safer Fetch MCP Server

安装

方式

命令

适用场景

uv(不安装)

uvx escalator init

试用一下

uv(持久化)

uv tool install escalator

想把它加入 PATH

pipx

pipx install escalator

你已经在用 pipx

pip

pip install escalator

在已有的 venv 中

Docker

docker run --rm ghcr.io/ruslanstarikov/escalator doctor

服务器

核心流程所需的一切都包含在默认安装中,包括浏览器阶梯——它本身不携带浏览器,这正是 escalator browser install 的用途。还有一个额外选项:escalator[mcp] 会添加 MCP 界面,Docker 镜像已包含该功能。

Docker

docker run --rm \
  -e ESCALATOR_SERVER_API_KEYS=your-key \
  -p 8000:8000 -v ./data:/data \
  ghcr.io/ruslanstarikov/escalator serve

该镜像携带固定版本的浏览器,完全通过环境变量配置——参见 docker-compose.example.yml 了解代理配置。它以 uid 1000 运行,因此 bind-mount 的 ./data 目录需要对该用户可写。

命令

escalator init [--yes]     configure this machine; --yes for scripts
escalator doctor [--json]  check everything, one fix per failure
escalator browser list     every browser found, and which one wins
escalator browser install  download Chrome for Testing into the data dir
escalator scrape URL       one page to stdout, so it pipes
escalator serve            the HTTP API and the MCP face
escalator --version        tool, python, platform

阶梯

policy      robots.txt (cached) + rate limit  → may short-circuit (skip/deny/wait)
http        curl_cffi, impersonate=chrome     → ~100ms; clears undefended sites
http_proxy  same, routed via residential IP   → beats datacenter-IP bans
browser     nodriver, headless Chrome         → JS/SPA + Cloudflare-class defenses
                    │
                    └─ walled on the last rung? → status="challenged". Surrender.

有两件事让这不仅仅是一个 for 循环:

200 OK 并不代表成功。 返回 HTTP 200 但携带 Cloudflare 验证页的阶梯并没有成功。core/detect.py 在提取之后对每个响应进行分类——contentthinblocked——只有 content 算数。没有这一点,阶梯就永远不会升级,缓存也会为一个永远返回垃圾内容的域名学到"http 可用"。

缓存会遗忘。 学到的起始阶梯如果只升不降,最终会把每个域名都推向浏览器+代理,悄悄推高你的代理账单。条目带有 learned_at 时间戳;超过 ladder.tier_cache_ttl_hours 后,域名会回退一级更便宜的阶梯重试。

关于为什么这样设计——以及它刻意拒绝做什么——请参阅 DESIGN.md

配置

一个由 init 写入的配置文件,位于平台配置目录(Linux 上为 ~/.config/escalator/config.toml,macOS 上为 ~/Library/Application Support/escalator/config.toml)。使用 --config 覆盖位置。

所有场景下的优先级:

CLI flag  >  environment  >  config.toml  >  default

每个键都有对应的环境变量,Docker 镜像正是通过这种方式在没有任何配置文件的情况下完成配置的:

配置键

环境变量

默认值

说明

browser.path

ESCALATOR_BROWSER_PATH

Chrome/Chromium 二进制的绝对路径。留空 = 自动查找。

browser.headless

ESCALATOR_BROWSER_HEADLESS

true

false 需要显示器(或 Xvfb),且更难被检测到。

browser.via_proxy

ESCALATOR_BROWSER_VIA_PROXY

true

渲染也通过代理路由。消耗带宽。

browser.max_concurrent

ESCALATOR_BROWSER_MAX_CONCURRENT

4

Chrome 是小机器上的内存天花板。

browser.timeout_ms

ESCALATOR_BROWSER_TIMEOUT_MS

30000

浏览器阶梯的每次抓取超时时间。

proxy.enabled

ESCALATOR_PROXY_ENABLED

false

总开关。为 false 时,以下所有项均被忽略。

proxy.url

ESCALATOR_PROXY_URL

http://user:pass@host:port 或 socks5://...

proxy.list

ESCALATOR_PROXY_LIST

多个出口,轮询使用。与 url 合并。

http.timeout_ms

ESCALATOR_HTTP_TIMEOUT_MS

10000

两个 http 阶梯的每次抓取超时时间。

ladder.min_content_chars

ESCALATOR_LADDER_MIN_CONTENT_CHARS

200

提取的字符数低于此值时,页面被视为"过薄",阶梯继续向上爬升。

ladder.tier_cache_ttl_hours

ESCALATOR_LADDER_TIER_CACHE_TTL_HOURS

72

学到的阶梯在衰减到更便宜一级之前保留的时间。

politeness.respect_robots

ESCALATOR_POLITENESS_RESPECT_ROBOTS

true

你的机器你做主。

politeness.rate_limit_rps

ESCALATOR_POLITENESS_RATE_LIMIT_RPS

1.0

按域名计。0 表示完全禁用间隔。

politeness.user_agent

ESCALATOR_POLITENESS_USER_AGENT

Chrome UA

用于 robots.txt 匹配。

server.api_keys

ESCALATOR_SERVER_API_KEYS

escalator serve 的 Bearer 密钥。此列表即事实:移除一个即撤销一个。

server.host

ESCALATOR_SERVER_HOST

127.0.0.1

127.0.0.1 使其不暴露在局域网。容器需要 0.0.0.0。

server.port

ESCALATOR_SERVER_PORT

8000

escalator serve 的端口。

storage.data_dir

ESCALATOR_STORAGE_DATA_DIR

数据库和托管的浏览器。留空 = 下面的平台默认值。

storage.request_log_limit

ESCALATOR_STORAGE_REQUEST_LOG_LIMIT

5000

request_log 中保留的行数;插入时裁剪。

数据——SQLite 数据库和任何下载的浏览器——存放在平台数据目录中,可通过 ESCALATOR_STORAGE_DATA_DIR 覆盖。该目录之外不会写入任何内容。

浏览器从哪来

escalator browser list 按顺序显示查找过程:

  1. 显式路径——先是 --browser-path,然后是 ESCALATOR_BROWSER_PATH,最后是 browser.path。如果设置了但错误,会报错并指明路径,绝不会静默跳过。

  2. 本机安装的浏览器:先是真正的 Google Chrome,然后是 Chromium,再是 Edge 和 Brave。

  3. 之前通过 escalator browser install 下载的浏览器。

如果以上都找不到,你会收到一条错误信息,其中包含修复它的两条命令。解析过程绝不会自行下载——服务器请求或 cron 作业不应有安装软件的副作用。

使用服务器

escalator serve   # 127.0.0.1:8000 by default
POST /scrape   {url, markdown?, min_tier?, max_tier?, timeout_ms?}  -> FetchResult
GET  /healthz                                                       -> {status, version}

使用 Authorization: Bearer <key> 进行身份验证,其中 key 是 server.api_keys 之一。该列表就是事实:移除一个 key,下次启动时即被撤销。没有用于生成 key 的端点。

验证墙返回 200 OK 并带有 {"status": "challenged"},而不是 HTTP 错误。这是有意为之:另一端的代理可以对此做出反应。循环重试没有用——escalator 不解决验证码问题,这是设计使然。

使用 [mcp] 额外选项时,同一个阶梯会以工具的形式暴露在 /mcp 下:scrape_url(url, force_browser=False)

故障排除

从这里开始:

escalator doctor

它会检查 Python、配置文件、数据目录、浏览器解析、实际的无头启动,以及——如果配置了代理——通过它发起一次真实请求,报告出口 IP 和国家(密码会被打码)。每个 ❌ 都会附带一条修复命令,如果任何检查失败,退出码为非零,因此脚本也可以使用它。escalator doctor --json 用于机器读取。

症状

通常原因

no Chrome-family browser found

escalator browser install

Linux 上出现 error while loading shared libraries

doctor 会指出要安装的包名

所有请求都返回 challenged

你需要住宅代理:escalator init

/scrape 返回 401

未配置 key,或已从 server.api_keys 中移除

首次浏览器抓取很慢

Chrome 冷启动;escalator 会重试一次启动

如果仍然无法解决,请将完整的 escalator doctor 输出粘贴到 issue 中——这正是它最后一行所要求的,也是获得答案的最快途径。

开发

参见 CONTRIBUTING.md。简而言之:uv syncuv run pytest

许可证

发布到公共领域——参见 UNLICENSE。无担保,无需署名,随意使用。

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Scrapes webpages and converts them to markdown using AI-powered interaction to automatically handle cookie banners, CAPTCHAs, paywalls, and other blocking elements before extracting clean content.
    15
    48
    Apache 2.0
  • A
    license
    B
    quality
    D
    maintenance
    Enables fetching and converting web content to markdown with built-in prompt injection safeguards that detect and block malicious content attempting to manipulate the LLM.
    1
    2
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables LLM agents to read any website by scraping and crawling into clean Markdown, automatically bypassing bot detection with residential proxies.
    3
    42
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Fetches and renders web pages using a headless Chromium browser, returning clean Markdown or HTML content even for JavaScript-heavy single-page applications.
    207
    MIT

View all related MCP servers

Related MCP Connectors

  • Web scraping for AI agents. Converts URLs to clean, LLM-ready Markdown with anti-bot bypass.

  • Fetch any URL and get clean Markdown. Web scraping for AI agents.

  • Read any web page as clean Markdown for AI agents: fetch, search, metadata, links. SSRF-safe.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ruslanstarikov/escalator'

If you have feedback or need assistance with the MCP directory API, please join our Discord server