Why Sluicer¶
Most of what a scraper is asked for is already written into the page it scrapes. A product page carries its name, price, currency and SKU in JSON-LD for search engines; an article carries its headline, author and dates in OpenGraph and meta tags. Sluicer reads that, rather than guessing it from the visible text or asking a model to.
This page says where that puts it among the tools people reach for, and where another tool is the better choice. It is a map, not a race.
Where it sits¶
| Sluicer | extruct | trafilatura | CSS-selector scraper | LLM scraper | |
|---|---|---|---|---|---|
| Reads declared data (JSON-LD, microdata, RDFa, OpenGraph...) | yes, merged | yes, per vocabulary | partly | if you write it | if the model notices |
| Reads authors and dates from the visible prose | no | no | yes | if you write it | yes |
| One record per thing, across vocabularies | yes | no | no | no | varies |
| Says where every value came from | yes, reader and key | per vocabulary | no | no | no |
| Same page, same answer | yes | yes | yes | yes | no |
| Notices when a site's layout changes | yes, exit 3 | no | no | no, returns nulls | no |
| Says what moved after a redesign | yes, heal |
no | no | no | no |
| Fetches JavaScript-rendered pages | yes, a browser when measured necessary | no | no | depends | depends |
| Cost per page | CPU | CPU | CPU | CPU | tokens |
"Partly", "varies" and "depends" are honest: trafilatura reads some metadata tags on its way to the text, an LLM scraper's behaviour is its prompt's, and a hand-written scraper does whatever its author wrote.
What Sluicer adds¶
One record per thing, with its provenance. A page that describes the same product in JSON-LD, microdata and OpenGraph gives one record, and every field still names the vocabulary that declared it. Folding happens across vocabularies, never inside one: two products on a listing stay two products, because folding them would splice one's name onto the other's price.
A summary that answers the usual questions, and says how. Title,
description, author, dates, image, language, site name, publisher, type, price,
currency, availability, brand and SKU, one value each, chosen by fixed rules --
the article's headline before the site's name, og:title before <title>,
the price from inside offers -- and each naming its reader and key, so it can
be checked against the records.
The tags nobody owns. Across the 359 commercial pages of a public annotated
corpus, article:published_time is on 33% and <meta name="author"> on 29%.
The first is OpenGraph's article: namespace; the second belongs to no
vocabulary, and Sluicer reports it as "source": "html", because that is what
it is.
Extractors that fail loudly. Learn an extractor from two or three pages of
a template, replay it on any page of that template, and a page that drifted --
the listing moved, a field emptied, a price slot now says "Add to basket" --
fails with exit code 3 and the check that broke, instead of returning nulls
for weeks. After a redesign, heal says which field moved where, how many of
its old values were found in the new place, and keeps the column names your
code reads. See extractors.
A fetch that announces itself. Plain HTTP first, a browser only when a
measurement says the cheap rung got a refusal, a challenge or an empty shell,
and every climb reported with its reason and its cost in seconds. Every
request says Sluicer/<version>, borrows no browser's referer or fingerprint,
and obeys robots.txt -- and nothing is fetched when robots.txt cannot be
read, as RFC 9309 says. The stealth rung exists and never runs unless asked.
A tool an agent can trust. Six MCP tools, each answer with ok and an
output schema, an error that can never be mistaken for the page, and a server
that keeps every request -- redirects, images, frames, websockets -- off
private addresses unless told otherwise.
When to use something else¶
- You need the author or date of pages that do not declare them. trafilatura reads them from the visible text, and on the WCXB corpus it finds far more of them. It also dates 216 pages that have no date; Sluicer answers less often and is wrong less often. See the scoreboard.
- You need the article's text.
sluicer markdownuses trafilatura for exactly that; for anything beyond it, use trafilatura directly. - The data is not declared and the pages are not a repeated template. Induction reads listings and feeds; it does not read an arbitrary page's prose into fields. That is a model's job, and its answers should be checked.
- You are crawling a site. Sluicer fetches the page you ask for; it does
not follow links, pace itself by
Crawl-delay, or keep a frontier. Put it behind a crawler. - You only need one vocabulary, raw. extruct returns each vocabulary as the page wrote it, which is what you want when the merge is not.