Skip to main content
Point Crawl at a store, let it find every listing page, then send those pages to Batch with 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

  1. 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/).
  2. Batch extracts every page. One Batch job runs extract=auto on every listing page in parallel. Each result is JSON with a products array.
  3. Your code merges the rows. The script flattens every page’s products into one list, removes duplicates by product URL, and writes catalog.csv and catalog.json.
Listing pages carry a full row per product, so 12 requests cover a 188-product store. To collect detail-page fields as well, point 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.
The same prompt works on a catalog with thousands of pages: the crawl and the batch run in the cloud, not in the conversation.

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 with npm install -g @zenrows/cli and log in with zenrows login.
CLI

Example output

The Python script’s console output, from a run with max_items=3:
The first rows of catalog.csv:
Each entry in 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 as include_patterns.
  • The dataset is smaller than the store: max_items stopped the crawl early. Raise it, and check crawl.coverage.items_found against the store’s page count.
  • A page returns REQS004: the extract_fields you asked for aren’t on that page. The error’s detail lists the available fields: copy the ones you need, or remove extract_fields.
  • Some Batch tasks failed: rerun only the failures with job.retry_failed() (Python), job.retryFailed() (Node.js) or zenrows batch retry-failed <job-id>. Successful results carry over.

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.