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

이번에는 aiohttp 라이브러리를 사용하여 비동기적으로 웹 크롤러 결과를 SQLite 데이터베이스에 저장하는 방법에 대해 알아보겠습니다.

1. 필요한 패키지 설치하기

먼저, aiohttpaiomysql 패키지를 설치해야 합니다. 아래의 커맨드를 사용하여 설치할 수 있습니다.

pip install aiohttp aiomysql

2. 비동기 웹 크롤러 구현하기

크롤링할 웹사이트의 URL을 입력받고, 해당 웹사이트에서 필요한 데이터를 가져오는 비동기 웹 크롤러를 구현해보겠습니다. 아래는 예시 코드입니다.

import aiohttp
import asyncio

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

async def crawl_website(url):
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, url)
        # 필요한 데이터 추출 및 가공 로직 구현

        return result

async def main():
    url = 'https://example.com'  # 크롤링할 웹사이트 URL
    result = await crawl_website(url)
    print(result)  # 크롤링 결과 출력

if __name__ == '__main__':
    asyncio.run(main())

3. SQLite 데이터베이스에 저장하기

이제 웹 크롤러의 결과를 SQLite 데이터베이스에 저장하는 코드를 작성해보겠습니다. 아래는 예시 코드입니다.

import sqlite3

def create_table():
    conn = sqlite3.connect('mydatabase.db')  # 새로운 SQLite 데이터베이스 생성
    cursor = conn.cursor()

    cursor.execute('''CREATE TABLE IF NOT EXISTS mytable
                      (id INTEGER PRIMARY KEY AUTOINCREMENT,
                       title TEXT,
                       content TEXT)''')

    conn.commit()
    conn.close()

def insert_data(title, content):
    conn = sqlite3.connect('mydatabase.db')
    cursor = conn.cursor()

    cursor.execute('''INSERT INTO mytable (title, content)
                      VALUES (?, ?)''', (title, content))

    conn.commit()
    conn.close()

async def save_to_database(result):
    create_table()
    for item in result:
        insert_data(item['title'], item['content'])

async def main():
    # ...

    result = await crawl_website(url)
    await save_to_database(result)

if __name__ == '__main__':
    asyncio.run(main())

위의 코드에서 create_table 함수는 데이터베이스에 테이블을 생성하는 역할을 하고, insert_data 함수는 데이터를 테이블에 삽입하는 역할을 합니다. save_to_database 함수에서는 크롤링한 결과를 데이터베이스에 저장하도록 구현되어 있습니다.

이제 실행하면 비동기 웹 크롤러가 동작하고, 결과는 SQLite 데이터베이스에 저장됩니다.

마무리

이번에는 aiohttp를 사용하여 비동기적으로 웹 크롤러 결과를 SQLite 데이터베이스에 저장하는 방법을 알아보았습니다. 비동기 방식을 사용하면 웹 크롤링 속도를 향상시킬 수 있으며, SQLite 데이터베이스를 활용하면 결과를 효율적으로 저장하고 관리할 수 있습니다.