Appearance
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.