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, поэтому примонтированный ./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 классифицирует каждый ответ после извлечения — content, thin или blocked — и только content считается. Без этого лестница никогда бы не поднималась, и кэш навсегда запомнил бы «http работает» для домена, который отдаёт мусор.

Кэш забывает. Выученная стартовая ступень, которая только повышалась, со временем уводила бы каждый домен к браузеру+прокси и незаметно раздувала счёт за прокси. Записи содержат learned_at; после ladder.tier_cache_ttl_hours домен пробует на одну ступень дешевле.

См. DESIGN.md о том, почему она устроена именно так — и о том, что она сознательно отказывается делать.

Конфигурация

Один файл, создаваемый init, в системном каталоге конфигурации (~/.config/escalator/config.toml на Linux, ~/Library/Application Support/escalator/config.toml на macOS). Переопределите расположение с помощью --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 — потолок по RAM на небольшой машине.

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

a Chrome UA

Используется для сопоставления с robots.txt.

server.api_keys

ESCALATOR_SERVER_API_KEYS

Bearer-ключи для escalator serve. Этот список — истина: удаление одного отзывает его.

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>, где ключ — один из server.api_keys. Этот список есть истина: удалите ключ — и он будет отозван при следующем запуске. Нет конечной точки для создания нового.

Стена возвращается как 200 OK с {"status": "challenged"}, а не как HTTP-ошибка. Это осознанно: агент на другом конце может на это отреагировать. Повторные попытки в цикле не помогут — escalator не решает CAPTCHA, по замыслу.

С дополнением [mcp] та же лестница доступна на /mcp как один инструмент, scrape_url(url, force_browser=False).

Устранение неполадок

Начните здесь:

escalator doctor

Он проверяет Python, файл конфигурации, каталог данных, разрешение браузера, реальный запуск в headless-режиме и — если прокси настроен — один реальный запрос через него, сообщая исходящий IP и страну с замаскированным паролем. Каждый ❌ сопровождается одной строкой, которая это исправляет, и код выхода ненулевой, если что-то не удалось, так что скрипты тоже могут это использовать. escalator doctor --json для машин.

симптом

обычно это

no Chrome-family browser found

escalator browser install

error while loading shared libraries на Linux

doctor называет пакет для установки

всё возвращает challenged

нужен резидентный прокси: escalator init

/scrape возвращает 401

не настроен ключ, или он был удалён из server.api_keys

медленный первый запрос браузера

холодный старт Chrome; escalator повторяет запуск один раз

Если всё ещё не работает, вставьте весь вывод escalator doctor в issue — именно об этом просит его последняя строка, и это самый быстрый путь к ответу.

Разработка

См. CONTRIBUTING.md. Кратко: uv sync, uv 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