Most web scraping projects don't fail because they can't extract data. They fail six months later, when duplicate records have quietly piled up, historical gaps have opened where nobody was looking, and no one can say which price actually changed or when.
A scraper is easy. Keeping scraped data trustworthy over time is the hard part.
That distinction is what separates a script from a data pipeline, and it comes down to three questions a one-time scrape can't answer: what changed since last time, what's missing from the history you never captured, and which of these records are actually the same real-world thing? This article covers the three capabilities that answer them, change detection, historical backfills, and deduplication, what each one is, how it works, and why each is harder than it looks.
The Difference Between a Scraper and a Data Pipeline
A script answers one question: what's on this page right now? A pipeline answers three harder ones: what changed since last time, what's missing from our history, and which of these records are actually the same thing?
The distinction matters because raw scraped data degrades in predictable ways. Prices go stale between runs. Gaps open up when a scraper breaks and nobody backfills them. Duplicate records accumulate from overlapping sources until your "10,000 products" is really 6,000 products counted badly.
Each failure is invisible in a single run and corrosive over months. And each one feeds directly into the kind of quality problem that Gartner estimates costs organizations an average of $12.9 million a year. The three capabilities in this article are the difference between data you can build on and data that slowly lies to you.
At a glance, here's what each one does:
| Capability | Prevents | Primary benefit |
|---|---|---|
| Change detection | Stale data | Real-time monitoring |
| Historical backfills | Missing history | Complete datasets |
| Deduplication | Duplicate entities | Accurate analytics |
There's a structural reason scraped pipelines are harder than internal ones, and it's worth naming up front. With a company's internal data pipelines there are mature tools and practices, like data contracts, for managing change; with web scraping you often learn a source has changed only when your scraper stops working. You don't control the source, you can't negotiate its schema, and it can change without warning. Everything below is a response to that lack of control.
Change Detection: Knowing What Actually Changed
Change detection is the capability that tells you not just what the data is, but what moved since the last time you looked.
Why re-scraping everything doesn't answer the question
The naive approach is to scrape everything on a schedule and overwrite the old data. This keeps the data current, but it throws away the single most valuable piece of information: what changed.
Consider a single product tracked across two days:
Monday Tuesday
iPhone 15 iPhone 15
$899 $799
Without change detection, the database just says: $799
With change detection, it says: $899 → $799, dropped Tuesday, [store]
That difference is the whole point. "The current price is $799" tells a repricing engine almost nothing. "This dropped $100 overnight" tells it a competitor just moved and the weekend is in play. The change is the signal, and overwriting erases it. Re-scraping full catalogs every run is also slow and expensive, hammering both target sites and your own infrastructure to reprocess data that mostly didn't change.
How change detection works
The mechanics are a comparison between a stored baseline and a fresh capture. The sophistication ranges from crude to precise:
| Method | What it detects | Best for | Limitation |
|---|---|---|---|
| Full-page hashing | Whether anything on the page changed at all | Cheap "did this move?" checks on stable pages | Noisy: any pixel of change (an ad, a timestamp) trips it |
| Field-level hashing | Whether a specific field (price, stock) changed | Targeted monitoring of the values you care about | Requires knowing which fields matter upfront |
| Field-level diffing | The exact before and after values | Repricing, audit trails, granular alerts | More storage and compute per record |
In practice, many pipelines hash a normalized JSON representation of just the monitored fields using something like SHA-256, store that hash keyed by URL and capture time, then compare each new run's hash against the last stored one. If the hashes differ, the record is flagged for downstream processing: a price change fires a repricing update, a stock change updates availability intelligence. Only changed records flow onward, which is both more informative and dramatically cheaper than reprocessing everything. This is the web-scraping cousin of what data engineers call change data capture (CDC) or delta detection in database pipelines, the same incremental principle applied to a source you don't control.
Separating signal from noise
The hard part of change detection isn't spotting changes; it's ignoring the ones that don't matter. Modern pages are full of movement that means nothing: rotating ad slots, cookie banners, view counters, session tokens, timestamps that update on every load. A naive hash of the full page reports "changed" on every single scrape, which is the same as reporting nothing.
Getting this right means normalizing before comparing: strip the volatile elements, isolate the fields that carry business meaning, and hash those. But there's a trap on the other side. Over-normalize and you hide real changes, for instance, stripping all numbers from a page to reduce noise would also strip the price change you were trying to catch. Tuning that boundary, aggressive enough to kill noise, careful enough to preserve signal, is where most of the engineering effort actually goes.
What change detection unlocks
Done well, change detection turns a data feed into a monitoring system. It's what makes real-time competitor price monitoring possible, since repricing rules need to fire on the change, not on a full nightly refresh. It powers stock and availability alerts, catches new listings the moment they appear, and, as a side benefit, slashes processing costs by touching only what moved.
Detecting changes keeps tomorrow's data accurate. But what about the data you never collected in the first place?
Historical Backfills: Reconstructing the Past You Didn't Capture
Change detection handles the future. Backfilling handles the past, and it's the capability people wish they'd thought about six months earlier.
Why scraped history is uniquely unrecoverable
Internal data can usually be reprocessed from source systems. Scraped data often cannot, because the source is a live website that shows only its current state. Last month's prices, last quarter's product assortment, the listings that existed before a competitor's redesign, if you didn't capture them when they were live, they're usually gone.
The web doesn't keep a backup for you. This is what makes historical gaps in scraped datasets so costly: a missing month isn't a re-run away, it's frequently unrecoverable, which raises the stakes on both capturing continuously and backfilling correctly when you can.
The two backfill scenarios
Backfilling comes up in two distinct situations. The first is gap-filling: a scraper broke, ran incompletely, or got blocked for a stretch, and now there's a hole in an otherwise continuous dataset. This is the recovery case. If you want the full operational process for detecting a broken scraper and repairing the damage, we've covered what happens when a scraper breaks in detail, and backfilling is the step that closes the gap afterward by re-queuing the missed pages and merging the recovered data back in.
The second scenario is cold-start: you're beginning a new project and want history that predates your first scrape, to train a model or establish a baseline. These need different approaches, and the second is far harder.
Where backfill data comes from, and its limits
Gap-filling is often achievable if you act quickly, since a price or listing missed yesterday may still be live today. Cold-start history is a different matter, and honesty about the limits is important. Some historical data can be reconstructed from archives, cached pages, or third-party datasets, but coverage is partial, quality varies, and many sources simply have no retrievable past state.
The realistic answer for true historical depth is usually to start capturing now and build the history going forward, treating any recoverable past data as a bonus rather than a guarantee. A vendor who promises complete historical backfill for any site should be treated with skepticism.
Backfilling correctly
Backfilled data is dangerous if merged carelessly, because it collides with data you already have. Doing it right means three things: deduplicating on merge so recovered records don't double up with existing ones, validating the backfilled data against the same quality checks as live data so you don't patch a gap with garbage, and preserving provenance metadata so a backfilled record stays distinguishable from one captured live, with its true collection date intact.
A backfill that silently mislabels reconstructed data as originally-captured corrupts exactly the historical record it was meant to repair. This is also why these capabilities get more valuable when every record is traceable to its source: lineage is what lets you tell a live capture from a backfilled one months later.

