Best Headless Browsers for Web Scraping
For most web scraping in 2026, the best headless browser is Chromium driven by Playwright: Playwright's own docs say its default setup with the latest Chromium "is a good idea most of the time", and the same code also drives Firefox and WebKit. Puppeteer with Chrome for Testing is the Chrome-focused choice in Node.js. Selenium suits existing Selenium projects and teams in Ruby or Kotlin, but it is not our pick for a new scraper. And if the data is already in the HTML or a JSON request, skip the browser: a plain HTTP client is faster and uses a fraction of the traffic. A hosted scraping browser, such as Browserbase or Browserless, is worth it when you need dozens or hundreds of browsers at once for short peaks, your code runs where Chromium cannot launch (serverless), or nobody can maintain browser servers. At steady volume your own browsers are cheaper per page: servers plus up to $5.90 of residential traffic per 1,000 rendered pages at an example 2 MB each ($2.95/GB; a third less at $1.95/GB). Every option here takes a proxy at launch; ProxyField residential proxies cost from $1.95/GB, and you can start with the Easy Trial: 1 GB for $2.95.
- residential IPs
- 412M+
- from, traffic never expires
- $1.95/GB
- Easy Trial
- 1 GB for $2.95
On this page 10 sections
- Own browsers or a hosted scraping browser: the numbers
- The best headless browsers compared
- How to choose a headless browser
- The drivers: Playwright, Puppeteer and Selenium
- Best headless browser by language
- Hosted browser APIs and scraping browsers
- Running headless browsers at scale
- Proxies for headless browsers
- Sources
- Best Headless Browsers for Web Scraping FAQ
# Playwright for Python: new headless Chromium through a ProxyField proxy
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(channel="chromium", proxy={
"server": "http://gate.proxyfield.io:7000",
"username": "<login>-country-us", "password": "<password>"})
page = browser.new_page()
page.goto("https://api.ipify.org")
print(page.inner_text("body")) # the exit IP, not yours
browser.close()Install it with pip install playwright and playwright install --with-deps chromium (Node.js: npx playwright install --with-deps chromium). Playwright runs Chromium's lighter headless shell by default; channel="chromium" above switches to new headless mode, the full browser without a window, which renders closest to what visitors see. Puppeteer takes the same proxy as a launch flag, args: ['--proxy-server=http://gate.proxyfield.io:7000'], plus page.authenticate({ username: '<login>-country-us', password: '<password>' }).
Own browsers or a hosted scraping browser: the numbers
| Feature | Your own headless browsers | A hosted browser API or scraping browser |
|---|---|---|
| What you pay for | Servers, plus proxy traffic per GB | Usually browser time or sessions, often with the provider's proxies included |
| Proxy traffic for 1,000 rendered pages | At an example 2 MB per page: 2 GB, so $5.90 at $2.95/GB, or a third less at $1.95/GB (from 1,000 GB) with ProxyField residential proxies | Part of the provider's price |
| Blocking images, fonts and media | Often cuts most of a page's bytes, and the traffic cost with it | Depends on the provider |
| Scaling | You cap browsers per server and add servers | On demand |
| Maintenance | Browser updates, crashes, memory limits, queues | The provider's |
The 2 MB page is an example: measure yours in the browser's network tab. A rendered page with images blocked is often a fraction of that.
The break-even, in one line. Your own cost per 1,000 pages is your server cost for the time those pages take, plus the traffic: up to $5.90 at 2 MB per page with ProxyField residential proxies. A hosted cost per 1,000 pages is the browser time those pages take at the provider's rate, plus its proxy charge. Put both on your real page weight and time per page; the cheaper one at your normal daily volume wins, and the hosted one wins at peaks your servers cannot hold.
How hosted browsers bill:
| Hosted browser API | Billing unit | Concurrent browsers | Proxies |
|---|---|---|---|
| Browserbase | Browser hours, with hours included per plan | 3 on the free plan, up to 250+ on the largest | Its own proxy traffic, billed per GB on top |
| Browserless | Units: one unit is up to 30 s of browser time per connection, and a reconnect starts a new unit | 2 on the free plan, up to 100 on Scale, more on Enterprise | Its own proxies billed in units per MB; from the Prototyping plan up, you can bring external proxies |
Hosted makes sense when:
- Your peak needs many times the browsers one server runs (dozens or hundreds at once), and the rest of the day needs few.
- Your code runs in a serverless or locked-down environment where you cannot launch Chromium.
- Nobody on the team can own browser updates, crashes and memory limits.
- You need results this week, before you could build a browser fleet.
Your own browsers win when volume is steady, you want full control over each request, and you want a cost per page you can predict: servers plus GB of traffic.
No browser to drive at all: ProxyField's Web Scraping API is designed to return a JavaScript-rendered page for $2.00 per 1,000 successful results, or $1.00 from 10,000 results in one purchase, billed on successful results only. It is in development: Contact sales.
The best headless browsers compared
A headless browser has two parts: the browser engine that renders the page and the driver library your code uses to control it. The table ranks the engines and modes for scraping; the next section compares the drivers. Facts checked against Playwright's browsers page and Puppeteer's supported browsers on October 27, 2026; see Sources below.
| Browser | Engine | Driven by | Strengths for scraping | Weak spots | Best for |
|---|---|---|---|---|---|
| Playwright's Chromium (headless shell by default) | Chromium/Blink | Playwright | Playwright's recommended default; its Chromium is about one version ahead of Chrome and Edge stable | The shell is not identical to the full browser, so some sites render or behave differently | Most scraping, and many simple JavaScript pages at volume |
| Chrome or Chromium in new headless mode | Chromium/Blink | Puppeteer (default), Playwright (channel: 'chromium'), Selenium | The full browser without a window since Chrome 112; renders sites as most users see them | A larger download than the shell (npx playwright install --no-shell skips the shell) | Sites that differ in the shell |
| chrome-headless-shell (Puppeteer) | Chromium/Blink | Puppeteer (headless: 'shell'), Selenium | Chrome's old headless implementation as a separate binary since Chrome 132 | Not identical to Chrome | Simple JavaScript pages at volume in Node.js |
| Headless Firefox | Gecko | Playwright, Selenium, Puppeteer (v23+) | A second engine; Puppeteer drives it over WebDriver BiDi | Smaller tooling ecosystem for scraping | Sites that break or differ in Chromium |
| WebKit | WebKit | Playwright | Safari's engine on Windows, Linux and macOS | Playwright's build, not Safari itself | Checking how Safari users see a page |
| Patched automation browsers | Usually Chromium or Firefox | Their own libraries (see alternatives) | Change automation defaults that sites often look at | Fewer maintainers; break with browser updates | Teams that test those tools on their own targets |
| Hosted browser APIs (Browserbase, Browserless) | Usually Chromium | Playwright or Puppeteer over a WebSocket | No browsers to run; scale on demand | Billed by browser time; less control | Teams without infrastructure for browsers, and short peaks |
Not on the list: PhantomJS and other engines that are no longer developed. Old engines render modern sites badly and stand out to the sites you visit.
How to choose a headless browser
-
Does the page need a browser at all?
Open the page source or the network tab. If the data is in the HTML or a JSON request, use an HTTP client: it is faster and uses a fraction of the traffic. See HTML scraping.
-
Which engine renders it correctly?
Start with Chromium. Switch to Firefox or WebKit only if the page breaks or differs.
-
Which language is your code in?
That picks the driver: Puppeteer for Node.js only, Playwright for Node.js, Python, Java and .NET, Selenium for those plus Ruby and Kotlin.
-
How many pages?
A few thousand a day run on one server. Hundreds of thousands need a queue, concurrency limits, and a choice between new headless (closest to real Chrome) and the lighter shell.
-
Who runs the browsers?
Your own servers, or a hosted browser API you connect to over the network.
The drivers: Playwright, Puppeteer and Selenium
| Driver | Languages | Browsers | Auto-waiting | Proxy setting | Notes |
|---|---|---|---|---|---|
| Playwright | Node.js, Python, Java, .NET | Chromium, Firefox, WebKit | Yes, by default | proxy with server, username, password; per browser or per context | Code generator and trace viewer included |
| Puppeteer | Node.js | Chrome, Firefox | With page.locator() | --proxy-server flag plus page.authenticate() | Maintained by Google's Chrome team |
| Selenium | Java, Python, C#, Ruby, JavaScript, Kotlin | Chrome, Firefox, Edge, Safari | Explicit and implicit waits | Proxy capability or browser flag | WebDriver standard; Selenium Manager fetches drivers since 4.6 |
Head-to-head details: Puppeteer vs Playwright. Selenium for scraping: web scraping with Selenium and Python.
Best headless browser by language
- Python: headless Chromium through Playwright for Python; Selenium if your team already uses it. Pyppeteer, the old Python port of Puppeteer, is unmaintained.
- Node.js: headless Chrome through Playwright or Puppeteer; Crawlee if you want crawling queues and browser pools built in.
- Java: Playwright for Java or Selenium; HtmlUnit is a Java-only headless browser without a real rendering engine, fine for simple pages. More in Java web scraping.
- C# and .NET: Playwright for .NET or Selenium; PuppeteerSharp is a community port of Puppeteer. See C# web scraping.
- Go: chromedp drives Chrome over the DevTools Protocol, and rod is another Go driver. See Go web scraping.
Hosted browser APIs and scraping browsers
The cost comparison and the four triggers are at the top of this page. A hosted browser API, such as Browserbase or Browserless, runs the browsers on the provider's servers. Your code connects over a WebSocket and drives the remote browser with the same Playwright or Puppeteer calls; the provider handles scaling, browser updates and often the IPs. Some providers sell this as a "scraping browser", which adds their own proxy network and retries.
// Playwright: drive a remote Chromium over CDP (the endpoint comes from the provider)
import { chromium } from 'playwright';
const browser = await chromium.connectOverCDP('wss://REMOTE-BROWSER-ENDPOINT');
const page = await browser.newPage();
await page.goto('https://example.com');
// Puppeteer: the same with puppeteer.connect({ browserWSEndpoint: 'wss://...' })Where the provider accepts external proxies, as Browserless does from its Prototyping plan, you can keep your ProxyField traffic: the remote browser exits through gate.proxyfield.io:7000 with your username and password, so the price per GB and the targeting stay the same whichever browsers run the pages. The way to pass the proxy differs by provider; see its docs.
If you would rather send a URL and get the rendered HTML back, without driving a browser at all, ProxyField's Web Scraping API is designed to fetch any URL as plain HTTP ($0.50 → $0.20 per 1,000 successful results) or with JavaScript rendering ($2.00 → $1.00 per 1,000), billed on successful results only; the volume price applies from 10,000 results in one purchase. The API is in development: Contact sales.
Running headless browsers at scale
- Reuse browsers. Launch once and open new contexts or pages; launching a browser per URL is the most common waste.
- Cap concurrency per machine. Each browser needs CPU and a few hundred megabytes of memory; measure how many your server runs before pages slow down.
- Block what you do not need. Images, fonts, media and third-party trackers are often most of a page's bytes. Blocking them speeds pages up and cuts proxy traffic.
- Render only where needed. Fetch list pages with HTTP when possible and open a browser only for the detail pages that need it.
- Watch the results. Alert on empty fields or falling item counts, which signal a layout change or a block.
More techniques: headless browser scraping and how to make web scraping faster.
Proxies for headless browsers
Sites limit how many pages one IP may load, so a headless scraper that opens more than a few hundred pages on one site needs rotating IPs. Each driver takes the proxy at launch (the Playwright and Puppeteer code is at the top of this page). In Playwright you can also give each browser context its own proxy, for example one sticky session per context: "username": "<login>-country-us-city-new_york-session-ctx01-ttl-1800".
ProxyField gives each request a new IP, or keeps one IP for a sticky session from 30 s to 36 h when a flow must stay on one address, with country, region and city targeting over HTTP, HTTPS or SOCKS5 and unlimited concurrent threads. Residential proxies cost $2.95/GB for 1 GB and fall to $1.95/GB from 1,000 GB, with no subscription; traffic never expires, and all purchases are final. For sites that do not block datacenter ranges, rotating datacenter proxies cost from $0.22/GB. Start with residential proxies and the Easy Trial: 1 GB for $2.95.
Sources
- Playwright, "Browsers": "Using the default Playwright configuration with the latest Chromium is a good idea most of the time"; headless runs use a separate Chromium headless shell by default; "You can opt into the new headless mode by using 'chromium' channel";
npx playwright install --with-deps chromiuminstalls the browser and its system dependencies,--only-shellinstalls only the headless shell (for CI),--no-shellskips it, andnpx playwright install --listlists installed browsers. Playwright supports Chromium N+1, which reaches Google Chrome and Microsoft Edge a few weeks later. - Hosted browser pricing pages, Browserbase and Browserless: billing units, concurrency per plan and how proxies are billed, as in the table above.
- Puppeteer, "Supported browsers": Puppeteer 25.16.0 pairs with Chrome for Testing 156.0.8078.47 and Firefox 158.0.1; Puppeteer has used Chrome for Testing since v20.0.0 and stable Firefox since v23.0.0; the old headless mode is the separate chrome-headless-shell, selected with
headless: 'shell'.
Best Headless Browsers for Web Scraping FAQ
Which headless browser is best for web scraping, and when is a hosted scraping browser worth it over running my own?
ProxyField's pick for most scraping is Chromium driven by Playwright, the default Playwright's own docs recommend, with proxies from $1.95/GB; Puppeteer fits Chrome-only Node.js work, and a plain HTTP client beats any browser when the data is in the HTML. A hosted scraping browser such as Browserbase or Browserless is worth it when you need dozens or hundreds of browsers for short peaks, your code runs where Chromium cannot launch, or nobody can maintain browser servers. At steady volume your own browsers cost servers plus traffic: at an example 2 MB per rendered page, 1,000 pages are 2 GB, or up to $5.90 of residential traffic ($2.95/GB; a third less at $1.95/GB).
Which headless browser is the best?
ProxyField residential proxies, from $1.95/GB, work with every headless browser on this list, and for scraping the best one for most jobs is Chromium driven by Playwright, in its default headless shell or, with channel: 'chromium', in new headless mode. Puppeteer with Chrome for Testing is the Chrome-focused choice in Node.js. Use headless Firefox or WebKit when a site differs in those engines.
Which browser is best for scraping?
ProxyField's pick for most sites is a Chromium-based headless browser, controlled from code with Playwright, Puppeteer or Selenium. A browser is needed only for pages that build their content with JavaScript; for plain HTML pages an HTTP client is faster.
Which headless browser should I use?
Pick by your language and target: Playwright with Chromium if you code in Python, Java or .NET, Playwright or Puppeteer in Node.js, and Selenium if your team already runs it. Switch the engine only if the target renders badly in Chromium.
Can I use Playwright with a scraping browser API?
Yes. Hosted browser APIs give you a WebSocket endpoint, and Playwright connects to it with chromium.connectOverCDP(); Puppeteer uses puppeteer.connect(). The rest of your script stays the same.
How do hosted browsers like Browserbase and Browserless charge?
By browser time. Browserbase sells browser hours, with hours included in each plan; Browserless counts units of up to 30 seconds of browser time per connection, and a reconnect starts a new unit. Both charge for their own proxy traffic on top, so compare their price per 1,000 pages with servers plus ProxyField traffic at your page weight.
Can I use my own proxies with a hosted headless browser?
Some providers allow it: Browserless accepts external proxies from its Prototyping plan up. With ProxyField the remote browser connects to gate.proxyfield.io:7000 with your username and password, at $2.95/GB for 1 GB down to $1.95/GB from 1,000 GB, and you keep country, region and city targeting.
Is Selenium still a good choice for headless scraping?
For an existing Selenium project or a team in Ruby or Kotlin, yes: it drives headless Chrome, Firefox and Edge, and Selenium Manager fetches the drivers. For a new scraper, Playwright is the simpler pick, with auto-waiting and per-context proxies built in.
What is a scraping browser?
A hosted headless browser sold for scraping: it runs on the provider's servers, usually with the provider's own proxies and retries built in, and you drive it with Playwright or Puppeteer over the network. It trades control and cost per page for no browser infrastructure on your side.
When should I use a hosted browser instead of running my own?
When your browser load is spiky, nobody on the team maintains browser servers, or you need results quickly. Run your own when volume is steady and you want full control and a predictable cost per page.
Show 5 more questionsShow fewer questions
What is the best headless browser for Node.js?
ProxyField's pick for Node.js: headless Chromium through Playwright, or Chrome for Testing through Puppeteer. Playwright adds Firefox, WebKit and auto-waiting; Puppeteer is a smaller, Chrome-focused library from Google's Chrome team.
What is the best headless browser in Java?
ProxyField's pick for Java: Playwright for Java or Selenium driving headless Chrome or Firefox, because both run a real browser engine. HtmlUnit is a lighter pure-Java option for simple pages, but it does not render like a real browser.
What is the best headless browser for C#?
ProxyField's pick for C#: Playwright for .NET or Selenium with headless Chrome. PuppeteerSharp, a community port of Puppeteer, is another option for Chrome-only automation in C#.
Which headless browser is best to use for Playwright scraping?
ProxyField's pick is Chromium, unless the site needs something else. In headless runs Playwright uses its lighter Chromium headless shell by default, which is not identical to Chrome; set the chromium channel to get new headless mode, the real browser that renders closest to what visitors see. If the shell works on your targets, npx playwright install --only-shell skips the full Chromium download.
Is chrome-headless-shell good for scraping?
For simple JavaScript pages at volume, yes: it starts faster and uses less memory than full headless Chrome. Because it is Chrome's old headless implementation and not the full browser, test it on your targets, and switch to new headless if pages differ.
Related pages
Easy Trial: 1 GB for $2.95.
Try for the price of 1 GB, no subscription, traffic never expires.