피드로 돌아가기
Async Web Scraping in Python: httpx + asyncio for 10x Faster Data Collection
Dev.toDev.to
Backend

Python Async로 데이터 수집 속도 11.3배 향상시킨 실무 전략

Async Web Scraping in Python: httpx + asyncio for 10x Faster Data Collection

Vhub Systems2026년 4월 3일11intermediate

Context

동기식 스크래핑 방식의 순차적 요청 처리로 인한 대기 시간 발생. 네트워크 I/O 바운드 작업에서 CPU 자원 낭비 초래. 요청 수가 증가할수록 전체 수집 시간이 선형적으로 증가하는 구조적 한계.

Technical Solution

  • asyncio와 httpx를 조합하여 다수의 HTTP 요청을 동시에 처리하는 비동기 아키텍처 설계
  • asyncio.Semaphore를 활용해 동시 요청 수를 5~20개로 제한하여 대상 서버의 Rate Limit 차단 방지
  • Exponential Backoff 알고리즘을 적용한 재시도 로직으로 429 Too Many Requests 응답에 유연하게 대응
  • httpx.AsyncClient의 커넥션 풀링을 통해 TCP 핸드셰이크 비용 절감 및 네트워크 효율 최적화
  • tqdm_asyncio를 통합하여 대규모 데이터 수집 과정의 실시간 진행 상태 추적 및 가시성 확보
  • CPU 연산 비중이 높은 파싱 작업과 네트워크 I/O 작업을 분리하여 비동기 이벤트 루프의 블로킹 최소화

Impact

  • 20개 요청 기준 동기 방식 10.2s에서 비동기 방식 0.9s로 단축
  • 기존 대비 약 11.3배의 속도 향상 달성
  • 동시성 설정(10x, 50x)에 따라 수집 시간을 100s에서 최대 2s까지 단축 가능

Key Takeaway

네트워크 대기 시간이 전체 실행 시간의 50%를 초과하는 I/O 바운드 작업에서는 비동기 모델 도입이 필수적임. 다만 과도한 동시성은 IP 차단 리스크를 높이므로 Semaphore를 통한 정밀한 트래픽 제어가 병행되어야 함.


네트워크 I/O 병목 확인 후 asyncio.Semaphore로 동시성 범위를 5~20개 사이에서 조정하며 최적의 처리량 탐색할 것

원문 읽기