seoder

Open source crawling and extraction projects

Every license here was read from the project's own repository rather than from a directory. Two of these are copyleft in a way that reaches your code, and those rows say so.

  • Scrapy

    Open source · BSD-3-Clause · Python

    A Python crawling framework with its own scheduler, middleware chain, item pipelines and throttling.

    Suits
    Concurrency, retries, duplicate filtering and export pipelines are already solved, with a settings system that makes rate limits and politeness configuration rather than code.
    Does not suit
    No browser, so JavaScript-dependent pages need a separate rendering integration that gives back most of the throughput. Its async model is built on Twisted rather than asyncio, which is an unfamiliar shape for anyone who learned Python recently.
  • Crawlee

    Open source · Apache-2.0 · TypeScript

    A crawling library for Node and Python covering request queues, retries, proxy rotation, session handling and both HTTP and browser crawlers.

    Suits
    One interface over plain fetching and full browser automation, so testing whether a target needs rendering is a change of crawler class rather than a rewrite.
    Does not suit
    It owns storage and queueing in its own layout, so slotting it into a pipeline that already has both means fighting the framework. The browser crawlers inherit every memory cost of the browser underneath.
  • Colly

    Open source · Apache-2.0 · Go

    A Go scraping framework with a callback-driven API, parallelism controls and built-in caching.

    Suits
    Very fast and very light on memory compared with the Python and Node frameworks, and it compiles to a single binary with no runtime to install on the host.
    Does not suit
    No JavaScript execution at all, and the callback style scatters crawl logic across handlers in a way that gets hard to follow past a few hundred lines. Development has been quiet, so expect to read the source rather than a changelog.
  • spider

    Open source · MIT · Rust

    A Rust crawling and scraping crate covering the fetch loop, concurrency limits, link discovery and content conversion.

    Suits
    MIT licensed, the permissive end of this list, and cargo features let a build leave out the browser, the cache and the model integrations it does not use.
    Does not suit
    It crawls and converts, so deciding which part of a page is the content is still your job. Nearly all of the work comes from one maintainer, which is a real availability risk for anything you build on top of it.
  • spider-py

    Open source · MIT · Rust with a Python interface

    Python bindings for the spider crate, installed as spider_rs, exposing a Website object that crawls, scrapes and hands back links and pages.

    Suits
    The crawl loop runs in Rust, so concurrency and the fetch path are not Python's problem, and per-path budgets and blacklist patterns are set on the builder rather than written as middleware. Its own benchmark reports 150,387 pages in 186 seconds where Scrapy reached 49,598 in an hour on the same site, which is the maintainer's number on the maintainer's laptop and worth re-running on yours.
    Does not suit
    The binding exposes a fraction of what the crate does, so anything missing means writing Rust. It is a compiled extension, so a platform with no published wheel builds it through maturin. The repository has gone eight months without a commit while the crate underneath keeps releasing, so the Python side lags what the Rust side does.
  • spider-nodejs

    Open source · MIT · Rust with a Node interface

    Node bindings for the same crate, published as @spider-rs/spider-rs, with a per-page callback, per-path budgets and an optional headless Chrome mode.

    Suits
    Crawling happens on Rust threads instead of the event loop, and a crawl can be handed to a background thread and awaited later, so the process is not parked while pages come in.
    Does not suit
    Same binding gap as the Python port, and a native module means a prebuilt binary per platform, which containers on less common architectures will find out about at install time. Crawlee does the same job in TypeScript with far more documentation, so the argument for this one is throughput and nothing else.
  • Katana

    Open source · MIT · Go

    A fast crawler for URL discovery, with a headless mode and parsing of endpoints found inside JavaScript files.

    Suits
    Finds endpoints that link-following misses, because it reads JavaScript bundles for URLs rather than only following anchors.
    Does not suit
    It enumerates URLs and stops there: no extraction, no storage model worth the name. Defaults are tuned for security reconnaissance rather than politeness, so pointing it at a site you do not own needs the rate settings changed first.
  • Heritrix

    Open source · Apache-2.0 · Java

    The Internet Archive's archival crawler, writing WARC files that preserve requests and responses byte for byte.

    Suits
    Archival fidelity that nothing else on this list attempts, with output that replays later exactly as it was served, headers included.
    Does not suit
    Fidelity is the entire design, so extraction work fits badly: you get bytes, not fields. Configuration is XML-heavy and the operational learning curve is steep enough that WARC output needs to be a requirement, not a preference.
  • Crawl4AI

    Open source · Apache-2.0 · Python

    An async Python crawler that renders pages with a browser and returns Markdown and structured output shaped for language models.

    Suits
    Rendering, content cleaning and Markdown conversion in one library, with extraction strategies that can be rules or a model call depending on how regular the page is.
    Does not suit
    It moves fast and the API has changed between releases, so pin the version and read the changelog before upgrading. Every crawl carries a browser, which makes it heavy for targets that never needed one.
  • Firecrawl

    Open source · AGPL-3.0 · TypeScript

    A crawling and scraping service, also published as source, that converts pages to clean Markdown for model and retrieval pipelines.

    Suits
    The hosted product and the source are the same system, so a prototype can move in-house without a rewrite, and the Markdown output removes a cleaning step downstream.
    Does not suit
    The repository is AGPL-3.0, which is a real constraint for anyone embedding it in a service rather than running it as a separate tool, and is the reason a commercial license exists. Markdown conversion also drops attributes and table structure that some extractions need.
  • Trafilatura

    Open source · Apache-2.0 · Python

    A Python library that extracts main text, comments and metadata from web pages, with output as text, XML or JSON.

    Suits
    It performs well in published comparisons of boilerplate removal, handles date and author extraction, and runs fast enough for corpus-scale work without a browser.
    Does not suit
    Built for article-shaped pages. A product grid, a dashboard or a documentation page with heavy navigation confuses the main-content heuristic, and there is no way to tell it which region you meant.
  • Beautiful Soup

    Open source · MIT · Python

    A Python library for navigating and searching parse trees, sitting on top of a parser you choose.

    Suits
    Forgiving with broken markup and readable enough that a selector written a year ago still explains itself. The documentation is among the best in Python.
    Does not suit
    Slow. On a corpus of hundreds of thousands of pages the parse step becomes the bottleneck, and the usual fix is calling lxml directly. It is also only a tree API, so it decides nothing about which part of the tree is content.
  • lxml

    Open source · BSD-3-Clause · Python

    Python bindings for libxml2 and libxslt, providing fast XML and HTML parsing with XPath and XSLT support.

    Suits
    Much faster than pure-Python parsers, with full XPath, which is the right tool when a selector has to express a structural condition CSS cannot.
    Does not suit
    It is a C extension, so installation can fail on platforms without wheels and it complicates minimal containers. XPath is also more power than most extraction needs, and unreadable XPath is a maintenance cost that shows up later.
  • Cheerio

    Open source · MIT · TypeScript

    A server-side implementation of a jQuery-like API over a parsed HTML tree, for Node.

    Suits
    Familiar selector syntax and no browser, which makes it many times faster and lighter than parsing with a headless browser for markup that is already in the response.
    Does not suit
    It parses markup and nothing else: no layout, no JavaScript, no computed styles. Any check that depends on whether an element is visible has to happen in a real browser instead.
  • Readability

    Open source · Apache-2.0 · JavaScript

    The content extraction library behind Firefox Reader View, isolating the main article from a page.

    Suits
    Battle-tested across the open web at browser scale, and the same algorithm users already see, which makes its output predictable to anyone who has used Reader View.
    Does not suit
    Article-shaped pages only, and it runs against a DOM, so a Node deployment needs jsdom or similar alongside it. It discards structure you may have wanted, including most attributes.
  • fast_html2md

    Open source · MIT · Rust

    A Rust library that turns HTML into Markdown, with a lol_html streaming rewriter as the default path and a scraper-based parser behind a feature flag.

    Suits
    Conversion as its own library rather than a step buried in a crawler, so a pipeline that already fetches pages gets Markdown output without adopting a framework. A streaming mode returns chunks as they convert, so a large document never has to sit in memory as one string.
    Does not suit
    It converts, it does not extract. Hand it a whole page and the navigation, the footer and the cookie banner come back as Markdown too, so an extractor still has to run first. Conversion also drops attributes and most table structure, which is the trade every converter here makes.
  • Docling

    Open source · MIT · Python

    A document conversion toolkit that turns PDF, DOCX, PPTX, HTML and images into structured Markdown or JSON, with layout and table recognition.

    Suits
    Table structure and reading order survive conversion, which is where naive PDF text extraction fails and quietly produces scrambled rows.
    Does not suit
    Layout and table models mean real compute: CPU-bound on a laptop and slow enough that a large batch wants a GPU. It is a document pipeline, not a crawler, so fetching is still yours.
  • Requests

    Open source · Apache-2.0 · Python

    The standard Python HTTP client, handling sessions, cookies, redirects and authentication.

    Suits
    So widely used that almost every example you find already assumes it, and its session object handles cookie and connection reuse correctly without configuration.
    Does not suit
    Synchronous, so concurrency means threads or a different library, and its TLS fingerprint is that of a Python client rather than a browser, which some bot mitigation matches on directly. Neither is a bug, but both decide whether it fits.
  • chromey

    Open source · Apache-2.0 · Rust

    A Rust library that drives Chrome over the DevTools Protocol, importing as chromiumoxide, with feature flags for adblocking, request filtering, response caching and downloading Chrome for Testing.

    Suits
    Apache-2.0 rather than nodriver's AGPL-3.0 two rows down, which is the difference that decides whether a crawler can embed it, and blocking ads and trackers is a cargo feature rather than an extension you load. It can fetch its own Chrome build, so a container does not need one installed.
    Does not suit
    Chrome only, and you are at protocol level: no locator API, no auto-waiting, no test runner, so every wait and retry is yours to write. The crate was renamed but still imports as chromiumoxide, which makes searching for an answer confusing, and the documentation is the README and the examples.
  • undetected-chromedriver

    Open source · GPL-3.0 · Python

    A patched ChromeDriver for Selenium that removes several properties commonly used to identify automated Chrome.

    Suits
    A drop-in replacement for the standard driver in existing Selenium code, which makes testing whether a target checks those properties nearly free.
    Does not suit
    Licensed GPL-3.0, which is stricter than most of this list and matters if you distribute your crawler. It also chases a moving target: each Chrome release can undo the patch, and using it to reach content a site has refused to automated clients is a terms question, not just a technical one.
  • nodriver

    Open source · AGPL-3.0 · Python

    An async Python browser automation library that speaks the DevTools Protocol directly, with no webdriver binary involved.

    Suits
    Removing the driver process removes both a startup cost and one of the signals detection looks for, and the async API fits modern Python without a compatibility layer.
    Does not suit
    AGPL-3.0, which is the most demanding license here and reaches services offered over a network, so read it before embedding. Chrome only, younger than the alternatives, and the documentation assumes you already know the protocol.
  • Camoufox

    Open source · MPL-2.0 · C++ with a Python interface

    A Firefox build patched at the C++ level so that fingerprint properties are changed below the JavaScript layer, with a Python interface.

    Suits
    Changing fingerprint values in the engine rather than by injecting scripts avoids the inconsistencies that script-level spoofing leaves behind and that detection specifically looks for.
    Does not suit
    A custom browser build is a custom browser build: large downloads, its own release cadence, and a lag behind upstream Firefox security fixes. Licensed MPL-2.0, and the browser it patches carries its own terms.