Deduplication: One Real-World Thing, One Record
The third capability answers the uniqueness question: when two records look similar, do they describe the same real-world thing, and which version do you keep?
Why scraped data is duplicate-prone by nature
Scraping generates duplicates structurally, not accidentally. The same product appears on a brand's own site, on multiple marketplaces, and on aggregators, each with different formatting. Pagination overlaps re-capture the same item across pages. Re-runs collect records already collected.
The business cost is concrete. Without deduplication, a retailer's catalog might appear to hold 30,000 products when only 18,000 genuinely exist. Every downstream system inherits that error: inventory reports overcount, pricing analysis skews toward whichever products happen to be duplicated most, and any machine-learning model trained on the data learns a distorted version of the market. Deduplication is what collapses all of that back down to one entity, one record.
Exact vs. fuzzy matching
Deduplication comes in two strengths. Exact matching (deterministic) collapses records that share an identical key, a clean product ID, a matching GTIN. It's fast and certain, and it only works when a reliable shared identifier exists.
Scraped data usually isn't that tidy, which is where fuzzy matching (probabilistic) comes in. Fuzzy deduplication identifies records referring to the same real-world entity even when they differ through errors, abbreviations, or inconsistent formatting, scoring similarity rather than demanding equality. A worked example makes the difference obvious:
Record A: "Apple iPhone 15 Pro 256GB - Natural Titanium"
Record B: "iPhone 15 Pro (256 GB) Natural Titanium"
Record C: "APPLE IPHONE 15 PRO 256GB TITANIUM NATURAL"
Exact match: three different strings -> 3 separate products (wrong)
Fuzzy match: ~0.95 similarity -> 1 product, 3 sources (right)
The technique compares records using similarity methods such as string, phonetic, and numeric matching to catch duplicates that aren't identical, which is exactly what messy scraped catalogs demand.
Entity resolution at scale
At volume, fuzzy matching alone is too slow, because comparing every record against every other is computationally explosive. The mature approach is entity resolution, also called record linkage or entity matching, which adds structure to make matching scale.
The general shape is deterministic matching on any reliable identifier first, then fuzzy signals on descriptions, brands, and specs to catch records that lack or disagree on a shared key. Systems narrow the field with blocking (only comparing records likely to match, e.g. same brand and category), then resolve matched groups into a single canonical record with a stable identifier. Cloud entity-resolution services follow this pattern, applying match rules to group related records and assigning each group a match ID that represents one deduplicated entity. The output is what downstream teams actually want: one trustworthy record per real-world thing, with its sources linked rather than duplicated.
The cost of getting it wrong
Deduplication has two failure modes, and they pull in opposite directions. Under-merge (too strict) and duplicates survive, inflating your counts. Over-merge (too loose) and you collapse genuinely different products into one, destroying real data, a 128GB and a 256GB phone fused into a single wrong record.
Tuning the threshold between them is the whole game, and it's why deduplication benefits from a review step for borderline matches rather than blind automation. This work sits inside the broader data cleaning pipeline that turns raw scraped output into something analysis-ready.
How the Three Work Together
These aren't three separate features; they're three facets of one mature pipeline, and they reinforce each other. Here's how data actually flows through a production competitor-monitoring feed:
Website
│
Scraper
│
Raw Records ────────────── (5 sources, heavy overlap)
│
Deduplication
│
Canonical Records ─────────── (1 record per product, sources linked)
│
Change Detection
│
Only Changed Records ───────── (~3% of the catalog moved)
│
┌──────┴──────┐
Database Repricing
│ + Alerts
Historical
Versions ◄──── Backfills fill any gaps in this record
The ordering isn't arbitrary. Change detection needs deduplication first, otherwise you're diffing five copies of the same product against each other and every "change" is really just a different source's formatting. Backfills need deduplication on merge, or they double-count. And the historical record that change detection builds run after run is exactly what backfills exist to protect and repair. Remove any one capability and the other two degrade. Together they turn a stream of raw rows into a clean, current, and complete dataset with a memory.
Build or Buy? The Operational Reality
It's tempting to think these are just three extra features to bolt onto a scraper. In reality, each one becomes its own engineering discipline the moment you operate at production scale.
What building all three in-house actually costs
A team building this owns change-detection logic tuned per source, a backfill and recovery process with validation, an entity-resolution system that scales without over-merging, and the monitoring to keep all of it honest as target sites change underneath them.
That's substantial, senior engineering effort, and it competes with every other priority the team has. It also helps explain why data engineers already spend around 40% of their time dealing with bad data: much of that is exactly this work, done reactively. For teams whose product is the insight rather than the pipeline, that's expensive time spent on undifferentiated plumbing.
What a mature pipeline looks like in numbers
To make the payoff concrete, consider a representative electronics retailer monitoring 1.8 million products across five marketplaces. Straight scraping produces roughly 5.2 million raw rows per run, because the same products recur across sources and pages. The unmanaged version of this dataset reports 5.2 million "products" and reprocesses all of them every cycle.
Run it through the three capabilities and the picture changes sharply. Entity resolution collapses the 5.2 million rows to 1.8 million canonical products with their sources linked. Change detection then finds that only a small fraction of those actually move on any given run, so instead of pushing 1.8 million updates downstream, the pipeline pushes only the few percent that changed, cutting alert and processing volume by the vast majority. Backfills keep the historical series intact when a source blips. Same raw input, a dataset that's now accurate, current, and a fraction of the cost to operate.
What to expect from a managed provider
A managed scraping service should deliver these capabilities as part of the data, not as features you assemble yourself: deduplicated canonical records, change flags on what moved, and a documented backfill process for gaps. The way to hold a provider to that is the same discipline as any enterprise data relationship, contractual delivery and quality terms that specify deduplication, change reporting, and recovery rather than leaving them to hope.
The right question for a vendor isn't "can you scrape this site?" It's "what do you do about change, history, and duplicates?" The answer separates a scraping script from a data pipeline.
The Production Pipeline Checklist
If you're evaluating your own setup or a provider's, this is the short list that separates a script from a pipeline:
- Detect only meaningful field changes, not cosmetic page noise
- Store historical versions rather than overwriting
- Preserve the true collection timestamp on every record
- Validate backfilled records against the same checks as live data
- Deduplicate before anything flows downstream
- Monitor for scraper failures and silent breakage
- Keep provenance metadata so every value traces to its source
- Review borderline fuzzy matches instead of auto-merging
- Alert on schema changes so a broken selector doesn't become a silent gap
Conclusion
The three capabilities reduce to a simple framework worth remembering:
Change detection tells you what changed. Historical backfills recover what you missed. Deduplication ensures every record represents one real-world entity. Together, they turn web scraping from a one-time extraction script into a production-grade data pipeline.
None of this shows up in a proof of concept. It shows up three months in, when the dataset has quietly filled with stale prices, historical holes, and triplicate products. Building these capabilities is real work. Skipping them is more expensive, just later, and harder to trace.
DataHen builds managed scraping pipelines with change detection, deduplication, and backfill handling built in, so the data arriving in your systems is already current, deduplicated, and continuous. If your team is spending more time cleaning scraped data than using it, request a quote and tell us what you're collecting.

