Framework
scrapy/scrapy avatar
scrapy/scrapy

Scrapy 2.18: A Python framework for structured web scraping, not a one-off fetcher

Scrapy, a fast high-level web crawling & scraping framework for Python.

64,346 stars11,959 forksPythonBSD-3-Clause

At a glance

What is it?
Scrapy is a maintained Python framework for extracting structured data from websites, built around spiders, selectors, and pipelines. This review covers its mechanism, setup, limitations, and where it fits versus lighter tools.
Who is it for?
Adopt Scrapy if you need a structured, maintainable crawler for multiple sites, with built-in request handling and export pipelines. Skip it if you only need a single page fetch or a quick prototype, where requests or httpx are lighter.
Can I use it commercially?
Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 14, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

What Scrapy actually solves

Scrapy is a web scraping framework, not a library. The README calls it a framework to extract structured data from websites. That distinction matters. A library like requests gives you an HTTP client and leaves the rest to you. Scrapy imposes a project structure: spiders define how to crawl, items define the data shape, and pipelines process the results. For a site with a few pages, that structure is overhead. For a site with thousands of pages, or a set of sites you maintain over time, the structure pays off. The intended user is someone who needs repeatable, organized extraction, not a one-off script.

The mechanism: spiders, selectors, and pipelines

The core unit is a spider, a class that tells Scrapy which URLs to start with and how to follow links. Scrapy handles concurrency, request scheduling, and retries internally. The README does not show a full spider, but the architecture is visible in the repository layout and documentation references. The framework provides selectors, typically XPath or CSS, to pull data out of HTML. Extracted data goes into items, which are plain Python dictionaries or dataclass-like objects. Pipelines then clean, validate, or store the items. The data flow is one-way: requests go out, responses come back, selectors extract, pipelines persist. This separation makes each stage testable in isolation.

Getting it running: installation and first steps

The README gives one command to install: pip install scrapy. That is the entire setup shown. After that, the documentation is the next step, linked from the README. Based on the repository, you would typically run scrapy startproject to create a new project, then define a spider in the spiders directory. The README does not list those commands, so I cannot confirm them from this material. What is clear is that Scrapy requires Python 3.10 or newer, as stated in the README. There is also a conda-forge package, indicated by the badge, so conda install -c conda-forge scrapy works for those who prefer that path. The installation is straightforward, but the learning curve starts after that.

Real limitations and wrong-tool cases

Scrapy is a heavy tool for light jobs. If you need to fetch one JSON API endpoint or scrape a single page, the framework overhead is not justified. The README does not mention JavaScript rendering. Scrapy fetches raw HTML, so sites that render content via JavaScript will return empty or partial data unless you integrate a headless browser, which is not covered in the README. Another limitation is that Scrapy is a framework, not a library. You must adopt its project layout and its asynchronous engine. If you want to embed scraping into an existing application with minimal dependencies, Scrapy's structure may fight you. Also, the README does not mention proxy management or CAPTCHA handling, so those are external concerns. If your target site blocks automated requests, Scrapy alone will not solve that.

The alternative: plain HTTP clients

The obvious alternative is requests, a Python HTTP library. The difference is approach: requests is a tool, Scrapy is a framework. With requests, you write a loop, parse the response with BeautifulSoup or lxml, and store the data yourself. That gives you full control and a tiny dependency, but you also handle retries, concurrency, and scheduling by hand. Scrapy gives you those features built in, but you work inside its model. For a single script, requests is faster to write and easier to debug. For a crawling project with multiple spiders and scheduled runs, Scrapy saves you from reinventing the plumbing. The README does not mention requests, but the trade-off is well known in the Python ecosystem and visible in Scrapy's design.

Maintenance and license cost

The repository is active. The last push is dated 2026-08-20, with release 2.18.0 on the same day. Previous releases came in July and May of the same year, so the cadence is roughly monthly or bi-monthly. That means you get fixes and new features regularly, but also that upgrades are a recurring task. The README notes the project is maintained by Zyte and many other contributors, which suggests a commercial backer and a community. The license is BSD-3-Clause, a permissive license. That allows you to use, modify, and distribute the code with minimal conditions, only requiring attribution. There is no copyleft obligation. You should still read the license text for the exact terms, but the BSD-3-Clause is one of the least restrictive open source licenses. Upgrading is not free: each release can change behavior, so you need to read the changelog before bumping versions.

Who should adopt Scrapy, and what to verify first

Adopt Scrapy if you are building a crawler that will run repeatedly, with multiple data sources or a defined output format. The framework's structure forces you to separate concerns, which helps as the project grows. Do not adopt it for a one-off fetch or for a site that requires JavaScript rendering without additional tools. Before committing, verify that your target sites permit crawling. Check robots.txt and the terms of service. Also verify that your Python environment is 3.10 or newer, as the README states. If you have a simple task, start with requests and add structure only when you feel the pain. If you have a complex task, Scrapy's built-in scheduling and pipelines are worth the learning curve. The final check is to run scrapy startproject and write a minimal spider to see if the framework's flow matches your mental model.

Editorial conclusion

Adopt Scrapy if you need a structured, maintainable crawler for multiple sites, with built-in request handling and export pipelines. Skip it if you only need a single page fetch or a quick prototype, where requests or httpx are lighter. Verify first that your target sites allow crawling under their terms of service and robots.txt, and check Python 3.10+ compatibility. Scrapy is actively maintained, with regular releases, but its learning curve and project structure are real costs.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Community notes

Community notes