How the licenses here were checked

Each license came from the project's own repository metadata or its license file, not from a package directory or an aggregator. That distinction earns its keep: a repository can carry a license file the package metadata never reflects, and directory sites copy each other's mistakes.

Two entries deserve a second look before you build on them. Firecrawl and nodriver are AGPL-3.0, whose network clause reaches software offered as a service, which is exactly what a crawler usually is. undetected-chromedriver is GPL-3.0. Where the boundary falls depends on how you combine the code, and that is a question for your lawyer rather than for a listing page. The point of naming it here is that people usually find out later.

Free software, paid operations

Nothing on this list charges for a download, and none of it is free to run. The recurring costs are the same four every time: exit addresses when a target blocks by network, memory when a page needs a browser, retry logic when a site is slow or flaky, and somebody's afternoon when a selector stops matching.

A hosted service prices all four into one number. Self-hosting unbundles them, which is a win when you have engineers and a loss when you have a deadline. The honest comparison is not the license fee against the subscription, it is the subscription against a named person's time.

Pick a parser, then pick an extractor

These are separate jobs and the split is worth keeping. A parser turns bytes into a queryable tree, which is lxml, Cheerio or Beautiful Soup. An extractor decides which part of the tree is the content, which is Trafilatura or Readability.

Skipping the second step is the usual mistake. A hand-written rule that grabs the largest div works on the site you tested it against and produces navigation menus everywhere else. If your pages are articles, use an extractor built for articles. If they are product pages, accept that you are writing per-site selectors and plan for the maintenance rather than pretending a general rule exists.

