crawlee-python is a free, open source data extraction & web scraping project written in Python and released under Apache-2.0. It has 9,535 GitHub stars, 807 forks and 100 open issues, and was last pushed 33 hours ago. On this registry it ranks #22 of 45 tracked projects in Data Extraction & Web Scraping, with 5 head-to-head comparisons available. It gained 7 stars over the last 3 tracked days.

What is crawlee-python?

Crawlee for Python is an open-source, Apache-2.0 licensed web scraping and browser automation library that lets Python developers build reliable crawlers for extracting data for AI, LLM, RAG, and GPT pipelines, and it is aimed at anyone who needs to crawl sites at scale without hand-writing the surrounding infrastructure.

What it is

Crawlee is a web scraping and browser automation library for Python, published on PyPI as the crawlee package under the Apache-2.0 licence and developed in the open by Apify. It covers crawling and scraping end to end: crawlers follow links across the web, extract data, and persistently store it in machine-readable formats, while the library handles the technical details around them. It works with Parsel, BeautifulSoup, Playwright, and raw HTTP, runs in both headful and headless mode, and includes proxy rotation. A TypeScript implementation of the same project exists for JavaScript and TypeScript users.

The concrete problem it replaces is the glue code a developer would otherwise assemble by hand around requests, a parser, and a browser driver: request scheduling, retries, session handling, and result storage. With the default configuration, crawlers appear almost human-like and fly under the radar of modern bot protections, which removes a large amount of anti-bot tuning from the critical path. Rather than stitching components together, a user picks a crawler class that matches the site: BeautifulSoupCrawler downloads pages over HTTP using ImpitHttpClient and parses them with BeautifulSoup, which is fast because no browser is involved, while PlaywrightCrawler is used when client-side JavaScript must execute to produce the content.

Key capabilities

  • BeautifulSoupCrawler fetches pages with ImpitHttpClient and parses HTML with BeautifulSoup, giving high throughput for static pages without a browser.
  • PlaywrightCrawler renders pages through a real browser for JavaScript-heavy sites, in headful or headless mode.
  • Proxy rotation is built in, so requests can be distributed across proxies without custom plumbing.
  • Every crawler run creates a storage/ directory in the current working directory and stores scraped data persistently in machine-readable formats.
  • Configuration is rich but optional: controls such as max_requests_per_crawl limit a run, and the defaults are intended to work without tuning.
  • Installation is split into extras so dependencies stay minimal: crawlee[all], crawlee[cli], and extras such as beautifulsoup for the BeautifulSoup crawler.
  • Parsing and transport stacks are interchangeable, with Parsel, BeautifulSoup, Playwright, and raw HTTP all supported.

Who uses it and how

  • Data and ML teams building ingestion pipelines for RAG, LLM, and GPT corpora download HTML, PDF, JPG, PNG, and other files from websites.
  • Scraping teams working against bot-protected targets rely on the default configuration, which is designed to look human-like, plus proxy rotation when a single address is not enough.
  • Projects that need rendered DOM state use PlaywrightCrawler, while high-volume extraction of static HTML uses BeautifulSoupCrawler to avoid browser overhead.
  • New crawlers are bootstrapped from prepared templates through the CLI rather than written from an empty file.

Getting started

Install the package from PyPI with python -m pip install 'crawlee[all]', then run playwright install for the browser dependencies and verify the install with python -c 'import crawlee; print(crawlee.__version__)'. The quickest route is the Crawlee CLI, either uvx 'crawlee[cli]' create my-crawler or crawlee create my-crawler when the package is already installed.

How it compares

The facts name no paid products that Crawlee replaces, so the closest points of reference are the components it wraps: Playwright and BeautifulSoup are libraries a developer combines manually, whereas Crawlee exposes them behind crawler classes that also handle storage and proxy rotation. Parsel, raw HTTP, and the JavaScript and TypeScript implementation of Crawlee are the other named neighbours, with the latter being the same project for a different runtime.

When to use it — and when not to

A self-hoster must install Playwright browser binaries and their system dependencies, keep a writable storage/ directory for results, and supply proxies if rotation is needed at volume. Anyone whose task is a single fetch and parse should use plain requests and BeautifulSoup instead, since the crawler abstractions add weight without benefit at that size. The registry entry has no paid-product list and only a truncated README excerpt, so the full documentation on the Crawlee website should be read before adoption.

project readme (upstream, from github) — read inline

Crawlee
</a>

A web scraping and browser automation library

apify%2Fcrawlee-python | Trendshift

PyPI package version PyPI package downloads PyPI Python version Build status Codecov report License Chat on Discord

Crawlee covers your crawling and scraping end-to-end and helps you build reliable scrapers. Fast.

Your crawlers will appear almost human-like and fly under the radar of modern bot protections even with the default configuration. Crawlee gives you the tools to crawl the web for links, scrape data and persistently store it in machine-readable formats, without having to worry about the technical details. And thanks to rich configuration options, you can tweak almost any aspect of Crawlee to suit your project's needs if the default settings don't cut it.

👉 View full documentation, guides and examples on the Crawlee project website 👈

