Web Scraper
Вежливый скраппинг HTML-страниц в Markdown/JSON на чистом Python 3 stdlib.
Загружай этот скилл когда нужно извлечь данные с веб-страницы: текст,
ссылки и таблицы из выбранных секций — для анализа, отчётов или датасетов.
🎯 When to use
Use this skill when:
- Нужно скачать данные с сайта: текст, ссылки, таблицы из выбранных блоков
- Просят «скраппинг», «парсинг сайта», «парсер html», «извлечь данные»
- Нужен быстрый дамп страницы в Markdown или JSON без установки библиотек
- Нужен вежливый сбор данных с учётом robots.txt и rate limit
Do NOT use when:
- Нужен полноценный CSS/XPath-парсер с вложенными селекторами — это
BeautifulSoup/lxml
- Нужен обход JS-рендеринга (SPA) — stdlib не исполняет JavaScript
- Нужен массовый сбор тысяч страниц — согласуй с владельцем сайта и ToS
- Нужны данные из API — используй прямой HTTP-запрос к API
📦 Files
SKILL.md — этот файл
scripts/scrape.py — скрапер (Python 3 stdlib: urllib.request, html.parser)
🧰 Usage
# Markdown (по умолчанию), селектор по классу:
python3 skills/web-scraper/scripts/scrape.py --url https://example.com --selector "div.item"
# JSON, селектор по id:
python3 skills/web-scraper/scripts/scrape.py --url https://example.com --selector "div#list" --output json
# Все абзацы страницы:
python3 skills/web-scraper/scripts/scrape.py --url https://example.com --selector "p"
# Локальный файл (без сети, для теста):
python3 skills/web-scraper/scripts/scrape.py --url file:///tmp/test.html --selector "p"
# Увеличить задержку между запросами:
python3 skills/web-scraper/scripts/scrape.py --url https://example.com --selector "article" --delay 2.5
Селектор — простой tag, tag#id или tag.class (например div#list, tr.row).
Каждый совпавший элемент становится отдельным пунктом: текст, ссылки и таблицы.
⚖️ Legal guardrails
Скрипт соблюдает правила вежливого скраппинга (встроены в код):
- robots.txt — перед запросом читается
robots.txt с origin-хоста; если путь
запрещён правилом Disallow, скрипт пропускает страницу с сообщением и кодом 3.
- User-Agent — честный идентификатор
Mozilla/5.0 (compatible; web-scraper/1.0; +educational).
- Rate limit — задержка между запросами по умолчанию 1.0 с (
--delay).
- Лимит размера — страницы больше 10 МБ отклоняются.
- ToS — перед массовым сбором проверь условия использования сайта и
авторские права на данные; скрипт предназначен для образовательных целей.
🔬 Проверка результата
- Markdown: начинается с
# <title>, содержит секции ## Элементы (N) с текстом,
ссылками и таблицами.
- JSON: валидный JSON с ключами
title, url, matched, items[] (text, href).
- При ошибке сети/robots скрипт пишет причину в stderr и завершается с кодом 2
(или 3 при запрете robots.txt), без traceback в stdout.
Canonical analogues
Канонические аналоги, недостающие техники (Retry-After, backoff + jitter, crawl-delay, rate-limit заголовки, условные запросы) и CLI-примеры — в references/canonical-patterns.md. Топ:
- MCP Fetch Server (modelcontextprotocol/servers) — эталон «URL → Markdown»: robots.txt по умолчанию, честный UA, лимит размера.
- Scrapy — эталон вежливости: RobotsTxtMiddleware, AutoThrottle (адаптивная задержка), ретраи на 408/429/5xx.
- Crawlee (Apify) —
respect_robots_txt_file=True, ретраи с backoff, autoscaling, ротация прокси.
- Playwright — браузерное извлечение: locator API,
text_content(), page.content().
- Trafilatura — ближайший по назначению аналог: CLI HTML → Markdown/JSON.
- Mozilla Readability — канонический алгоритм извлечения основного контента статьи.
1---2name: web-scraper3description: Вежливый скраппинг HTML-страниц в Markdown/JSON. Скрипт scrape.py читает страницу по URL, применяет простой CSS-селектор (tag, tag#id, tag.class) для выбора строк/секций, извлекает текст, ссылки и таблицы и отдаёт результат в Markdown или JSON. Легальные guardrails встроены в код: проверка robots.txt, честный User-Agent, задержка между запросами (по умолчанию 1.0 с), лимит размера страницы 10 МБ. Триггеры: 'web scraping', 'скраппинг', 'скачать данные с сайта', 'парсинг сайта', 'парсер html', 'извлечь данные', 'scrape', 'scraping'.4license: MIT5---67# Web Scraper89> Вежливый скраппинг HTML-страниц в Markdown/JSON на чистом Python 3 stdlib.1011Загружай этот скилл когда нужно **извлечь данные с веб-страницы**: текст,12ссылки и таблицы из выбранных секций — для анализа, отчётов или датасетов.1314## 🎯 When to use1516Use this skill when:17- Нужно скачать данные с сайта: текст, ссылки, таблицы из выбранных блоков18- Просят «скраппинг», «парсинг сайта», «парсер html», «извлечь данные»19- Нужен быстрый дамп страницы в Markdown или JSON без установки библиотек20- Нужен вежливый сбор данных с учётом robots.txt и rate limit2122Do NOT use when:23- Нужен полноценный CSS/XPath-парсер с вложенными селекторами — это `BeautifulSoup`/`lxml`24- Нужен обход JS-рендеринга (SPA) — stdlib не исполняет JavaScript25- Нужен массовый сбор тысяч страниц — согласуй с владельцем сайта и ToS26- Нужны данные из API — используй прямой HTTP-запрос к API2728## 📦 Files2930- `SKILL.md` — этот файл31- `scripts/scrape.py` — скрапер (Python 3 stdlib: `urllib.request`, `html.parser`)3233## 🧰 Usage3435```bash36# Markdown (по умолчанию), селектор по классу:37python3 skills/web-scraper/scripts/scrape.py --url https://example.com --selector "div.item"3839# JSON, селектор по id:40python3 skills/web-scraper/scripts/scrape.py --url https://example.com --selector "div#list" --output json4142# Все абзацы страницы:43python3 skills/web-scraper/scripts/scrape.py --url https://example.com --selector "p"4445# Локальный файл (без сети, для теста):46python3 skills/web-scraper/scripts/scrape.py --url file:///tmp/test.html --selector "p"4748# Увеличить задержку между запросами:49python3 skills/web-scraper/scripts/scrape.py --url https://example.com --selector "article" --delay 2.550```5152Селектор — простой `tag`, `tag#id` или `tag.class` (например `div#list`, `tr.row`).53Каждый совпавший элемент становится отдельным пунктом: текст, ссылки и таблицы.5455## ⚖️ Legal guardrails5657Скрипт соблюдает правила вежливого скраппинга (встроены в код):5859- **robots.txt** — перед запросом читается `robots.txt` с origin-хоста; если путь60 запрещён правилом `Disallow`, скрипт пропускает страницу с сообщением и кодом 3.61- **User-Agent** — честный идентификатор62 `Mozilla/5.0 (compatible; web-scraper/1.0; +educational)`.63- **Rate limit** — задержка между запросами по умолчанию 1.0 с (`--delay`).64- **Лимит размера** — страницы больше 10 МБ отклоняются.65- **ToS** — перед массовым сбором проверь условия использования сайта и66 авторские права на данные; скрипт предназначен для образовательных целей.6768## 🔬 Проверка результата6970- Markdown: начинается с `# <title>`, содержит секции `## Элементы (N)` с текстом,71 ссылками и таблицами.72- JSON: валидный JSON с ключами `title`, `url`, `matched`, `items[]` (`text`, `href`).73- При ошибке сети/robots скрипт пишет причину в stderr и завершается с кодом 274 (или 3 при запрете robots.txt), без traceback в stdout.7576## Canonical analogues7778Канонические аналоги, недостающие техники (Retry-After, backoff + jitter, crawl-delay, rate-limit заголовки, условные запросы) и CLI-примеры — в [references/canonical-patterns.md](references/canonical-patterns.md). Топ:7980- **MCP Fetch Server** (modelcontextprotocol/servers) — эталон «URL → Markdown»: robots.txt по умолчанию, честный UA, лимит размера.81- **Scrapy** — эталон вежливости: RobotsTxtMiddleware, AutoThrottle (адаптивная задержка), ретраи на 408/429/5xx.82- **Crawlee** (Apify) — `respect_robots_txt_file=True`, ретраи с backoff, autoscaling, ротация прокси.83- **Playwright** — браузерное извлечение: locator API, `text_content()`, `page.content()`.84- **Trafilatura** — ближайший по назначению аналог: CLI HTML → Markdown/JSON.85- **Mozilla Readability** — канонический алгоритм извлечения основного контента статьи.