Skip to content
Back to skills

Scrapling

ASecurity

Web scraping with anti-bot bypass (Cloudflare Turnstile etc.), stealth headless browsing, adaptive selectors, and concurrent crawls. Use when the user asks to scrape, crawl, or extract data from websites; the built-in WebFetch fails; the target has anti-bot protections; or the work needs JavaScript rendering. Prefers the registered MCP tools (mcp__scrapling__*) over raw Python so token cost stays low.

  • 2 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added October 26, 2026
developmentjavascriptpythongojavabashgitapi

Works with

  • claude code
  • api
  • mcp

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned October 26, 2026

npx -y skills add nhan03bit/ultrathink --skill scrapling --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Scrapling?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Scrapling
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/nhan03bit-scrapling/badge)](https://www.skillsdirectory.com/skills/nhan03bit-scrapling)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: scrapling
description: Web scraping with anti-bot bypass (Cloudflare Turnstile etc.), stealth headless browsing, adaptive selectors, and concurrent crawls. Use when the user asks to scrape, crawl, or extract data from websites; the built-in WebFetch fails; the target has anti-bot protections; or the work needs JavaScript rendering. Prefers the registered MCP tools (mcp__scrapling__*) over raw Python so token cost stays low.
layer: domain
category: data
triggers:
  - "scrape"
  - "scraping"
  - "crawl"
  - "crawler"
  - "spider"
  - "web data"
  - "extract from website"
  - "extract from url"
  - "anti-bot"
  - "cloudflare"
  - "turnstile"
  - "datadome"
  - "stealth fetch"
  - "headless browser"
  - "playwright scrape"
  - "scrape javascript"
  - "scrape spa"
  - "scrapling"
inputs:
  - Target URL(s) and what to extract
  - Whether the site has anti-bot protection (check first; default = no)
  - Whether the page is static HTML or dynamic (SPA / heavy JS)
  - Any auth, proxy, or session requirements
outputs:
  - Either: structured data extracted via MCP tools (preferred — cheaper)
  - Or: a small Python script using `scrapling.fetchers` / `scrapling.spiders`
linksTo:
  - vfs
  - code-intel
  - memory
---

# Scrapling — adaptive web scraping

[Scrapling](https://github.com/D4Vinci/Scrapling) is the active path for any task involving fetching content from the live web. Unlike Claude Code's built-in `WebFetch`, it:

- Renders JavaScript via Playwright (Chromium / real Chrome).
- Bypasses Cloudflare Turnstile / Interstitial out of the box (`stealthy_fetch`).
- Supports CSS / XPath / regex / similarity-based selectors.
- Persists sessions for multi-page flows (login → navigate → extract).
- Crawls at scale with the Scrapy-compatible spider framework.

## Decision tree — which Scrapling tool

```
Is the page static HTML / no bot protection?
├─ yes  →  mcp__scrapling__get  (HTTP-only, fastest)
└─ no
   ├─ Just JS, no anti-bot   →  mcp__scrapling__fetch   (browser-rendered)
   └─ Anti-bot protections   →  mcp__scrapling__stealthy_fetch  (full stealth)

Multiple URLs at once?              →  mcp__scrapling__bulk_get / bulk_fetch / bulk_stealthy_fetch
Page state matters across calls?    →  mcp__scrapling__open_session  →  reuse `session_id` on subsequent calls  →  close_session
Need a screenshot for the agent?    →  mcp__scrapling__screenshot
```

## Default arguments — keep token cost down

Pass these on every call unless the user says otherwise:

- `extraction_type: "markdown"` — markdown is ~30-50% fewer tokens than HTML
- `main_content_only: true` — strips nav, footer, sidebar
- `css_selector: "<minimal>"` — narrow further when the page is huge
- `disable_resources: true` (browser modes) — blocks fonts/images/media for speed

> **Important:** for command-line `scrapling` invocations (when MCP isn't available), always pass `--ai-targeted`. It enables ad blocking + sanitises hidden content to defend against prompt injection from the scraped page.

## Quick patterns (MCP-first)

**Static page → markdown of an article body**
```
mcp__scrapling__get(
  url="https://example.com/article",
  extraction_type="markdown",
  main_content_only=true,
  css_selector="article"
)
```

**SPA, no bot protection**
```
mcp__scrapling__fetch(
  url="https://app.example.com/dashboard",
  network_idle=true,
  wait_selector=".loaded",
  disable_resources=true
)
```

**Cloudflare-protected site**
```
mcp__scrapling__stealthy_fetch(
  url="https://protected.example.com",
  network_idle=true,
  google_search=true
)
```

**Multi-page flow with login (persistent session)**
```
sid = mcp__scrapling__open_session(stealth=true)
mcp__scrapling__stealthy_fetch(url="…/login", session_id=sid, ...)  # auto-includes cookies after
mcp__scrapling__stealthy_fetch(url="…/protected-data", session_id=sid)
mcp__scrapling__close_session(session_id=sid)
```

## When MCP isn't enough — fall back to Python

Code is the only way to use spiders, custom adaptive selectors with `auto_save`, or per-domain throttling. Scaffold:

```python
from scrapling.fetchers import StealthyFetcher
StealthyFetcher.adaptive = True
p = StealthyFetcher.fetch("https://example.com", headless=True, network_idle=True)
items = p.css(".product", auto_save=True)             # first run
# later, if site structure changes:
items = p.css(".product", adaptive=True)              # finds the renamed elements
```

Spider for full crawls:

```python
from scrapling.spiders import Spider, Response

class Demo(Spider):
    name = "demo"
    start_urls = ["https://example.com/listing"]
    async def parse(self, response: Response):
        for item in response.css(".product"):
            yield {"title": item.css("h2::text").get(),
                   "price": item.css(".price::text").get()}

Demo().start()
```

Pause/resume: hit Ctrl+C → relaunch picks up from the checkpoint.

## Setup (once per machine)

```bash
pip install "scrapling[all]>=0.4.7"
scrapling install --force   # downloads Playwright browser dependencies
```

Then verify the MCP server is registered: in `~/.mcp.json` or the project's `.mcp.json`, the `scrapling` entry runs `scrapling mcp` over stdio. Tools appear as `mcp__scrapling__*` in the tool surface.

## Pitfalls

- **WebFetch first?** No — UltraThink already prefers Scrapling for any non-trivial scrape. WebFetch is fine for plain markdown of a known-good docs page; for everything else, Scrapling is cheaper (token-wise) and won't fail on JS.
- **Don't reach for `requests` / `httpx`** in user code — Scrapling's `Fetcher` impersonates browser TLS + headers, while `requests` gets fingerprinted and blocked.
- **Don't paste credentials into prompts.** Pass them as `proxy_auth` / `auth` dict on the MCP call; the values aren't echoed back.
- **Adaptive selectors are not free** — `auto_save=True` writes a fingerprint sidecar file; `adaptive=True` recomputes against it. Only use when you're crawling the same site repeatedly.

## References

- Docs: https://scrapling.readthedocs.io/
- MCP server: https://scrapling.readthedocs.io/en/latest/ai/mcp-server.html
- Source: https://github.com/D4Vinci/Scrapling
- License: BSD-3-Clause

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.