Celery로 비동기 웹 크롤러 개발하기

Celery는 파이썬에서 비동기 작업을 수행하는 데 사용되는 분산 작업 큐입니다. Celery를 사용하면 웹 크롤링과 같은 오래 걸리는 작업을 비동기적으로 처리할 수 있습니다. 이제 Celery를 사용하여 비동기 웹 크롤러를 개발하는 방법에 대해 알아보겠습니다.

Celery 설치

Celery를 사용하기 위해 먼저 설치해야 합니다. 아래 명령을 사용하여 Celery를 설치할 수 있습니다.

pip install celery

Celery 앱 설정

Celery를 사용하기 위해 앱을 설정해야 합니다. celery.py 파일을 생성하고 아래와 같이 작성합니다.

from celery import Celery

app = Celery('crawler', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')

@app.task
def crawl(url):
    # 크롤링 작업 수행
    return data

위 코드에서 brokerbackend는 Celery 작업을 처리하기 위한 메시지 브로커와 결과 백엔드를 정의하는 부분입니다. 이 예시에서는 Redis를 사용하였습니다.

크롤링 작업 정의

Celery를 사용하여 크롤링 작업을 정의할 수 있습니다. 위에서 정의한 crawl 작업을 사용하여 웹 페이지를 크롤링하는 함수를 만들어보겠습니다.

from celery import current_app

@app.route('/crawl')
def start_crawl():
    url = request.args.get('url')

    task = current_app.send_task('crawler.crawl', args=[url])

    return "Crawling task started: {}".format(task.id)

위 코드에서 start_crawl 함수는 /crawl 경로로 HTTP 요청을 처리합니다. 요청 파라미터로 받은 URL을 crawl 작업에 전달하고, 작업 식별자를 반환합니다.

Celery 워커 실행

Celery 워커를 실행하여 크롤링 작업을 처리할 수 있습니다. 아래 명령을 통해 Celery 워커를 실행합니다.

celery -A celery_app worker --loglevel=info

위 명령에서 -A 옵션은 Celery 앱을 지정하고, --loglevel 옵션은 로그 레벨을 설정합니다.

웹 크롤링 실행

Celery 워커가 실행 중인 상태에서 웹 크롤링 작업을 실행할 수 있습니다. 아래와 같이 HTTP 요청을 보내면 크롤링 작업이 Celery 워커에서 비동기적으로 실행됩니다.

curl http://localhost:5000/crawl?url=https://www.example.com

마무리

이제 Celery를 사용하여 비동기 웹 크롤러를 개발하는 방법에 대해 알아보았습니다. Celery를 통해 오래 걸리는 작업을 비동기적으로 처리할 수 있으며, 크롤링 작업 외에도 다양한 비동기 작업에 대해 적용할 수 있습니다.

#python #webcrawler