v0.1.0 — rewrite as a member of the 2scraper family
The first release of etsy-scraper in its current form: a rewrite that replaced the three standalone scripts with the shared architecture the rest of the family uses.
Tagged retroactively at the commit it describes, so the CHANGELOG's link to this tag resolves. For what is current, see v0.2.0.
What it does
Three modes over one output contract:
| mode | reads | anchor |
|---|---|---|
listing |
search results, category pages, shop fronts | data-listing-id |
product |
a listing's own page | JSON-LD Product |
shop |
a shop front plus its facts | both |
Sponsored placements are flagged rather than dropped: the ls=a URL parameter agreed with the visible label on 400 of 400 tiles across two languages, which is what makes it a structural signal instead of one that happens to work on one locale.
The parser inverts the family's usual order
Its siblings read JSON-LD first and fall back to the DOM. Etsy publishes an ItemList that is partial — 8 of 64 listings on a search page, 61 of 65 on a category page, 36 of 40 on a shop front — so structured data is the enrichment here and the DOM tile is primary. Trusting the ItemList would have silently dropped 88% of a search page.
Access
Etsy sits behind DataDome, and the repo says plainly what does and does not get in. Measured 2026-09-09, live:
| approach | result |
|---|---|
| curl from a hosting ASN | HTTP 403 |
| headless Chromium, hosting ASN | HTTP 403 |
| real Chrome, hosting ASN | HTTP 403 |
| headless Chromium via a residential exit | HTTP 403 |
| Scraping Browser API, fresh profile | HTTP 200, 64 listings |
The fourth row is the one worth reading twice: a residential proxy alone was not enough for an automated browser here.
Also in this release
- Exit codes
0/1/2/3/4/5/6, produced identically by all three engines through a sharedfinish_run() - A
<out>.meta.jsonsidecar per successful run, recording which pages failed by number - 27 locale prefixes with their currencies, taken from Etsy's own
hreflangset - Three engines, one behaviour — though only two reach Etsy; see the README's table for why Selenium cannot