httpx를 이용하여 비동기로 웹사이트 정보를 획득해보자
비동기로 웹사이트 데이터를 획득해보자
httpx를 이용하여 비동기로 웹사이트 정보를 획득해보자
httpx를 이용하여 비동기로 웹사이트 정보를 획득해보자
비동기로 웹사이트 데이터를 획득해보자
1. 서론 (Introduction)
- 문제/상황 (Problem):
- 다수의 웹사이트 정보를 수집할 때 동기 방식의 요청은 I/O 대기 시간으로 인해 전체 처리 속도가 현저히 느려지는 한계가 있다.
- 목적 (Purpose):
- httpx 라이브러리의 비동기 기능을 활용하여 효율적이고 빠른 웹 데이터 수집 클라이언트를 구축한다.
- 대상 (Target Audience):
- 대량의 웹 데이터를 빠르게 처리해야 하거나 최신 Python 비동기 프로그래밍(asyncio)을 도입하려는 개발자
2. 방법 및 과정 (Methods & Process)
- 배경 조사 및 데이터 (Data Collection):
- requests와 유사한 API를 제공하면서도 완전한 비동기 지원과 HTTP/2를 지원하는 httpx의 특성을 조사하였다.
| 기능 | 설명 | 장점 |
|---|---|---|
| AsyncClient | asyncio 기반의 비동기 HTTP 클라이언트 | 논블로킹 I/O를 통한 동시 요청 처리 극대화 |
| Context Manager | async with를 통한 자원 관리 | 세션 종료 및 리소스 해제의 자동화 및 안정성 |
| HTTP/2 지원 | 최신 HTTP 프로토콜 대응 | 단일 연결을 통한 다중 요청으로 효율성 증대 |
| 병렬 처리 | asyncio.gather 등을 활용한 동시성 제어 | 수천 개의 URL을 짧은 시간 내에 처리 가능 |
| 유연한 타임아웃 | 세밀한 타임아웃 설정 기능 | 네트워크 환경에 따른 정밀한 예외 제어 |
- 접근 방법 (Approach Methods):
- [방법 1]: httpx.AsyncClient를 초기화하여 비동기 환경에서의 연결 풀을 구성한다.
- [방법 2]: async/await 구문을 사용하여 요청을 비동기적으로 처리하고 결과를 파싱한다.
- 분석 및 해결 프로세스 (Analysis Flow):
- 도구/기술: Python, httpx, asyncio, beautifulsoup4
- 주요 단계: 종속성 체크 모듈 연동 $\rightarrow$ Async WebClient 클래스 설계 $\rightarrow$ 비동기 로그인 및 추출 메서드 구현 $\rightarrow$ 리소스 해제를 위한 close 처리 $\rightarrow$ asyncio.run을 통한 최종 검증
- 결과 도출 및 검증: 동기 방식 대비 압도적인 대기 시간 감소를 확인하며, 로컬 데모 서버와의 비동기 통신 성공을 검증한다.
3. 결과 (Results)
- 분석 결과 요약:
- httpx는 requests의 사용성을 유지하면서도 강력한 비동기 성능을 제공함을 확인하였다.
- 비동기 클라이언트를 통해 다수의 네트워크 요청을 병렬로 처리함으로써 전체 수집 프로세스의 처리량을 크게 향상시켰다.
4. 인사이트 및 액션 (Insights & Action)
- 인사이트 (Insight):
- 비동기로 웹사이트 정보를 가져와보았다. 크롤링에 주로 사용하는 playwright를 활용해보자.
- I/O 바운드 작업인 웹 스크래핑에서 비동기 프로그래밍은 선택이 아닌 필수적인 최적화 기법이다.
- 실행 방안 (Action Plan):
- 고성능이 요구되는 데이터 수집 파이프라인의 기본 엔진을 httpx 비동기 클라이언트로 전환한다.
- 한 줄 결론 (Key Takeaway):
- httpx와 asyncio를 결합하면 성능과 생산성을 모두 잡은 비동기 크롤러를 구축할 수 있다. 샘플 코드
- 다음 스텝 (Next Step):
- 자바스크립트 렌더링이 필요한 동적 웹사이트 대응을 위해 playwright 기반의 크롤링 기법을 연구한다.
This post is licensed under CC BY 4.0 by the author.