mrkeyoor.com_
Tue 01 Sept 17:43 UTC
Dataevaluationupdated 27 Aug 2026

crawl4ai review

Crawl4AI is a Python browser crawler that turns dynamic web pages into Markdown, structured data, screenshots, links, and other artifacts for RAG, agents, and data pipelines. It gives developers direct control over browser sessions, JavaScript, proxies, extraction rules, deep crawls, and an optional Docker API instead of requiring a hosted scraping account.

+1,173stars / 7d
Verdict

Our Crawl4AI install consumed 5,368 MB, then the build failed in 12 seconds and pytest ended with 35 collection or setup errors, so this commit did not provide a clean contributor path in our sandbox. Use the packaged release for browser-heavy Python crawling only after a real-site pilot and container soak test. Pick a smaller extractor for static pages, and wait for cleaner Docker and test behavior before making Crawl4AI a lightly staffed production service.

We ran it

Lab card: what happened when we ran crawl4aiScreenshot of crawl4ai (crawl4ai.com)
Install✓ · 141s158 packages · 5368 MB
Build✗ · 12s
Tests✗ · 69s0 passed · 0 failed · 35 errors of 35 (pytest)
Known vulns0(pip-audit)
Repo916 files~167,178 lines of source · 28.9 MB · 4 CI workflows · Dockerfile · tests dir

Answers from our run

Does crawl4ai build from source?

Dependencies installed in 141 seconds (158 packages), and the build failed. We cloned commit 7e80152 into a clean Debian container with 3 CPUs and no project-specific setup.

Do crawl4ai's tests pass?

Yes: 0 of 35 passed when we ran the project's own test command (pytest), with 35 collection errors. Some failures need services or credentials a bare container does not have.

Does crawl4ai have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use crawl4ai?

Teams expecting a small dependency footprint: our install used 5,368 MB for 158 packages.

What are the alternatives to crawl4ai?

Firecrawl, Webclaw, Trafilatura. Our Crawl4AI install consumed 5,368 MB, then the build failed in 12 seconds and pytest ended with 35 collection or setup errors, so this commit did not provide a clean contributor path in our sandbox.

Setup2/55,368 MB install; build and test collection failed in our run
Docs4/5Many examples exist, but Docker quickstart gaps are reported
Community5/579,482 stars with active August issues and code changes
Maturity3/5Wide feature set, with current lifecycle and API deployment defects

Discussed on

  1. hnCrawl4AI is an open-source, LLM-friendly web crawler and scraper7 points
  2. hnCrawl4AI: Open-Source Web Crawler for Seamless AI Data Scraping6 points
  3. hncrawl4ai: The Adaptive Intelligence Update4 points

Who it’s for

Python teams that need Playwright control and Markdown output in the same library.
RAG builders crawling JavaScript sites, authenticated sessions, or several linked pages.
Data engineers who want CSS, XPath, heuristic, or model-assisted extraction choices.
Self-hosters prepared to secure and monitor a browser pool, API token, cache, and resource limits.

Who it’s NOT for

Teams expecting a small dependency footprint: our install used 5,368 MB for 158 packages.
Buyers who require a clean source build and test collection in a plain Python 3.12 container: both failed in our run.
Docker operators relying on the README's no-token quick command: issue 2090 says it binds loopback inside the container and is unreachable from the host.
Long-lived low-traffic servers without process monitoring: issue 2202 reports 46 Chromium processes and 957 MiB after 29 days.
PDF pipelines assuming the default image is complete: issue 2127 says pypdf is absent unless a larger extra is installed.

Setup reality

Our sandbox installed 158 Python packages in 141 seconds and used 5,368 MB. The build exited 1 after 12 seconds; its tail only shows 3 invalid-escape SyntaxWarnings, so it does not reveal the actual cause. Tests exited 3 after 69 seconds with 35 collection or setup errors and 492 warnings.

Basic use needs Playwright and browser binaries, installed by crawl4ai-setup or manually. Model-assisted extraction needs a configured provider, while ordinary CSS and Markdown paths do not. Docker API exposure needs a token under the secure v0.9 defaults.

The test log also printed an internal summary of 84 passed and 2 failed out of 86 before pytest ended with 35 errors and an event-loop-closed internal error. Pip-audit found 0 known vulnerabilities.

Browser control is the reason to choose Crawl4AI

Crawl4AI wraps Playwright with output meant for retrieval and agent systems. A crawl can wait for dynamic content, execute JavaScript, preserve sessions, use authenticated browser profiles, rotate proxies, capture screenshots, scan a full page, and follow links through breadth-first or other deep-crawl strategies. Results can include raw and filtered Markdown, media, metadata, links, and structured JSON. This is much more control than an article-text parser provides.

Extraction can stay deterministic through CSS and XPath schemas, or add heuristic filtering, BM25 relevance, chunking, embeddings, and model calls. That choice matters because many product pages have repeatable DOM structures and do not justify sending content to a language model. The asynchronous API is the main path. The README marks its synchronous Selenium variant as deprecated, so new code should not build around the old interface.

