Most scrapers extract once and quit. web_harvester is a no-code Chrome extension + Python CLI that keeps running on your schedule and tells you what changed. Pick a page, tick the fields (no code, it finds them), leave it on. It pings you only when something moves: price drop, back in stock, new listing, rank or review shift, via Slack, Discord, or email. Data lands in Sheets/CSV/Excel/SQL, stacked by date. Public data, your own session, robots respected, no CAPTCHA or proxy evasion.
No reviews yetBe the first to leave a review for web_harvester
Maker
📌
Hi PH, solo maker here. The value was never in scraping a page once, it was in being told the second something changed.
I built this because I was tired of re-checking competitor and supplier pages by hand every morning, and because every scraper I tried gave me one snapshot and called it done. So web_harvester is built around the diff: set a recipe once (URL + fields), leave it on, and it only pings you when something moves.
Under the hood a small recon engine sizes up each site across a few modes (JSON-LD, embedded JSON, repeating DOM) and auto-picks an extraction strategy, which is also what makes no-code field discovery work: it already knows where the values are, so you just tick the ones you want. SSR/JSON pages go server-side; dynamic or logged-in pages run inside your own real Chrome session, using your own cookies. I never store credentials or auto-log-in.
It is deliberately scoped: public data, your own access, low frequency, robots respected, no CAPTCHA or proxy evasion, by design.
Free on the Chrome Web Store (Basic: harvest, field-discovery, CSV/Sheets export):
https://chromewebstore.google.co...
Honest feedback very welcome. I will keep building in public.
Report
How does it actually handle sites that change their layout or DOM structure between scrapes - does it break silently or try to adapt?
Report
Maker
@ymet_k37866 Great question — that's the failure mode I worry about most, so let me be specific rather than hand-wave.
It does not try to auto-heal. What it does instead is bind to the most stable thing available. The recon engine proposes an extraction strategy in a fixed order: JSON-LD first, then embedded JSON (Next.js data blobs, window vars, af_data), and CSS selectors only as the last resort. That ordering is the real answer to layout churn — a visual redesign usually leaves the JSON-LD or the embedded JSON payload intact, so the recipe never notices the site got restyled. In those structured modes a field can also carry a fallback chain (price|offers.price|offers.0.price), tried in order until one resolves. Selector mode is the brittle one, and it is deliberately last.
When something does break, it does not pretend it worked: the run is flagged empty instead of ok, and the extension tells you it returned 0 rows plus the usual causes (blocked, login-gated, dynamic render, field mismatch).
Two honest gaps, since you asked directly:
A break does not reach your webhook. Alerts fire on price drops and new items, so a broken recipe currently looks like a quiet day if Slack is all you watch. A "returned 0, previously N" alert is the obvious fix.
The empty run still becomes the new baseline, so the next successful run can surface as a burst of "new items" rather than a clean recovery.
Both are going on the list — thanks for pushing on exactly the right spot.
Report
Maker
@ymet_k37866 Following up, since I said both gaps were going on the list.
Both are fixed in the code now. They are not on the Chrome Web Store yet - they ship in the next update, so what is live today still has the old behaviour. Saying it plainly so nobody assumes the build they have already does this.
(1) A break now reaches your webhook. A run that returns 0 rows when the previous run returned N is treated as a signal in its own right, instead of the alert count looking only at price drops and new items. The webhook fires, the message and the subject line lead with "0 rows - previously N" plus the likely causes, and the toolbar badge turns red. First-ever runs and recipes that were already empty are excluded, so it does not fire on day one or repeat the same alert every day.
(2) An empty run no longer becomes the baseline. The 0-row snapshot is not stored at all, so the last good snapshot stays the comparison point and the recovery run diffs against that - one genuinely new item instead of a burst of fake ones. There is a test that walks exactly that break-then-recover path.
12 tests around those two behaviours, extension suite at 150 passing.
One caveat I should keep honest: alerts and webhooks are a paid-tier feature, so on the free tier a broken recipe shows up in the extension popup (0 rows plus the likely causes) rather than being pushed to you.
Thanks again - your question is what surfaced both of these.
How does it actually handle sites that change their layout or DOM structure between scrapes - does it break silently or try to adapt?
@ymet_k37866 Great question — that's the failure mode I worry about most, so let me be specific rather than hand-wave.
It does not try to auto-heal. What it does instead is bind to the most stable thing available. The recon engine proposes an extraction strategy in a fixed order: JSON-LD first, then embedded JSON (Next.js data blobs, window vars, af_data), and CSS selectors only as the last resort. That ordering is the real answer to layout churn — a visual redesign usually leaves the JSON-LD or the embedded JSON payload intact, so the recipe never notices the site got restyled. In those structured modes a field can also carry a fallback chain (price|offers.price|offers.0.price), tried in order until one resolves. Selector mode is the brittle one, and it is deliberately last.
When something does break, it does not pretend it worked: the run is flagged empty instead of ok, and the extension tells you it returned 0 rows plus the usual causes (blocked, login-gated, dynamic render, field mismatch).
Two honest gaps, since you asked directly:
A break does not reach your webhook. Alerts fire on price drops and new items, so a broken recipe currently looks like a quiet day if Slack is all you watch. A "returned 0, previously N" alert is the obvious fix.
The empty run still becomes the new baseline, so the next successful run can surface as a burst of "new items" rather than a clean recovery.
Both are going on the list — thanks for pushing on exactly the right spot.
@ymet_k37866 Following up, since I said both gaps were going on the list.
Both are fixed in the code now. They are not on the Chrome Web Store yet - they ship in the next update, so what is live today still has the old behaviour. Saying it plainly so nobody assumes the build they have already does this.
(1) A break now reaches your webhook. A run that returns 0 rows when the previous run returned N is treated as a signal in its own right, instead of the alert count looking only at price drops and new items. The webhook fires, the message and the subject line lead with "0 rows - previously N" plus the likely causes, and the toolbar badge turns red. First-ever runs and recipes that were already empty are excluded, so it does not fire on day one or repeat the same alert every day.
(2) An empty run no longer becomes the baseline. The 0-row snapshot is not stored at all, so the last good snapshot stays the comparison point and the recovery run diffs against that - one genuinely new item instead of a burst of fake ones. There is a test that walks exactly that break-then-recover path.
12 tests around those two behaviours, extension suite at 150 passing.
One caveat I should keep honest: alerts and webhooks are a paid-tier feature, so on the free tier a broken recipe shows up in the extension popup (0 rows plus the likely causes) rather than being pushed to you.
Thanks again - your question is what surfaced both of these.