[python] aiohttp를 사용하여 비동기적으로 웹 크롤러 결과를 Slack으로 알림 보내기

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

Slack으로 알림 보내기 위한 준비하기

  1. Slack 워크스페이스에 로그인합니다.
  2. 원하는 채널에 들어가서 Apps 메뉴로 이동합니다.
  3. Browse App Directory를 클릭하여 앱 검색 페이지로 이동합니다.
  4. 검색 창에 “Incoming Webhooks”를 입력하고 해당 앱을 설치합니다.
  5. 앱을 설치하는 동안 토큰을 생성합니다. 이 토큰은 웹 크롤러가 Slack으로 알림을 보내는 데 사용됩니다.

비동기 웹 크롤러 작성하기

import asyncio
import aiohttp

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

async def crawl(url):
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, url)
        # 크롤링 결과 처리하기

loop = asyncio.get_event_loop()
loop.run_until_complete(crawl("https://example.com"))

위의 코드에서 fetch 함수는 aiohttp를 사용하여 비동기적으로 웹 페이지를 가져오는 역할을 합니다. crawl 함수에서는 크롤링할 URL을 입력받고 fetch 함수를 호출하여 페이지를 가져온 후 결과를 처리하는 로직을 작성합니다.

Slack으로 알림 보내기

import aiohttp
import asyncio

async def send_message(webhook_url, message):
    async with aiohttp.ClientSession() as session:
        async with session.post(webhook_url, json={'text': message}) as _:
            pass

async def crawl(url, webhook_url):
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, url)
        # 크롤링 결과 처리하기
        
        # Slack 알림 보내기
        message = "웹 크롤링 결과: ..."
        await send_message(webhook_url, message)

loop = asyncio.get_event_loop()
loop.run_until_complete(crawl("https://example.com", "SLACK_WEBHOOK_URL"))

send_message 함수는 aiohttp를 사용하여 Slack로 메시지를 전송하는 역할을 합니다. crawl 함수에서 크롤링 결과를 처리한 후, Slack으로 알림을 보내기 위해 send_message 함수를 호출합니다. webhook_url 파라미터는 사전에 생성한 Slack Incoming Webhooks의 토큰을 전달해야 합니다.

이제 웹 크롤러 결과를 Slack으로 알림 보내는 코드를 작성하는 방법을 알게 되었습니다. aiohttp를 사용하면 비동기적으로 여러 웹 요청을 처리할 수 있으므로 크롤링 작업의 효율성을 높일 수 있습니다.

참고 자료