Selenium alternatives for web scraping compared on waiting and scale: Playwright, Puppeteer, Scrapy and Crawlee, plus when to skip the browser.
•4 min read•API & Testing
Verdict:Playwright is the closest swap when a page needs a real browser. Scrapy or a plain HTTP client is better when the data sits behind a request you can reproduce, and Crawlee adds crawl management on top of Playwright.
| Tool | Price | Platforms | Best for | Tested |
|---|---|---|---|---|
| Playwright | Free (Apache-2.0) | Windows, macOS, Linux | Scraping JavaScript-rendered pages with automatic waiting, in Python, Node.js, Java or .NET | Docs only |
| Puppeteer | Free (Apache-2.0) | Windows, macOS, Linux | JavaScript developers scraping with Chrome or Firefox who want a small API | Docs only |
| Scrapy | Free (BSD-3-Clause) | Python | Large Python crawls where the data comes from requests you can reproduce | Docs only |
| Crawlee for Python | Free (Apache-2.0) | Python | Python crawlers that switch between HTTP parsing and Playwright | Docs only |
Independent comparison. Paid placements are labelled separately; editorial links earn no affiliate commissions. Learn more.
If you scrape with Selenium and want something else, use Playwright when pages need a real browser, because it waits for elements on its own. Use Scrapy, or a plain HTTP client, when the data comes from a request you can reproduce, and add Crawlee when you want crawl queues around Playwright. The first question is not which library, but whether you need a browser at all.
Scraping differs from testing. You care about waiting for dynamic content, avoiding a browser when possible, language fit, crawl management at scale, and how blocks are handled.
The Selenium docs on waits state that the implicit wait defaults to 0, so a missing element returns an error immediately. They also warn against mixing implicit and explicit waits because it can cause unpredictable wait times, and call race conditions one of the primary causes of flaky tests. Those are the usual symptoms of a flaky scraper. For the broader list, see our page on all Selenium alternatives.
User threads agree that the browser is the last resort. In a 2026 Hacker News thread about scraping 241 council planning portals, the author runs a plain requests scraper, a Playwright scraper for sites that block non-browser clients, and a TLS-fingerprint client. The author advised checking the browser's Network tab for a clean JSON endpoint before parsing rendered HTML, and no one in the thread mentioned Selenium.
Playwright is a browser automation library that drives Chromium, Firefox and WebKit. According to its docs, it has Node.js, Python, Java and .NET versions, and its test runner runs headless by default. It is released under Apache-2.0.
The key difference for scraping is actionability. Before acting, Playwright checks that an element is visible, stable, enabled and receiving events, then proceeds only when those pass. The Python setup in its Python guide is pip install pytest-playwright followed by playwright install, with Python 3.8 or higher and both sync and async APIs.
Who should not pick it: someone scraping a static site, where a browser is wasted effort.
Puppeteer is a JavaScript library for controlling Chrome or Firefox. Its homepage says it works over the DevTools Protocol or WebDriver BiDi, runs headless by default, and npm i puppeteer downloads a compatible Chrome. The code is Apache-2.0.
It suits a JavaScript project that wants a small API and only needs Chrome or Firefox. It does not cover WebKit, which Playwright does, and it is not an option for Python teams.
Who should not pick it: Python developers, or anyone who needs Safari-engine coverage.
Scrapy is a Python framework for crawling. Its overview lists CSS and XPath selectors, asynchronous requests, download delays, per-domain concurrency limits, auto-throttling, robots.txt handling and feed export to JSON, CSV or XML. It is BSD-3-Clause.
Its dynamic content guide tells you to find the underlying request in your browser's network tool and reproduce it first. A headless browser is for when that is too hard, and the guide recommends scrapy-playwright over calling playwright-python directly, since direct use bypasses Scrapy's middlewares and dupefilter.
Who should not pick it: someone who needs to click through a login-heavy single-page app.
Crawlee for Python is a crawling library from Apify. Its documentation lists BeautifulSoup, Parsel, HTTP and Playwright crawlers, an adaptive Playwright crawler, a proxy management guide and a Playwright example with a fingerprint generator. The repository is Apache-2.0 and recommends installing crawlee[all] and then running playwright install.
In the July 2024 Show HN thread, one commenter said they had used Selenium for a long time and moved to Crawlee, and another, who used the JavaScript version, said its Playwright integration worked on heavily front-end rendered sites. Many replies came from the Crawlee team, and commenters also called the docs thin.
Who should not pick it: someone who wants a long-established framework with a large body of tutorials.
| Playwright | Puppeteer | Scrapy | Crawlee for Python | |
|---|---|---|---|---|
| Language | Node.js, Python, Java, .NET | JavaScript | Python | Python |
| Real browser | Chromium, Firefox, WebKit | Chrome, Firefox | No, needs scrapy-playwright | Via Playwright |
| Waiting | Automatic actionability checks | Not checked | Not applicable | Via Playwright |
| Crawl management | Build your own | Build your own | Built in | Built in |
| Licence | Apache-2.0 | Apache-2.0 | BSD-3-Clause | Apache-2.0 |
If you only need a ready-made tool, see our open-source web scraper and free web scraper roundups. For automation beyond scraping, read open-source automation tools.
No speed benchmarks were run, and vendor speed claims from competing articles are not repeated. Paid scraping APIs and proxy services were not researched because their prices were not taken from official pages. Anti-bot results depend on the target site and are not compared.
Playwright for Python is the closest swap when pages need a real browser. Its docs list Python 3.8 or higher and both sync and async APIs. If the data comes from a request you can reproduce, Scrapy or a plain HTTP client avoids running a browser at all.
Playwright waits automatically for elements to be visible, stable and enabled before acting, per its docs. Selenium's implicit wait defaults to 0, so a missing element errors immediately unless you configure waits. That removes a common source of flaky scrapers, but neither tool beats bot protection.
Not always. Scrapy's docs advise finding the request that returns the data in your browser's network tool and reproducing it first, and using a headless browser only when that is too hard. The author of a 2026 Hacker News scraping thread likewise advised checking the Network tab for JSON endpoints.
No free library here promises that. The libraries control a browser or send requests; getting past blocks usually needs proxies, fingerprint handling or slower request rates. Crawlee for Python documents proxy management and a fingerprint generator example, but results depend on the target site.
Scrapy is built for crawling, with async requests, download delays, per-domain concurrency limits and auto-throttling listed in its overview. Crawlee for Python adds a Playwright crawler beside its HTTP crawlers, so one project can mix both approaches. Playwright and Puppeteer leave queueing and retries to you.
Yes, for JavaScript projects. Puppeteer controls Chrome or Firefox, runs headless by default and installs a compatible Chrome with npm i puppeteer. It is a JavaScript library, so Python teams would move to Playwright instead. Its browser list is shorter than Playwright's, which also covers WebKit.
Kevin Fan is a SaaS founder. He runs Free Instead Of, which tracks free and open-source alternatives to paid software and checks each price and free-plan limit against the vendor's own pages.
Official docs for Selenium, Playwright, Puppeteer, Scrapy and Crawlee, plus the Crawlee for Python repository, were read on 2026-10-27. Three competing roundups were read for context. Two Hacker News threads (July 2024 and April 2026) were read for user pain points. Reddit was not used. No library was installed, run or benchmarked.