Combining Scrapling with AI models: smart data extraction via scrapling[ai] and WebScrapingAI, the MCP server for AI agents, CSS-based element selection before passing content to an LLM to save tokens, and LLM-led parsing and validation.

In episode 18 you optimized performance: parser benchmarks, fetcher selection, and memory techniques. This time we combine that power with artificial intelligence. Websites keep changing, and hand-written selectors often break — this is where an LLM steps in as a flexible layer. Episode 19 covers AI & LLM extraction integration in the Scrapling ecosystem.
This episode's roadmap: we start with why AI is useful for extraction, then discuss scrapling[ai] and WebScrapingAI as AI fetchers, then the MCP server that opens Scrapling's capabilities to AI agents, and finally LLM-led parsing along with validation of the extraction results.
CSS and XPath selectors are deterministic: fast, cheap, and precise. But they're fragile against DOM structure changes. AI is the opposite: flexible at understanding intent, but not free — every model call costs time and tokens.
The best strategy is a combination of both. Scrapling handles the deterministic part (fetching, anti-bot bypass, element selection), and the LLM handles the flexible part (understanding content, normalizing formats, extracting fields that have no fixed pattern). By narrowing the content passed to the model, you get flexibility without burning tokens on the whole page.
The scrapling[ai] extra adds dependencies for the MCP server and AI tooling. Installation and browser setup:
pip install "scrapling[ai]"
scrapling installAfter that, all core fetchers remain available — Fetcher for light pages, StealthyFetcher for anti-bot defenses — but are now ready to be used from within an AI workflow.
The stack can be strengthened with WebScrapingAI, a hosted service that manages JavaScript rendering, proxies, and parsing via API. It's useful when a team doesn't want to manage its own browser infrastructure: just send a URL, and the result comes back as clean text or a ready-to-process JSON structure. The key is held in an environment variable, not hardcoded in code.
Warning
Never write an API key in code or commit it to a repository. Use environment variables or a secret manager, and store the key as a CI secret as discussed in the security episode.
The flagship AI ecosystem feature in Scrapling is the MCP server. MCP (Model Context Protocol) is a standard that lets AI agents — such as Claude Desktop, Claude Code, or Cursor — call web scraping tools directly in a conversation. Starting the server is as simple as the scrapling mcp command:
scrapling mcpFor remote use or from other applications, use the Streamable HTTP transport:
scrapling mcp --http --auth-token "$(openssl rand -hex 32)"The tools exposed by the server include get and bulk_get for fast HTTP requests, fetch and bulk_fetch for browser rendering, stealthy_fetch for bypassing anti-bot defenses, plus open_session, close_session, list_sessions, and screenshot for managing persistent browser sessions.
Configuration in an MCP client typically takes the form of a server declaration, for example in Claude Desktop:
{
"mcpServers": {
"ScraplingServer": {
"command": "scrapling",
"args": ["mcp"]
}
}
}With this configuration, you can give natural-language commands like: "Get all product titles from this URL with the selector .product-title, then summarize their prices." The server performs the scraping, and the model handles interpreting the results.
The Scrapling MCP server's unique advantage: you can point to a CSS selector before the content is sent to the AI. Other servers send the whole page to the model, wasting tokens on irrelevant content. Scrapling selects the target elements first, then forwards only that part — extraction becomes faster and cheaper.
from scrapling import Fetcher
page = Fetcher().get("https://shop.example.com/products")
cards = page.css(".product-card")
for card in cards:
print(card.get_all_text(separator=" | "))The MCP server also sanitizes content by default: CSS-hidden elements, aria-hidden, template tags, HTML comments, and zero-width characters are removed. This prevents malicious pages from injecting instructions into the model's context — an attack known as prompt injection.
On the application side, the common pattern is: gather the target content, hand it to the LLM to extract fields, then validate the results before using them. Validation is critical because model output isn't always consistent — data types can shift, fields can go missing.
import json
from typing import TypedDict
class Product(TypedDict):
title: str
price: float
in_stock: bool
raw = '{"title": "Kaos Polos", "price": "99000", "in_stock": "true"}'
data = json.loads(raw)
def validate(item: dict) -> Product:
assert isinstance(item["title"], str), "title harus string"
item["price"] = float(item["price"])
item["in_stock"] = item["in_stock"].lower() == "true"
return item
print(validate(data))After validation, the data can be directly serialized to JSON or stored in a database. The principle: LLM for flexibility, schema for certainty. In production, combine both — let the model fill the fields, then route items that fail validation to a retry path or manual review instead of polluting the dataset.
This episode opened the AI-based extraction path: scrapling[ai] as the tooling foundation, WebScrapingAI as a hosted option, the MCP server as a bridge to AI agents, and an LLM-led parsing pattern finished with schema validation. The key to efficiency is one sentence: narrow the content first, let the model work only on the relevant part.
The key takeaways:
scrapling[ai] and scrapling install set up the AI tooling plus browser dependencies.scrapling mcp, including an HTTP transport with auth token.In episode 20, we cover the code-quality side: Testing, Debugging & Maintenance — the interactive shell, tree inspection, selector verification, monitoring website changes, and CI for regression. See you there!