Crawler Skill Converts any URL into clean markdown using a robust 3-tier fallback chain. Quick start uv run scripts/crawl.py --url https://example.com --output reports/example.md Markdown is saved to the file specified by --output . Progress/errors go to stderr . Exit code 0 on success, 1 if all scrapers fail. How it works The script tries each tier in order and returns the first success: Tier Module Requires 1 Firecrawl ( firecrawl_scraper.py ) FIRECRAWL_API_KEY env var (optional; falls back if missing) 2 Jina Reader ( jina_reader.py ) Nothing — free, no key needed 3 Scrapling ( scrapling_scraper.py ) Local headless browser (auto-installs via pip) File layout crawler-skill/ ├── SKILL.md ← this file ├── scripts/ │ ├── crawl.py ← main CLI entry point (PEP 723 inline deps) │ └── src/ │ ├── domain_router.py ← URL-to-tier routing rules │ ├── firecrawl_scraper.py ← Tier 1: Firecrawl API │ ├── jina_reader.py ← Tier 2: Jina r.jina.ai proxy │ └── scrapling_scraper.py ← Tier 3: local headless scraper └── tests/ └── test_crawl.py ← 70 pytest tests (all passing) Usage examples
Basic fetch — tries Firecrawl, falls back to Jina, then Scrapling
Always prefer using --output to avoid terminal encoding issues
uv run scripts/crawl.py --url https://docs.python.org/3/ --output reports/python_docs.md
If no --output is provided, markdown goes to stdout (not recommended on Windows)
uv run scripts/crawl.py --url https://example.com
With a Firecrawl API key for best results
FIRECRAWL_API_KEY
fc-
..
. uv run scripts/crawl.py
--url
https://example.com
--output
reports/example.md
URL requirements
Only
http://
and
https://
URLs are accepted. Passing any other scheme
(
ftp://
,
file://
,
javascript:
, a bare path, etc.) exits with code
1
and prints a clear error — no scraping is attempted.
Saving Reports
When the user asks to save the crawled content or a summary to a file,
ALWAYS
use the
--output
argument and save the file into the
reports/
directory at the project root (for example,
{project_root}/reports
). If the directory does not exist, the script will create it.
Example:
If asked to "save to result.md", you should run:
uv run scripts/crawl.py --url