- GCP VM Instance 저스펙으로 Airflow 서버 구축하고 안정적으로 크롤링하기2024년 11월 14일
- 31514
- 작성자
- 2024.11.14.:13
첫 번째 문제 - Small Instance에 Airflow 서버 구축
개인 프로젝트를 하면서 5분 단위로 크롤링하여 데이터를 수집하고 싶었다.
이를 위해 Lambda + EventBridge와 EC2 + Airflow를 고민하다가 비용적인 측면에서 후자가 유리할 거 같았다.
이 링크를 참고하여 최대한 스펙이 낮은 EC2에 Airflow 서버를 구축했다.
처음에는 1GB RAM을 가진 인스턴스에서 Airflow 서버 구축을 시도했지만 메모리 부족 한계에 부딪혔다.
이에 따라 아래와 같이 스왑 메모리도 설정해봤지만 역부족이었다.
sudo fallocate -l 3G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
어쩔 수 없이 2GB RAM을 가진 인스턴스로 변경했고, Airflow는 서버는 성공적으로 구축할 수 있었다.
두 번째 문제 - Cloudflare 봇 탐지 우회
하지만 로컬에서 테스트할 때 보지 못했던 봇 탐지 문제에 부딪혔다.
이를 위해 User Agent 설정, 프록시 서버 구축, 인증에 통과한 쿠키값 사용하기, 헤드리스 옵션 끄기 등 다양한 시도를 해봤지만 해결할 수 없었다.
그러다 문득 현업 개발자분에게 들은 "AWS에서 되지 않던 크롤링 코드를 GCP에서 했더니 됐다."는 말이 기억이 났다.
혹시나 하여 모든 설정을 GCP VM Instance에서 동일하게 해주었고, 성공적으로 웹 사이트를 크롤링할 수 있었다.
세 번째 문제 - 불안정한 네트워크 대역폭
서두에서도 말했듯이 나의 DAG은 5분 단위로 크롤링 코드가 실행된다.
하지만 다음과 같이 DAG의 성공이 불안정했다.
일단 DAG이 실패하는 이유는 웹 페이지의 로딩이 30초를 초과하였기 때문이다.
playwright._impl._errors.TimeoutError: Timeout 30000ms exceeded.
혹시 몰라 스크린샷을 찍어보니 빈 네모칸만 수두룩했다.
이를 위해 대기 시간, 재시도 횟수, 재시도 딜레이 시간을 조정해봤지만 개선된 느낌이 전혀 없었다.
VM Instance 자체의 스펙을 향상시켜서 네트워크 대역폭을 늘려야하는가 고민했지만 그 비용을 감당할 자신이 없었다.
그러던 중 문득 "웹 페이지에서 최소한의 정보만 가져와도 되지 않을까?"라는 생각이 들었고, 코드를 다음과 같이 수정했다.
# 리소스 차단을 위한 핸들러 함수 async def handle_route(self, route, request): if request.resource_type in ["image", "stylesheet", "font", "media"]: await route.abort() else: await route.continue_() async with async_playwright() as p: browser = await p.chromium.launch(headless=True) context = await browser.new_context(user_agent=user_agent) page = await context.new_page() # 리소스 차단을 위한 route 설정 await page.route("**/*", self.handle_route) await page.goto("www.example.com") ...
그 결과 다음과 같이 녹색밭을 볼 수 있었다...
'개발' 카테고리의 다른 글
하둡 공부 2일차 (1) 2024.11.22 하둡 공부 1일차 (0) 2024.11.21 홈 서버 구축기인데 LG U+를 곁들인.. (1) 2024.11.01 lazy load되는 컨텐츠 안정성있게 크롤링하기 (0) 2024.10.25 뤼튼 캐릭터 크롤링 (1) 2024.10.13 다음글이전글이전 글이 없습니다.댓글