Noureddine RAMDI / Colly: high-performance web scraping in Go with concurrency and ease

Created Sat, 02 May 2026 20:07:04 +0000 Modified Sat, 23 May 2026 20:41:27 +0000

gocolly/colly

Web scraping remains a staple technique for data extraction, but building reliable, performant scrapers is often more involved than it seems. Colly stands out by harnessing Go’s concurrency model and callback-driven API to make complex scraping tasks accessible without sacrificing speed or control.

What colly does and how it works

Colly is a high-performance web scraping framework written in Go. Its primary purpose is to enable developers to build crawlers, spiders, and scrapers that extract structured data from websites easily and efficiently.

Under the hood, Colly provides a clean API for defining scraping workflows using callbacks triggered during the crawling lifecycle: when requests are made, responses received, elements found, or errors occur. It supports both synchronous and asynchronous scraping, leveraging Go’s goroutines and channels for concurrency.

Key features include automatic cookie and session management, request delay and rate limiting, domain-specific concurrency control, caching of HTTP responses, and compliance with robots.txt rules. These features address common challenges in scraping: managing site sessions, avoiding bans through polite crawling, and improving efficiency by reusing cached data.

The architecture revolves around a Collector object that orchestrates HTTP requests and parsing. It uses Go’s standard HTTP client, enhanced with concurrency controls and middleware-like callback hooks. The default HTML parsing uses Go’s net/html package, with helper functions to navigate the DOM.

Colly’s stack is pure Go, making it easy to integrate into Go projects without external dependencies. This focus also ensures portability and easy deployment across platforms.

Why colly stands out technically

What distinguishes Colly is its elegant use of Go’s concurrency primitives combined with an event-driven API. The Collector manages a pool of workers that fetch pages in parallel, respecting per-domain concurrency limits to avoid overloads.

The callback system is straightforward: you register handlers for HTML elements, requests, responses, errors, and more. This design abstracts away much of the boilerplate around HTTP and parsing, improving developer experience while maintaining fine-grained control.

Performance-wise, Colly is fast — the README claims over 1000 requests per second on a single core. This throughput is impressive for a scraper that also handles cookies, sessions, delays, and caching automatically.

The codebase is surprisingly clean and modular for a project with this scope. Error handling is explicit, and the library offers hooks to customize all major stages of the scraping lifecycle. The tradeoff is that advanced users may need to write custom code for highly dynamic sites (e.g., heavy JavaScript) since Colly focuses on traditional HTTP scraping.

Caching and robots.txt support are practical features that many scrapers overlook. Colly’s caching layer reduces redundant network calls, and the robots.txt parser enforces crawling etiquette, which is critical for responsible scraping.

The project also supports distributed scraping with extensions, although the core focuses on single-machine scraping.

Quick start

Installation is simple with Go modules:

## Installation

go get github.com/gocolly/colly/v2

Using Colly typically involves creating a Collector, registering callbacks, and starting the crawl. Here’s a minimal example:

package main

import (
	"fmt"
	"github.com/gocolly/colly/v2"
)

func main() {
	c := colly.NewCollector()

	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
		link := e.Attr("href")
		fmt.Println("Found link:", link)
	})

	c.Visit("http://example.com")
}

This snippet sets up a collector that prints all links found on the example.com homepage. The API encourages writing clear, callback-driven scraping logic.

Verdict

Colly is a solid choice if you’re building scrapers or crawlers in Go and want a balance of performance, control, and developer ergonomics. It shines for sites where HTTP scraping suffices and concurrency management is critical.

Its strength lies in clean concurrency design and a callback API that simplifies typical scraping tasks like session handling and rate limiting. However, it does not natively support browser automation or JavaScript rendering, which limits its use on modern dynamic sites.

If your scraping needs fit within traditional HTTP-based workflows, Colly will save you time and scale well. For more complex scenarios involving SPA frameworks or heavy client-side rendering, you might need to combine Colly with other tools.

Overall, it’s a dependable, pragmatic library for Go developers who want to build scrapers without reinventing HTTP and concurrency handling. Worth understanding even if you end up using it alongside headless browsers or external scraping services.


→ GitHub Repo: gocolly/colly ⭐ 25,255 · Go