[python] aiohttp를 사용하여 비동기적으로 웹 크롤러 결과를 엑셀 파일로 저장하기

웹 크롤링을 통해 수집한 데이터를 엑셀 파일로 저장하기 위해 aiohttp 라이브러리를 사용하면 매우 간편하게 비동기적으로 처리할 수 있습니다. 이번 포스트에서는 aiohttp를 사용하여 웹 페이지를 비동기적으로 요청하고 응답을 받아와서 엑셀 파일에 저장하는 방법에 대해 알아보겠습니다.

필요한 라이브러리 설치하기

먼저 aiohttpopenpyxl 라이브러리를 설치해야 합니다. 이 라이브러리들은 아래의 명령어로 설치할 수 있습니다.

pip install aiohttp
pip install openpyxl

비동기 웹 요청하기

aiohttp를 사용하여 비동기적으로 웹 페이지에 요청을 보내기 위해서는 aiohttp.ClientSession을 생성하고 async with 구문 안에서 session.get() 메서드를 사용하여 웹 페이지에 접속해야 합니다. 아래의 예제 코드를 살펴보세요.

import aiohttp
import asyncio

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

url = "https://example.com"
html = asyncio.run(fetch(url))
print(html)

위 코드에서는 fetch() 함수를 정의하고 fetch() 함수에서 aiohttp.ClientSession()을 생성한 뒤 session.get() 메서드로 웹 페이지에 접속한 후, response.text()를 사용하여 웹 페이지의 HTML 코드를 가져옵니다. 마지막으로 asyncio.run() 함수를 사용하여 이 비동기 코드를 실행합니다.

엑셀 파일로 저장하기

openpyxl 라이브러리를 사용하여 웹 크롤링한 데이터를 엑셀 파일로 저장하는 방법에 대해 알아보겠습니다. openpyxl은 대표적인 엑셀 파일 처리 라이브러리로, 간편한 API를 제공합니다.

아래의 예제 코드는 openpyxl을 사용하여 엑셀 파일을 생성하고 웹 크롤링한 데이터를 시트에 저장하는 예제입니다.

import openpyxl

data = [['이름', '나이', '직업'],
        ['John', 25, 'Engineer'],
        ['Emily', 30, 'Designer'],
        ['Michael', 35, 'Manager']]

wb = openpyxl.Workbook()
ws = wb.active

for row in data:
    ws.append(row)

wb.save("data.xlsx")

위 코드에서는 openpyxl.Workbook()을 사용하여 새로운 엑셀 파일 wb를 생성하고, 해당 워크북의 활성 시트 ws를 얻어옵니다. 그리고 ws.append() 메서드를 사용하여 데이터를 시트에 추가합니다. 마지막으로 wb.save() 메서드를 사용하여 엑셀 파일을 저장합니다.

비동기 크롤러 결과를 엑셀 파일로 저장하기

이제 aiohttpopenpyxl을 함께 사용하여 웹 크롤러 결과를 비동기적으로 가져와서 엑셀 파일로 저장하는 예제 코드를 살펴보겠습니다.

import aiohttp
import asyncio
import openpyxl

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

async def crawl_and_save(url, filename):
    html = await fetch(url)
    wb = openpyxl.Workbook()
    ws = wb.active

    # 웹 크롤링한 데이터를 시트에 추가하는 로직 구현
    # ...

    wb.save(filename)

url = "https://example.com"
filename = "data.xlsx"

asyncio.run(crawl_and_save(url, filename))

위 코드에서는 crawl_and_save() 함수를 정의한 뒤, fetch() 함수와 openpyxl을 사용하여 비동기적으로 웹 페이지를 크롤링한 결과를 엑셀 파일에 저장합니다. 웹 크롤링한 데이터를 엑셀 시트에 추가하는 로직은 별도로 구현해야 합니다.

결론

이번 포스트에서는 aiohttp를 사용하여 웹 크롤러 결과를 비동기적으로 엑셀 파일로 저장하는 방법에 대해 알아보았습니다. aiohttpopenpyxl은 간편하게 데이터를 비동기적으로 처리하고 엑셀 파일에 저장할 수 있는 라이브러리입니다. 이를 활용하여 큰 규모의 웹 크롤링 작업을 효율적으로 수행할 수 있습니다.

참고 자료