Skip to content

Usage

Minimal Example: Node.js + Playwright

Connect to the ZenRows Scraping Browser using chromium.connectOverCDP() with the ZenRows WebSocket endpoint. The rest of your Playwright code stays unchanged.

javascript
const { chromium } = require('playwright');

const connectionURL = 'wss://browser.zenrows.com?apikey=YOUR_ZENROWS_API_KEY';

const scraper = async () => {
    const browser = await chromium.connectOverCDP(connectionURL);
    const page = await browser.newPage();
    await page.goto('https://www.scrapingcourse.com/ecommerce/');
    console.log(await page.title());
    await browser.close();
};

scraper();

Minimal Example: Python + Playwright

python
import asyncio
from playwright.async_api import async_playwright

connection_url = "wss://browser.zenrows.com?apikey=YOUR_ZENROWS_API_KEY"

async def scraper():
    async with async_playwright() as p:
        browser = await p.chromium.connect_over_cdp(connection_url)
        page = await browser.new_page()
        await page.goto('https://www.scrapingcourse.com/ecommerce/')
        print(await page.title())
        await browser.close()

asyncio.run(scraper())

Minimal Example: Node.js + Puppeteer

javascript
const puppeteer = require('puppeteer-core');

const connectionURL = 'wss://browser.zenrows.com?apikey=YOUR_ZENROWS_API_KEY';

const scraper = async () => {
    const browser = await puppeteer.connect({ browserWSEndpoint: connectionURL });
    const page = await browser.newPage();
    await page.goto('https://www.scrapingcourse.com/ecommerce/');
    console.log(await page.title());
    await browser.close();
};

scraper();

Using the ZenRows Browser SDK (Node.js)

The @zenrows/browser-sdk package provides a typed way to build the connection URL. It is optional.

javascript
const { chromium } = require('playwright');
const { ScrapingBrowser } = require('@zenrows/browser-sdk');

const scraper = async () => {
    const scrapingBrowser = new ScrapingBrowser({ apiKey: process.env.ZENROWS_API_KEY });
    const connectionURL = scrapingBrowser.getConnectURL();
    const browser = await chromium.connectOverCDP(connectionURL);
    const page = await browser.newPage();
    await page.goto('https://www.scrapingcourse.com/ecommerce/');
    console.log(await page.title());
    await browser.close();
};

scraper();

Geo-targeting

Append query parameters to the connection URL:

javascript
// Pin to a specific country
const connectionURL = 'wss://browser.zenrows.com?apikey=YOUR_ZENROWS_API_KEY&proxy_country=US';

// Use a world region
const connectionURL = 'wss://browser.zenrows.com?apikey=YOUR_ZENROWS_API_KEY&proxy_region=north_america';

// Custom session TTL (seconds, 60-900)
const connectionURL = 'wss://browser.zenrows.com?apikey=YOUR_ZENROWS_API_KEY&session_ttl=300';

Performance: block unnecessary resources

Images and fonts consume bandwidth and add session time. Block them to reduce cost:

javascript
await page.setRequestInterception(true);
page.on('request', (request) => {
    if (request.resourceType() === 'image' || request.resourceType() === 'font') {
        request.abort();
    } else {
        request.continue();
    }
});

Always close pages and browsers

Each open page and session consumes billed time. Use try/finally to ensure cleanup:

javascript
const browser = await chromium.connectOverCDP(connectionURL);
const page = await browser.newPage();
try {
    await page.goto(url, { timeout: 30000 });
    // ... your scraping logic
} finally {
    await page.close();
    await browser.close();
}

No downloadable template

ZenRows does not ship an official starter template or boilerplate repository. The minimal examples above are the canonical starting point from the official documentation.