Frequently Asked Questions
Q: What is change detection in web scraping?
Change detection is the capability that identifies what changed in scraped data between runs, rather than just capturing the current state. It works by comparing a stored baseline against a fresh capture, often by hashing the specific fields that matter, and flagging only the records that moved. This is what makes real-time monitoring, repricing, and change alerts possible, and it's far cheaper than re-scraping and reprocessing everything each run. It's the web-scraping equivalent of change data capture (CDC) in traditional data pipelines.
Q: What is incremental scraping?
Incremental scraping is the practice of collecting only new or changed data since the last run, rather than re-scraping everything. It relies on change detection to identify what's different, then processes only those records. The benefits are efficiency (less load on target sites and your infrastructure) and informativeness (you capture the fact that something changed, not just its new value). It's the default approach for any scraping operation running on an ongoing schedule.
Q: What is a historical data backfill?
A backfill is the process of filling in scraped data for a period you didn't originally capture, either patching a gap left by a broken or incomplete run, or reconstructing history that predates your first scrape. Gap-filling is often achievable if done quickly. Reconstructing older history is much harder, because most websites expose only their current state, so past data is frequently unrecoverable. Backfilled data must be deduplicated on merge, validated, and labeled with its true collection date.
Q: Can you backfill scraped data you never collected?
Sometimes, but with real limits. Some past data can be reconstructed from archives, caches, or third-party datasets, but coverage is partial and many sources have no retrievable history at all. Any vendor promising complete historical backfill for any site is overpromising. The reliable path to historical depth is to start capturing continuously now and build history forward, treating recoverable past data as a bonus rather than something you can count on.
Q: What is the difference between exact and fuzzy deduplication?
Exact (deterministic) deduplication merges records that share an identical key, such as a clean product ID. It's fast and certain but only works when a reliable shared identifier exists. Fuzzy (probabilistic) deduplication scores how similar records are and merges those above a threshold, catching duplicates that differ through formatting, abbreviations, or typos. Scraped data usually needs fuzzy matching because the same product is described differently across sources, with no shared clean identifier.
Q: What is entity resolution?
Entity resolution, also called record linkage, is the process of determining which records refer to the same real-world entity and consolidating them into one canonical record, even across different sources and formats. At scale it combines deterministic matching on any reliable identifier, fuzzy matching on attributes like names and specs, and blocking to make the comparison computationally feasible. For scraped product data spanning many sources, it's what produces one trustworthy record per product instead of many partial duplicates.
Q: Why is deduplication harder for scraped data than internal data?
Internal data usually carries clean, consistent identifiers assigned by your own systems. Scraped data doesn't: the same product appears across sites with different names, formats, and no shared key, and pagination overlaps and re-runs generate further duplicates. That forces reliance on fuzzy matching and entity resolution rather than simple exact-match dedup, and it requires careful threshold tuning to avoid both under-merging (surviving duplicates) and over-merging (collapsing genuinely different items).