We also have a TypeScript implementation of the Crawlee, which you can explore and utilize for your projects. Visit our GitHub repository for more information Crawlee for JS/TS on GitHub.

Installation

We recommend visiting the Introduction tutorial in Crawlee documentation for more information.

Crawlee is available as crawlee package on PyPI. This package includes the core functionality, while additional features are available as optional extras to keep dependencies and package size minimal.

To install Crawlee with all features, run the following command:

python -m pip install 'crawlee[all]'

Then, install the Playwright dependencies:

playwright install

Verify that Crawlee is successfully installed:

python -c 'import crawlee; print(crawlee.__version__)'

For detailed installation instructions see the Setting up documentation page.

With Crawlee CLI

The quickest way to get started with Crawlee is by using the Crawlee CLI and selecting one of the prepared templates. First, ensure you have uv installed:

uv --help

If uv is not installed, follow the official installation guide.

Then, run the CLI and choose from the available templates:

uvx 'crawlee[cli]' create my-crawler

If you already have crawlee installed, you can spin it up by running:

crawlee create my-crawler

Examples

Here are some practical examples to help you get started with different types of crawlers in Crawlee. Each example demonstrates how to set up and run a crawler for specific use cases, whether you need to handle simple HTML pages or interact with JavaScript-heavy sites. A crawler run will create a storage/ directory in your current working directory.

BeautifulSoupCrawler

The BeautifulSoupCrawler downloads web pages using an HTTP library and provides HTML-parsed content to the user. By default it uses ImpitHttpClient for HTTP communication and BeautifulSoup for parsing HTML. It is ideal for projects that require efficient extraction of data from HTML content. This crawler has very good performance since it does not use a browser. However, if you need to execute client-side JavaScript, to get your content, this is not going to be enough and you will need to use PlaywrightCrawler. Also if you want to use this crawler, make sure you install crawlee with beautifulsoup extra.

import asyncio

from crawlee.crawlers import BeautifulSoupCrawler, BeautifulSoupCrawlingContext


async def main() -> None:
    crawler = BeautifulSoupCrawler(
        # Limit the crawl to max requests. Remove or increase it for crawling all links.
        max_requests_per_crawl=10,
    )

    # Define the default request handler, which will be called for every request.
    @crawler.router.default_handler
    async def request_handler(context: BeautifulSoupCrawlingContext) -> None:
        context.log.info(f'Processing {context.request.url} ...')

        # Extract data from the page.
        data = {
            'url': context.request.url,
            'title': context.soup.title.string if context.soup.title else None,
        }

        # Push the extracted data to the default dataset.
        await context.push_data(data)

        # Enqueue all links found on the page.
        await context.enqueue_links()

    # Run the crawler with the initial list of URLs.
    await crawler.run(['https://crawlee.dev'])


if __name__ == '__main__':
    asyncio.run(main())

PlaywrightCrawler

The PlaywrightCrawler uses a headless browser to download web pages and provides an API for data extraction. It is built on Playwright, an automation library designed for managing headless browsers. It excels at retrieving web pages that rely on client-side JavaScript for content generation, or tasks requiring interaction with JavaScript-driven content. For scenarios where JavaScript execution is unnecessary or higher performance is required, consider using the BeautifulSoupCrawler. Also if you want to use this crawler, make sure you install crawlee with playwright extra.

import asyncio

from crawlee.crawlers import PlaywrightCrawler, PlaywrightCrawlingContext


async def main() -> None:
    crawler = PlaywrightCrawler(
        # Limit the crawl to max requests. Remove or increase it for crawling all links.
        max_requests_per_crawl=10,
    )

    # Define the default request handler, which will be called for every request.
    @crawler.router.default_handler
    async def request_handler(context: PlaywrightCrawlingContext) -> None:
        context.log.info(f'Processing {context.request.url} ...')

        # Extract data from the page.
        data = {
            'url': context.request.url,
            'title': await context.page.title(),
        }

        # Push the extracted data to the default dataset.
        await context.push_data(data)

        # Enqueue all links found on the page.
        await context.enqueue_links()

    # Run the crawler with the initial list of requests.
    await crawler.run(['https://crawlee.dev'])


if __name__ == '__main__':
    asyncio.run(main())

More examples

Explore our Examples page in the Crawlee documentation for a wide range of additional use cases and demonstrations.

Features

Why Crawlee is the preferred choice for web scraping and crawling?

Why use Crawlee instead of just a random HTTP library with an HTML parser?

  • Unified interface for HTTP & headless browser crawling.
  • Automatic parallel crawling based on available system resources.
  • Written in Python with type hints - enhances DX (IDE autocompletion) and

readme truncated — read the full docs on github

Frequently asked questions

Is crawlee-python free to use?

crawlee-python is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does crawlee-python do?

Crawlee—A web scraping and browser automation library for Python to build reliable crawlers. Extract data for AI, LLMs, RAG, or GPTs. Download HTML, PDF, JPG, P

What is crawlee-python written in?

crawlee-python is primarily written in Python. Its source is publicly available at https://github.com/apify/crawlee-python, and it has 9,535 GitHub stars.