The 5,368 MB install is larger than many crawler servers

Our environment installed 158 packages in 141 seconds and occupied 5,368 MB. The checked-out repository itself was only 28.9 MB, with 916 files and about 167,178 source lines at commit 7e80152. Browser binaries and Python ML or parsing dependencies can make a crawler much larger than its source. Container registries, CI caches, autoscaling nodes, and developer laptops all pay that storage and transfer cost.

The project offers a base package and optional extras for torch, transformers, cosine similarity, PDF support, and the deprecated sync mode. Installing everything for convenience can pull capabilities a service never uses. Start with the exact crawl and extraction strategy required, then add extras deliberately. Pip-audit found 0 known vulnerabilities in our installed packages, which is useful, though it does not assess browser binaries, container configuration, or application-level request handling.

What happened when we ran it

The source build exited 1 after 12 seconds. Its supplied tail contains SyntaxWarnings for invalid escape sequences in 3 documentation example files. Those warnings may be related to the failure or merely the last visible output; the log tail does not contain the terminating exception, so naming a cause would be guesswork. The factual result is that commit 7e80152 installed but did not complete the configured build in our Python 3.12 Debian container.

Pytest exited 3 after 69 seconds. The final report shows 492 warnings and 35 collection or setup errors, followed by an internal SystemExit: 1 and an Event loop is closed warning. A separate summary inside that log says RESULTS: 84 passed, 2 failed out of 86 tests. Those lines describe different stages of a broken run and should not be collapsed into a pass rate. The top-level measured result remains 0 collected passes, 0 collected failures, and 35 errors for the command.

Docker security improved, while the quickstart has a reachability trap

Version 0.9.0 changed the Docker API to require authentication by default and treat incoming request bodies as untrusted. The README says an instance without a token binds to loopback. Issue 2090 explains the operational consequence: the advertised docker run -p 11235:11235 command sets no token, so the server binds 127.0.0.1 inside the container and host requests fail even though the container can appear healthy.

A production setup needs a token, an intentional bind address, browser shared memory, resource limits, and logs that do not leak cookies or credentials. Issue 2091 also reports Compose v5 rejecting the provided file because two process-limit forms conflict. These reports concern v0.9.2 deployments, not every way to import the Python library. They are enough reason to test the exact container command from a clean host rather than copying a quickstart into automation.

Browser cleanup needs a multi-day soak test

Release v0.9.2 says it fixed a task and page leak when a streaming crawl closes. Issue 2202 reports another lifecycle problem on non-streaming /crawl: after 29 days and only a few jobs per day, a container held 46 Chromium processes, used 957 MiB, and consumed about 31% of one CPU core while idle. The report ties process start times to earlier crawls and describes a restart as recovery.

That is one deployment report, but browser leaks are expensive enough to test directly. Run a representative crawl mix for several days, include navigation failures and timeouts, then graph page, context, renderer, file descriptor, memory, and CPU counts after traffic stops. Issue 2155 adds a related failure path where Playwright driver processes survive if browser startup fails. A health endpoint alone will not reveal either accumulation pattern.

PDF and content filters can return misleading results

The default Docker image does not include pypdf, according to issue 2127, so its allowed PDF strategy fails at runtime unless the broad all extra is installed. Issue 2135 reports a separate PDF path where extraction succeeds but anti-bot detection marks the result failed because placeholder HTML is only 33 bytes. Downstream code that checks success can discard valid PDF Markdown.

Content filtering also needs fixtures. Issue 2110 shows filtered Markdown collapsing whitespace inside syntax-highlighted code, while raw Markdown remains correct. Issue 2161 reports overlay removal deleting the entire body when a theme class contains popup. GitHub showed 79,482 stars, 164 combined open issues and pull requests, and a last push on August 25, 2026. The project is active and capable. Its current edge cases make output comparison, process monitoring, and pinned deployment tests mandatory rather than optional polish.

Alternatives

ProjectWhat it isPick it when
Firecrawl gh↗A web extraction and crawling API with a self-hosted server and managed service.pick this instead when an API product and managed crawling path matter more than direct Python browser control.
Webclaw gh↗A Rust extraction engine with CLI, MCP, SDK, and hosted fallback options.pick this instead when static-page speed, native binaries, and a smaller source tree outweigh browser depth.
TrafilaturaA focused Python tool for extracting article text and metadata from HTML.pick this instead when main-text extraction is enough and running browsers would waste resources.

What people are saying

  1. [github-trending] unclecode/crawl4ai

Sources

  1. Crawl4AI repository
  2. Crawl4AI v0.9.2 release
  3. Docker quickstart documentation report
  4. Long-running browser process report
  5. Docker PDF dependency report
  6. Filtered code corruption report
  7. Docker security release notes

More data reviews

turso · TrackersListCollection · dash · getcontact-cli · awesome-zhuiju-free · iggy · the whole board →