[python] aiohttp를 사용하여 비동기적으로 웹 크롤러 결과를 Slack으로 전송하기

이번 글에서는 Python의 aiohttp 라이브러리를 사용하여 비동기적으로 웹 크롤러 결과를 Slack으로 전송하는 방법을 알아보겠습니다.

필요한 패키지 설치

먼저, aiohttpslack-sdk 패키지를 설치해야 합니다. 아래의 명령어를 사용하여 설치할 수 있습니다.

pip install aiohttp slack-sdk

Slack App 생성

크롤러 결과를 전송하기 위해 Slack에 앱을 생성해야 합니다. Slack 워크스페이스의 관리자 권한이 필요합니다. Slack 앱을 생성하고 앱의 OAuth & Permissions 메뉴로 이동하여 Bot Token Scopes를 설정해야 합니다. 최소한 chat:write 스코프는 필요합니다.

코드 작성

이제 아래의 예제 코드를 통해 비동기적으로 웹 크롤러 결과를 Slack으로 전송하는 코드를 작성해보겠습니다.

import asyncio
import aiohttp
from slack_sdk import WebClient

async def send_message_to_slack(message):
    slack_token = "your_slack_bot_token"
    channel_id = "your_slack_channel_id"
    client = WebClient(token=slack_token)
    response = await client.chat_postMessage(channel=channel_id, text=message)
    return response["ok"]

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_send():
    urls = ["https://example.com/page1", "https://example.com/page2", "https://example.com/page3"]
    messages = []

    for url in urls:
        html = await fetch(url)
        message = f"URL: {url}, HTML Length: {len(html)}"
        messages.append(message)

    await send_message_to_slack("\n".join(messages))

asyncio.run(crawl_and_send())

위의 코드에서 send_message_to_slack 함수는 Slack으로 메시지를 전송하는 비동기 함수입니다. slack_tokenchannel_id를 설정하여 Slack 앱의 토큰과 메시지를 전송할 채널 ID를 입력해야 합니다.

fetch 함수는 비동기로 URL을 가져오는 함수이며, crawl_and_send 함수에서는 여러 개의 URL을 순회하면서 크롤링을 수행하고 결과를 Slack으로 전송합니다.

실행하기

위의 코드를 작성한 후에는 아래의 명령어를 사용하여 실행할 수 있습니다.

python web_crawler.py

실행하면 crawl_and_send 함수가 비동기적으로 실행되고, 각 URL의 HTML 길이 정보가 Slack으로 전송됩니다.

이제 aiohttp를 사용하여 비동기적으로 웹 크롤러 결과를 Slack으로 전송하는 방법을 배웠습니다. 이를 응용하여 여러분의 웹 크롤러에 적용해보세요!

참고 자료