Before you blame the library

When a crawl comes back empty, the library is rarely the problem. Check what the server actually returned first. A 403 means the request was refused, a 429 means you were too fast, and a page that returns 200 with a few hundred bytes is usually a challenge page being stored as content. A robots.txt rule or a noindex directive changes what you should be requesting at all.

The rendering comparison covers what survives without JavaScript, and how a crawler resolves a page sets out the order these steps run in.

Crawlers sets these frameworks beside the commercial site auditors. Browser APIs covers the rendering layer. Scraping APIs covers the hosted alternative when maintaining this yourself stops being worth it. Browser agents covers the model-driven layer above these, where an AGPL and an SSPL entry raise the same license question as the copyleft rows here. Search APIs covers querying an index somebody else maintains instead of crawling for one.

Questions

Does using an AGPL library mean I have to open source my crawler?

The AGPL's network clause applies when you convey the software or offer modified versions over a network, and where the boundary sits depends on how you combine the code. Running an unmodified AGPL tool as a separate process you call is a different situation from linking it into your service. Neither this page nor a license badge decides it for you, so ask a lawyer before you ship.

Why is a permissive license not automatically the safe choice?

Because the risk you are managing is usually not legal. An abandoned MIT project with an unpatched dependency tree costs more than a well-maintained Apache one. Check the last release date and the open issue count alongside the license.

Can I self-host instead of paying for a scraping API?

Yes, and the software is rarely the expensive part. Proxies, browser memory, retry logic and the ongoing work of fixing selectors when sites change are what the API price covers. Self-hosting moves that cost from a bill to a person's week.

What do I actually need to parse HTML?

One parser and one extractor. The parser turns bytes into a tree you can query, and the extractor decides which part of that tree is the content. Most projects need both and only install the first, then write the second badly by hand.