Scrapeless Wiki

What Is a Soft Block? – Definition and How to Detect It

Informational P2 what is a soft block

Learn what a soft block is, why a 200 response can contain nothing, the forms it takes, and how to detect it before storing empty data.

A soft block is a refusal disguised as success. The response returns a normal status code, the parser runs without error, and the extracted result is empty, partial, or fabricated β€” so a pipeline records a quiet failure as a good run.

1. Why Soft Blocks Exist

A hard refusal tells the sender exactly what happened, which makes adjustment easy. Degrading quietly is more effective: the traffic keeps arriving, receives nothing useful, and the sender may not notice for a long time.

From the operator's perspective it also avoids refusing legitimate users outright when confidence is only moderate.

2. The Forms It Takes

Form What arrives
Empty result set Valid page structure, zero records
Truncated results The first few items, then nothing
Stale cache Real content, hours or days old
Challenge page with 200 An interstitial that parses like a document
Generic fallback A homepage or category page instead of the requested one
Altered values Fields present but rounded, delayed, or placeholder

The last is the most dangerous, because the data looks entirely plausible.

3. Why Status Codes Are Not Enough

Every one of those responses can be a 200. Pipelines that branch on status alone treat all of them as success, and the failure surfaces only when someone notices a downstream number is wrong.

4. Detecting It

Assert on content, not on status:

records = parse(response.text)
if len(records) < EXPECTED_MINIMUM:
    raise ValueError(f"soft block suspected: {len(records)} records, expected >= {EXPECTED_MINIMUM}")
if not any(r.get("price") for r in records):
    raise ValueError("required field empty across all records")

Useful assertions: minimum record count, required fields non-empty across a share of records, plausible value ranges, expected page markers present, and response size within a normal band.

5. Detecting the Subtler Forms

  • Stale content β€” check a timestamp on the page, or compare a value known to change.
  • Truncation β€” verify pagination markers agree with the count returned.
  • Fallback pages β€” confirm the canonical URL or a page identifier matches what was requested.
  • Altered values β€” sample against a manual check periodically; nothing else catches rounding or delay.

6. Responding to One

Treat a suspected soft block as a signal about volume and consistency rather than as a puzzle to defeat: reduce rate, preserve session state so clearance is reused, ensure the client is internally coherent, and check whether an API or permission route exists.

Continuing at the same rate against a soft block usually converts it into a hard one.

7. Building It Into a Pipeline

  1. Define expected minimums per source, not globally.
  2. Fail loudly on assertion breach rather than writing the batch.
  3. Keep the raw response for any failed assertion.
  4. Track the assertion failure rate per source over time β€” a rising trend is the early warning.
  5. Alert on zero-record runs specifically; they are the classic silent failure.

8. Summary

A soft block returns success while withholding data, in the form of empty, truncated, stale, fallback, or altered content. Status codes cannot detect it.

Validate content on every run with per-source expectations, keep raw responses for failures, and treat a soft block as feedback about how you are collecting rather than an obstacle to push through.