extract=auto. You get the full catalog (names, prices, SKUs, URLs, images) as one CSV or JSON file, with no selectors to write or maintain.
Uses: Crawl with include_patterns, Batch with Extract (extract=auto)
How it works
- Crawl discovers the pages. Starting from the store’s home page, Crawl follows links and keeps the URLs that match
include_patterns, here the paginated listing pages (/ecommerce/page/). - Batch extracts every page. One Batch job runs
extract=autoon every listing page in parallel. Each result is JSON with aproductsarray. - Your code merges the rows. The script flattens every page’s
productsinto one list, removes duplicates by product URL, and writescatalog.csvandcatalog.json.
include_patterns at product URLs (/product/) and run a Batch step with a css_extractor for the fields you need.
Ask your AI agent
With the Zenrows MCP server connected to Claude, Cursor or any MCP client, paste this prompt. Your agent picks the right Zenrows tools and settings on its own.Build the dataset
Install the Zenrows SDK (pip install zenrows or npm install zenrows). The script runs the three steps end to end. max_items=3 keeps the first run small: raise it, or remove it, to cover the whole catalog.
crawler.wait and job.run.wait poll until each step finishes, so the script runs top to bottom with no extra polling code.
Build it from the terminal
The Zenrows CLI runs the same pipeline with four commands and jq. Install it withnpm install -g @zenrows/cli and log in with zenrows login.
CLI
Example output
The Python script’s console output, from a run withmax_items=3:
catalog.csv:
catalog.json keeps every field Extract returned:
Customize it
Troubleshooting
- The crawl returns no listing pages: the pattern doesn’t match the store’s pagination URLs. Open page 2 in your browser, copy the part of the URL that repeats (
/page/,?page=,/p/) and use it asinclude_patterns. - The dataset is smaller than the store:
max_itemsstopped the crawl early. Raise it, and checkcrawl.coverage.items_foundagainst the store’s page count. - A page returns
REQS004: theextract_fieldsyou asked for aren’t on that page. The error’sdetaillists the available fields: copy the ones you need, or removeextract_fields. - Some Batch tasks failed: rerun only the failures with
job.retry_failed()(Python),job.retryFailed()(Node.js) orzenrows batch retry-failed <job-id>. Successful results carry over.
Related recipes
Map every URL on a website
Run Crawl on its own to list a site’s pages.
Get structured JSON from any page
How
extract=auto works on one page.Scrape a list of URLs
Send thousands of URLs as one Batch job.
Build a price monitor
Track the prices in your dataset over time.