Traditional synchronous scraping issues one request, waits for the response, processes it, then issues the next — spending most of its time waiting for network I/O. Async scraping uses an event loop (Python's asyncio, Node.js's event loop) to issue many requests concurrently and process each response as it arrives, keeping the CPU busy and the network saturated.
With async I/O, a single-threaded Python process can maintain hundreds of in-flight HTTP connections simultaneously. The event loop switches between coroutines whenever a network operation would block, so CPU time is never wasted waiting for bytes to arrive. Libraries like `httpx`, `aiohttp`, and `trio` provide async-native HTTP clients.
Async scraping is most beneficial for I/O-bound workloads (many independent URL fetches). It provides less benefit for CPU-bound workloads (heavy HTML parsing) where true parallelism from multiprocessing is needed. For browser-based scraping, async control of multiple browser contexts achieves similar concurrency benefits.