[python] aiohttp를 사용하여 비동기적으로 웹 크롤러 결과를 데이터베이스에 저장하기

이번 포스트에서는 Python의 aiohttp 라이브러리를 사용하여 비동기적으로 웹 페이지를 크롤링하고, 그 결과를 데이터베이스에 저장하는 방법을 다루겠습니다.

aiohttp란?

aiohttp는 Python에서 비동기 웹 애플리케이션을 개발하기 위한 라이브러리입니다. 이 라이브러리를 사용하면 간단한 코드로 비동기적인 HTTP 요청을 처리할 수 있습니다.

설치하기

먼저, pip 명령어를 사용하여 aiohttp를 설치해야 합니다. 다음 명령어를 실행하세요:

pip install aiohttp

또한, 이 예제에서는 SQLite 데이터베이스를 사용할 것이므로, sqlite3 모듈도 설치해야 합니다.

pip install sqlite3

코드 예시

아래는 aiohttp를 사용하여 비동기적으로 웹 페이지를 크롤링하고, 그 결과를 SQLite 데이터베이스에 저장하는 예시 코드입니다.

import asyncio
from aiohttp import ClientSession
import sqlite3

async def fetch(url, session):
    async with session.get(url) as response:
        return await response.text()

async def crawl(url_list):
    tasks = []
    
    async with ClientSession() as session:
        for url in url_list:
            task = asyncio.ensure_future(fetch(url, session))
            tasks.append(task)
            
        responses = await asyncio.gather(*tasks)
        save_to_database(responses)
            
def save_to_database(results):
    conn = sqlite3.connect('web_crawler.db')
    c = conn.cursor()
    
    for response in results:
        # 웹 페이지 크롤링 결과를 데이터베이스에 저장하는 로직
        # 예시로 결과를 출력하도록 작성하였습니다.
        print(response)
        
    conn.commit()
    conn.close()

if __name__ == '__main__':
    urls = ['http://example.com', 'http://example.org', 'http://example.net']
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(crawl(urls))

위의 코드에서 fetch 함수는 주어진 URL의 비동기 GET 요청을 보내고, 그 결과를 반환합니다. crawl 함수는 url 리스트를 받아 각각의 URL에 대해 fetch 함수를 호출하고, asyncio.gather 함수를 사용하여 모든 비동기 요청이 완료될 때까지 대기합니다. 그리고 save_to_database 함수를 호출하여 크롤링 결과를 데이터베이스에 저장합니다.

실행하기

위의 코드를 복사하여 crawler.py라는 파일에 저장하고, 아래 명령어를 실행하여 크롤러를 실행할 수 있습니다.

python crawler.py

결과는 SQLite 데이터베이스에 저장되는 대신, 콘솔에 출력됩니다. 이 예제 코드는 각 웹 페이지를 크롤링하여 그 결과를 출력하는 간단한 예시입니다. 실제로 데이터베이스에 결과를 저장하고 원하는 방식으로 활용하면 됩니다.

결론

이번 포스트에서는 aiohttp를 사용하여 비동기적으로 웹 페이지를 크롤링하고, 그 결과를 데이터베이스에 저장하는 방법을 살펴보았습니다. aiohttp는 비동기 웹 애플리케이션 개발을 간편하게 만들어주는 강력한 도구입니다. 웹 크롤러나 다른 비동기적인 작업을 수행하는 애플리케이션을 개발할 때 aiohttp를 적극 활용해보세요!