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

이번 블로그 포스트에서는 aiohttp를 사용하여 비동기적으로 웹 크롤러 결과를 Telegram으로 전송하는 방법에 대해 알아보겠습니다. aiohttp는 Python에서 비동기적인 HTTP 요청을 처리하는 라이브러리로, 크롤링 작업과 Telegram 전송 작업을 효율적으로 수행할 수 있습니다.

1. aiohttp 설치하기

먼저, aiohttp를 설치해야 합니다. 아래 명령을 사용하여 pip를 통해 설치할 수 있습니다.

pip install aiohttp

2. Telegram Bot 생성하기

웹 크롤러의 결과를 Telegram으로 전송하기 위해 Telegram Bot을 생성해야 합니다. Telegram에서 @BotFather를 검색하고, 봇을 생성합니다. 생성한 봇의 토큰을 복사해두세요.

3. 웹 크롤러 코드 작성하기

이제 웹 크롤러 코드를 작성해보겠습니다. 아래 코드는 aiohttp를 사용하여 웹 사이트에서 데이터를 크롤링하는 간단한 예제입니다.

import aiohttp
import asyncio

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

async def crawl_websites(urls):
    async with aiohttp.ClientSession() as session:
        tasks = []
        for url in urls:
            task = asyncio.ensure_future(fetch(session, url))
            tasks.append(task)
        responses = await asyncio.gather(*tasks)
        return responses

urls = ['https://www.example.com', 'https://www.example.org']
result = asyncio.run(crawl_websites(urls))

위 코드에서 crawl_websites 함수는 주어진 URL 목록에서 비동기적으로 데이터를 크롤링합니다. fetch 함수는 aiohttp를 사용하여 각 URL에서 데이터를 가져옵니다. 크롤링한 결과는 responses에 저장되며, 이를 원하는 방식으로 처리할 수 있습니다.

4. Telegram으로 결과 전송하기

이제 웹 크롤러의 결과를 Telegram으로 전송하는 코드를 작성해보겠습니다. 아래 코드는 python-telegram-bot 라이브러리를 사용하여 Telegram으로 메시지를 전송하는 간단한 예제입니다.

from telegram import Bot

def send_message(token, chat_id, message):
    bot = Bot(token=token)
    bot.send_message(chat_id=chat_id, text=message)

token = 'YOUR_TELEGRAM_BOT_TOKEN'
chat_id = 'YOUR_CHAT_ID'
message = 'Web scraping result: {}'.format(result)

send_message(token, chat_id, message)

위 코드에서 send_message 함수는 Telegram Bot의 토큰과 채팅 ID, 메시지를 입력받아 해당 채팅에 메시지를 전송합니다. token은 위에서 생성한 Telegram Bot의 토큰을 사용하고, chat_id는 메시지를 전송할 채팅의 ID입니다. message는 웹 크롤러 결과를 포맷팅한 문자열입니다.

5. 전체 코드 실행하기

이제 모든 코드를 합쳐서 실행해보겠습니다.

import aiohttp
import asyncio
from telegram import Bot

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

async def crawl_websites(urls):
    async with aiohttp.ClientSession() as session:
        tasks = []
        for url in urls:
            task = asyncio.ensure_future(fetch(session, url))
            tasks.append(task)
        responses = await asyncio.gather(*tasks)
        return responses

def send_message(token, chat_id, message):
    bot = Bot(token=token)
    bot.send_message(chat_id=chat_id, text=message)

urls = ['https://www.example.com', 'https://www.example.org']
result = asyncio.run(crawl_websites(urls))

token = 'YOUR_TELEGRAM_BOT_TOKEN'
chat_id = 'YOUR_CHAT_ID'
message = 'Web scraping result: {}'.format(result)

send_message(token, chat_id, message)

위 코드를 실행하면, 해당 URL에서 데이터를 크롤링한 결과가 Telegram으로 전송됩니다.

이렇게 aiohttp를 사용하여 비동기적으로 웹 크롤러 결과를 Telegram으로 전송하는 방법에 대해 알아보았습니다. aiohttp와 python-telegram-bot 라이브러리를 함께 사용하여 효율적인 비동기 작업을 수행할 수 있습니다.

참고 자료