Setup is the same pattern on both
Puppeteer takes the proxy server as a Chrome launch flag and credentials through page.authenticate(). That works identically for Webshare and Geonode; only the host, port and username format differ.
const browser = await puppeteer.launch({ args: [`--proxy-server=${PROXY_HOST}`] });
const page = await browser.newPage();
await page.authenticate({ username: PROXY_USER, password: PROXY_PASS });Provider-specific walkthroughs: Webshare with Puppeteer and Geonode with Puppeteer. For the general patterns, see our Puppeteer proxies guide.
Sessions in a browser
Browsers fire many requests per page, so per-request rotation inside one page is usually a bad idea. Both providers let you hold an IP:
| Webshare | Geonode | |
|---|---|---|
| Session per browser or context | Session number in the username | Session ID with configurable lifetime |
| Long tasks | Static residential or dedicated DC IP | Sticky up to 24 hours, or ISP IP |
| Fixed IPs | Datacenter and static residential lists | ISP proxies |
For long-running browser tasks on residential IPs, Geonode's published 24-hour sticky sessions are an advantage. For browser work on fixed IPs, Webshare's cheap static residential IPs are attractive. See sticky sessions compared.
Bandwidth: the hidden cost
A headless Chrome page load often transfers 1 to 5 MB. On residential traffic billed per GB, that adds up fast:
| Pages per month | At 2 MB/page | Webshare residential (approx.) | Geonode residential (approx.) |
|---|---|---|---|
| 10,000 | 20 GB | About $50 | About $16 |
| 100,000 | 200 GB | About $400 to $450 | About $130 to $145 |
Blocking images, fonts and media typically halves these numbers on either provider:
await page.setRequestInterception(true);
page.on("request", (r) => (["image", "media", "font"].includes(r.resourceType()) ? r.abort() : r.continue()));Datacenter for lenient sites
If your Puppeteer targets accept datacenter IPs, Webshare's per-IP lists avoid per-GB costs entirely (within the plan's bandwidth setting). That's a big saving for rendering-heavy jobs like screenshots and PDF generation of lenient sites.
Proxy tip: To test the Geonode side of this comparison, a small residential balance from Geonode is enough, and it doesn't expire if you pause. See using Geonode with Puppeteer for its full product range.
Which to choose by job
| Puppeteer job | Better fit |
|---|---|
| Screenshots or PDFs of lenient sites | Webshare datacenter list |
| Scraping protected sites | Geonode residential (cheaper per GB), test Webshare too |
| Long logged-in sessions | Geonode sticky sessions or either provider's static IPs |
| Many browser profiles on fixed IPs | Webshare static residential (cheap per IP) |
| Hard pages, small volume | Geonode Scraper API instead of Puppeteer |
Verdict
Setup is a tie. Choose by traffic type: Webshare for datacenter-friendly targets and cheap static IPs, Geonode for residential-heavy browser automation and long sessions.
Provider switch in one place
const PROVIDERS = {
webshare: { server: "http://p.webshare.io:80", user: (s) => `${WS_USER}-${s}`, pass: WS_PASS },
geonode: { server: GN_SERVER, user: (s) => geonodeUser(s), pass: GN_PASS },
};
async function openTask(browser, providerName) {
const p = PROVIDERS[providerName];
const ctx = await browser.createBrowserContext({ proxyServer: p.server });
const page = await ctx.newPage();
const sid = Math.floor(Math.random() * 1e6);
await page.authenticate({ username: p.user(sid), password: p.pass });
return { ctx, page };
}Recent Puppeteer versions accept a proxy per browser context, which lets one browser serve both providers. geonodeUser() builds the session username in Geonode's documented format.
A/B testing providers in Puppeteer
Send alternate tasks to each provider for a day, and log success, bytes and time per task. The provider with the lower cost per successful task wins that target.
Budget tip: The cheapest way to settle this comparison is to test both: Webshare has a free datacenter plan, and Geonode offers a low-cost residential trial. Run the same targets through each. See using Webshare with Puppeteer.
Resource blocking pays twice
Blocking images and media reduces residential cost and speeds up pages on either provider. Measure bytes per page before and after; savings of 50% or more are common.
A real-world example
A screenshot service renders 300,000 pages a month. About 80% are on lenient sites, rendered through a Webshare datacenter list with no per-GB cost. The remaining 20% sit behind bot protection and run through Geonode residential with images blocked, using around 120 GB a month. Contexts get their own session IDs, and the service tracks success and bytes per provider so it can reroute domains when results change.
For the bigger picture beyond these two providers, read our best proxies buyer's guide, and see cheap proxies for ways to cut cost per successful request.
Key takeaways
- Puppeteer setup is identical on both:
--proxy-serverpluspage.authenticate(). - Keep one session per context; avoid rotation within a page.
- Headless Chrome is bandwidth-heavy, so per-GB price matters for residential.
- Use Webshare datacenter lists for lenient rendering jobs.
- Block heavy resources on either provider to cut costs.
FAQ
Can I put credentials in --proxy-server?
No, Chrome ignores them on both providers. Use page.authenticate() or IP allowlisting.
Which provider is cheaper for Puppeteer scraping?
For residential traffic at list prices, Geonode. For datacenter-friendly targets, Webshare.
Does SOCKS5 work with Puppeteer on either?
Only with IP allowlisting, because Chrome doesn't support SOCKS5 authentication.
Can one Puppeteer browser use both providers?
Yes, with per-context proxy settings in recent Puppeteer versions, or separate browsers per provider.
How do I reduce residential cost in Puppeteer?
Block images, fonts and media, and wait for specific elements rather than full network idle.
Which provider is faster in Puppeteer?
Measure on your targets; latency depends on location and pool.
Editorial note: Proxy providers change their pools, features and prices often, so treat any figures here as typical ranges at the time of writing and confirm current terms with the provider before you buy.