All guides
DATA · 6 MIN READ

News scraping: dates, duplicates, and corrections

Build a verifiable news observation record that keeps source identity, publication dates, duplicate decisions, and later corrections traceable.

News scraping: dates, duplicates, and corrections

News data quality depends on preserving source identity, publisher-declared dates, fetch time, and later edits. Store each observation before deduplicating; treat similar headlines as candidates, not proven duplicates. This keeps corrections traceable without implying collection completeness or truth.

Define the observation before collecting

A news record should represent an observed source item, not a claim that the item is complete or true.

Keep the source URL as fetched, a normalized URL for matching, publisher identifier when present, retrieval timestamp, page-declared publication and modification times, retrieval status, content hash, and parser version. Store timestamps with an explicit timezone and preserve the original value when normalization is uncertain.

This contract separates three clocks: when the publisher says the story first appeared, when the source says it changed, and when the collector retrieved it. Atom entries define an id and updated timestamp, while RSS guid identifies an item but is not necessarily a URL (RSS specification, Atom RFC 4287).

A publisher identifier helps track a story but does not prove that two feeds use a globally unique identifier.

Field Preserve Why it matters
Source URL and publisher ID Fetched and normalized forms; feed ID when supplied Trace records back to a publisher item
Time fields Raw source values plus parsed UTC values and parse status Separate publication, update, and retrieval time
Observation Response status, content hash, parser version, extracted fields Reproduce what the collector actually saw
Relationship Duplicate candidate, correction, update, or supersession link Preserve how records relate without erasing history

This is a practical contract, not a universal schema. Some sources omit dates or identifiers, and some pages revise their text without an explicit correction marker. Store a missing value as unknown with its reason; do not fill it from a headline, crawl order, or unrelated feed timestamp.

Deduplicate without erasing source history

Start with exact matches on a normalized URL, but retain the original URL and the normalization rule.

Remove only known tracking parameters, standardize safe URL details, and avoid changing path or query parameters that may select different articles. URL equality is a useful candidate signal, not proof that two publishers or versions contain the same story.

Next compare publisher identifiers and content fingerprints. Exact item IDs can link a feed item to a page from the same publisher; RSS guid and Atom id have different source-level conventions.

For cross-publisher duplicates, title and body similarity can flag review candidates. A near-identical headline alone is weak evidence: wire copy, syndication, and separate reporting can produce similar text.

Represent the relationship instead of deleting one row. One record can be the original observation, another a publisher update, and a third a correction.

Keep each fetched version or content hash with its retrieval time, then link the records with a relationship type and the rule or reviewer that assigned it. This makes a downstream analyst able to distinguish a corrected story from a copied article or a new report on the same event.

Preserve corrections and date confidence

Keep the page’s visible publication date and modification date separately from structured metadata. Google recommends consistent visible and structured publication and modification dates for Article markup, but structured dates do not prove the publisher’s reporting history or guarantee a particular search display (Google Article structured data).

For each date, record its source, parser version, parse status, and confidence. For example, keep source: visible publication date separate from source: structured dateModified; mark an absent timezone as unknown instead of silently treating it as UTC. These are illustrative field values, not a collected record.

When a correction appears, add a correction observation with its time, source location, and affected fields. Do not silently rewrite an earlier snapshot: that destroys the evidence needed to explain why an analysis changed.

If the page changes without a correction notice, store the new hash and retrieval time, then mark the difference as an update whose editorial meaning is unknown.

Validate the collected batch

Before using a batch, inspect counts for fetched, failed, parsed, missing-date, duplicate-candidate, and correction records. Sample both ordinary and edge cases: a story without a date, one with a timezone, a redirect, an updated page, and two similar headlines from different sources. These are validation categories, not expected percentages or performance targets.

A collector’s successful HTTP response does not establish that its parser captured the intended article. Check a sample against the visible source page, preserve failed fetches, and record the parser version with the batch.

The Google Maps data sourcing guide uses a similar separation between returned records and validated fields, while this article focuses on news identity and change history.

The next decision is whether the dataset needs deduplicated story groups, source-specific item history, or both. Keep source observations intact in either case, then define which relationship types downstream users may collapse for a particular analysis.

This supports traceability; it does not provide legal advice, establish collection permission, or certify that a news claim is accurate.

Sources and further reading

ProxyLaneFrom $2/GB at 5 TB+

Your next connection
Starts here

Non-expiring traffic, location targeting and rotating or sticky sessions for your existing tools.

Create an account View plans

Keep reading

Amazon Scraper API vs Proxy: Choose a Product Data Source

Distinguish authorized Amazon APIs, licensed product data and proxy-based page checks by record quality and access rights.

Read guide

Apify Custom Proxy Setup: Use Your Own Residential Route

Connect a buyer-owned proxy to an Apify Actor, keep the session boundary clear, and validate records instead of counting requests.

Read guide

Australia Residential Proxies: Verify the AU Exit and State-Level Result

Separate Australian egress from en-AU content, AUD pricing, GST display, postcode validation and the state delivery context.

Read guide