Ingestion · 2026

Durable web ingestion pipeline

Laboratory

Role
Independent engineer
Stack
Python, Camoufox, SQLite, Docker
Status
Laboratory

Problem

Scrapers that refetch the web on every crash, share one rate limit across sources, and dump broken records into the same table as good ones are not a pipeline. They are a script with optimism.

Constraint

This is a laboratory pattern, not a client metric page. Four demo sources ship with it, including a JavaScript-rendered page. Tests run offline against frozen HTML so a live site cannot flake the suite.

Architecture

  1. YAML sources
  2. Fetch + cache
  3. Parse
  1. Dedup
  2. Clean table
  3. Dead letter
Sources are YAML. Fetch writes a raw cache. Parse and validate, then deduplicate. Bad records go to a dead-letter queue. Tests use frozen HTML.

Decisions

  • YAML per source

    Rate limits, selectors, and retries live next to the source, not in a shared bag of globals.

  • Cache the raw HTML

    A crash does not refetch the corpus. Replay is a local problem.

  • Two-layer deduplication and a dead letter

    Duplicates and poison records do not enter the clean table. Retries happen when the server asked, not on a timer of hope.

Use this page to talk about durability. Use the e-commerce pipeline page if you need a shipped ingest with a morning table.

Outcome

Laboratory. Client metrics belong on the client pages, not here.

What was handed over

  1. How to add a source in YAML
  2. How to run the tests offline
  3. What the dead-letter queue looks like

hire@scrocle.cloud

Next project Process automation suite n8n workflows for operations