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

이번 포스트에서는 Python의 aiohttp 라이브러리를 사용하여 비동기적으로 웹 크롤링을 수행하고, 수집한 데이터를 MongoDB에 저장하는 방법에 대해 알아보겠습니다.

필요한 패키지 설치

먼저, 필요한 패키지들을 설치해야 합니다. 아래 명령어를 사용하여 aiohttp와 pymongo를 설치해주세요.

pip install aiohttp pymongo

크롤링 코드 작성하기

사용할 웹 페이지에서 데이터를 수집하기 위해 aiohttp를 사용하겠습니다. 비동기적으로 요청을 보낼 수 있는 aiohttp의 ClientSession을 사용하여 웹 페이지를 가져오는 코드를 작성해보겠습니다.

import aiohttp
import asyncio

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

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'https://example.com')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

위 코드에서 fetch 함수는 aiohttp의 ClientSession을 사용하여 비동기적으로 웹 페이지를 가져옵니다. fetch 함수를 호출하는 main 함수에서는 웹 페이지의 HTML을 가져온 후 출력합니다.

수집한 데이터 MongoDB에 저장하기

원하는 데이터를 수집했다면, 이를 MongoDB에 저장할 수 있습니다. pymongo 라이브러리를 사용하여 MongoDB에 연결하고, 데이터를 저장하는 예제 코드를 작성해보겠습니다.

import aiohttp
import asyncio
from pymongo import MongoClient

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

async def main():
    client = MongoClient('mongodb://localhost:27017/')
    db = client['mydatabase']
    collection = db['mycollection']

    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'https://example.com')
        data = {'html': html}
        collection.insert_one(data)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

위 코드에서는 MongoClient를 사용하여 MongoDB에 연결하고, 데이터를 저장하기 위해 insert_one 메소드를 사용합니다. data 딕셔너리에 웹 페이지의 HTML을 저장한 후, insert_one 메소드를 통해 MongoDB에 저장됩니다.

결론

이렇게 하면 aiohttp를 사용하여 비동기적으로 웹 크롤링을 수행하고, 수집한 데이터를 MongoDB에 저장할 수 있습니다. 비동기 프로그래밍을 통해 웹 크롤링의 효율성을 높일 수 있으며, MongoDB의 강력한 기능을 활용하여 데이터를 효과적으로 관리할 수 있습니다.

참고 자료