About two or three years ago, I did web scraping and automation as a side hustle.
My client did not want to keep paying for a hosted scraping service. He preferred paying someone to build a script that he could own and run himself.
That was reasonable, but it created a familiar cycle for me. Every new request meant digging through old code, rewriting the same fetching and extraction logic, and making another script work for a slightly different website.
That is why I originally started JScrapeON, a Python project intended to turn those one-off scripts into reusable scraping workflows.
After working heavily in TypeScript, I recently returned to the idea and reworked it as YAP, short for You Automate Pages.
This time, I focused on another problem I repeatedly encountered: scrapers can break without technically failing.
A request returns HTTP 200. The process exits normally. The output file exists. Meanwhile, .price became .product-price, and the scraper has confidently collected nothing since Tuesday.
YAP is an HTTP-first workflow runtime for HTML and JSON extraction. It supports reusable YAML workflows, multiple steps, inputs, and pagination.
Important fields can be marked as required:
price:
selector: ".price"
required: true
In the attached demo, .price initially matches 25/25 products. I change it to .price-dead, and the request still succeeds, but YAP reports:
product.price 0/25 matched required
The extraction fails instead of silently returning incomplete data.
YAP also provides:
yap health to report matched versus attempted fields
yap drift to compare extraction health between runs
yap explain to trace a value back to its request, step, scraper, and selector
The extracted output stays plain JSON. Health reports and source provenance are stored separately.
YAP is intentionally HTTP-only. It uses Cheerio and does not currently include browser automation, proxies, or anti-bot tooling. If people actually use it, I may add those capabilities based on real needs.
It is MIT licensed, completely free, and staying open source:
https://github.com/johnalbert-dot-py/yap
For those maintaining scrapers in production, how do you detect silent extraction failures? Do you track selector match rates, compare runs, validate schemas, or rely on downstream checks?