Skip to content
Data Engineering 3 min read

Building Reliable Public-Web Data Pipelines

Public-web pipelines fail in boring ways: a layout changes, an encoding breaks, a rate limit appears. Engineering for those failures — detectably, recoverably — is what separates a dataset from a science project.

Every experienced data engineer has a story about a pipeline that worked beautifully until the day a marketing team redesigned a product page and three downstream dashboards went quietly wrong. Public-web pipelines live in an environment you don't control and can't negotiate with. Reliability here means something specific: failures are expected, so they must be detected fast and contained locally.

Treat sources as systems, not targets

The unit of engineering is not "a scraper" but a source profile — a documented contract with each public source covering what is collected, at what cadence, under what politeness constraints, and with what structural assumptions. The profile is versioned like code, because every structural assumption it makes *will* eventually be violated.

source-profile.example.yaml
source: example-retailer-listing kind: public_catalog cadence: daily politeness: max_concurrency: 2 rate_per_domain_per_min: 6 respect_robots: true extraction: schema: listing.v3 required: [title, price, currency, availability] optional: [promo_label, rating, review_count] drift: fingerprint: dom_structure_v2 on_change: quarantine_and_alert quality_gates: completeness_min: 0.97 price_change_max_pct: 40 # flag for review, not discard

Detecting drift before your users do

Structural fingerprints — stable hashes over the DOM regions you actually parse — catch layout changes early. But the more insidious failures are *semantic*: the field is still there, and now means something slightly different. That's why every pipeline needs two layers of monitors:

  • Structural monitors — fingerprints, parse success rates, field null rates per run.
  • Semantic monitors — distribution checks on values: price magnitude bounds, unit sanity, categorical vocabularies, cross-field coherence (a "sale price" above list price is a flag, not a fact).

The design rule we follow: no silent failure. Every degradation either passes a quality gate and ships, or is quarantined and alerts a human. "Shipped with a warning" is a state, visible in delivery metadata — never a default.

Normalization is where meaning is made

Raw extraction gives you strings; delivery requires meaning. Normalization maps those strings to canonical forms — currencies unified, units converted, entities resolved, vocabularies standardized. Do it in an explicit, versioned layer rather than scattering string munging across consumers. The quality framework only works if normalization is inspectable.

1collection run for a mid-size source, days later the layout changed
0silent deliveries — the drift was caught at the fingerprint layer
17minutes median time-to-alert for structural changes

Median time-to-alert across monitored sources, trailing 30 days.

Politeness and stability are the same work

Respectful collection — conservative concurrency, identified user agents, honored directives — isn't just ethics; it's what keeps sources stable enough to build on. Aggressive collection gets you blocked, and blocks are the most expensive failure mode there is. The acceptable-use boundaries we publish are engineering constraints as much as policy ones.

What "reliable" buys you

A pipeline with real monitoring changes the conversation downstream. Analysts stop asking "is this data right?" and start asking "what is this data saying?" — which is, bluntly, the only question worth paying for. Everything in this post exists to protect that conversation.

If you're evaluating vendors, ask one question first: "show me your quarantine dashboard." The answer tells you everything about their pipeline's actual maturity.

Daniel Brooks

Daniel designs the collection and normalization pipelines behind Heroku's datasets. He cares about honest error bars, boring-reliable infrastructure, and documentation that people actually read.

Related reading

Continue here

4 comments

Clara Voss

The source-profile YAML is a great pattern. We’ve adopted something similar — including the quarantine-on-fingerprint-change rule — and on-call pages dropped noticeably.

Daniel Brooks

The quarantine rule is controversial until the first time it saves a delivery, Clara. Thanks for the confirmation from the field.

Owen Murphy

“No silent failure” — simple to say, hard to enforce. The three-outcome gate design is the cleanest formulation I’ve seen.

Hannah Kim

Any chance of a follow-up on testing extraction logic? Fixture-heavy testing for parsers is where our coverage is weakest.

Join the discussion