본문 바로가기
Back-end/Python

[크롤링] Selenium으로 특가 상품 수집 (5) - Telegram Bot

by 허도치 2020. 2. 3.

2020/01/31 - [Back-end/Python] - [크롤링] Selenium으로 특가 상품 수집 (1) - 프로젝트 준비

2020/01/31 - [Back-end/Python] - [크롤링] Selenium으로 특가 상품 수집 (2) - Selenium 설정

2020/01/31 - [Back-end/Python] - [크롤링] Selenium으로 특가 상품 수집 (3) - 데이터 분석 및 수집

2020/02/02 - [Back-end/Python] - [크롤링] Selenium으로 특가 상품 수집 (4) - 모듈화

 

 

  지난 포스트에서 Selenium을 이용하여 11번가, 티몬, 위메프의 특가상품을 수집하는 크롤러를 만들었다. 그러나, 데이터를 수집할 때 마다 PC에서 Crawler를 실행시켜야해서 불편하고 실용성이 떨어진다. 그래서, 텔레그램 봇을 이용하여 스마트폰에서도 데이터를 수집할 수 있도록 기능을 추가해보려고 한다.

 

텔레그램을 설정하는 방법에 대해서는 다른 포스트에서 다루었으니 참고하기 바란다.

- [Telegram] 무작정 시작하기 (1) - 설치 및 실행

 

 

1. 텔레그램 봇 만들기.

   1-1. 소스 작성.

         - bot.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import crawl
from telegram import ChatAction
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater
from telegram.ext import CommandHandler, CallbackQueryHandler
 
BOT_TOKEN='672768316:AAHXpYmnMzGp_eH0i-juikUFU6q9y78CBhA'
 
updater = Updater( token=BOT_TOKEN, use_context=True )
dispatcher = updater.dispatcher
 
def cmd_crawl(update, context):
    task_buttons = [[
        InlineKeyboardButton( '11번가', callback_data='11st' )
        , InlineKeyboardButton( '티몬', callback_data='tmon' )
        , InlineKeyboardButton( '위메프', callback_data='wemap' )
    ], [
        InlineKeyboardButton( '취소', callback_data='cancle' )
    ]]
    
    reply_markup = InlineKeyboardMarkup( task_buttons )
    
    context.bot.send_message(
        chat_id=update.message.chat_id
        , text='수집 대상을 선택해주세요.'
        , reply_markup=reply_markup
    )
 
def cb_crawl(update, context):
    query = update.callback_query
    target = query.data
        
    if target == 'cancle':
        context.bot.edit_message_text(
            text='작업을 취소하였습니다.'
            , chat_id=query.message.chat_id
            , message_id=query.message.message_id
        )
    else:
        context.bot.edit_message_text(
            text='데이터를 수집중입니다...'
            , chat_id=query.message.chat_id
            , message_id=query.message.message_id
        )
        
        for item in crawl.run( target ):
            print( item )
            context.bot.send_message(
                chat_id=update.effective_chat.id
                , text="상품명: {title}\n가격: {price}원\n{link}".format(title=item["title"], price=item["price"], link=item["link"])
            )
    
        context.bot.edit_message_text(
            text='수집 완료'
            , chat_id=query.message.chat_id
            , message_id=query.message.message_id
        )
    
crawl_handler = CommandHandler('crawl', cmd_crawl)
crawl_cb_handler = CallbackQueryHandler( cb_crawl )
 
dispatcher.add_handler( crawl_handler )
dispatcher.add_handler( crawl_cb_handler )
 
updater.start_polling()
updater.idle()
cs

         - 1 ln: 이전 포스트에서 만든 Crawler를 Import.

         - 2~5 ln: 텔레그렘 봇을 만들 때 필요한 모듈들 Import.

         - 7~10 ln: 텔레그램 봇 설정.

         - 12~27 ln: 채팅방에서 '/crawl' 명령어가 입력되면 실행할 이벤트.

           * 버튼이 포함된 메시지를 봇에서 채팅방으로 전송.

         - 29~57 ln: 사용자가 선택한 버튼 값에 따라 Crawler를 실행하는 콜백 함수.

         - 59~63 ln: Bot에 Handler를 추가.

         - 65~66 ln: Bot이 채팅방의 메시지를 감시.

 

   1-2. 실행.

         > python bot.py

 

   1-3. 실행 결과.

'/crawl' 명령어 입력시 결과 화면.
'티몬' 선택시 결과 화면.
'티몬' 특가 상품 수집 완료 화면.

 

 

2. 마치며.

   - 기존에는 Crawler를 만들고나면 Flask로 웹 페이지를 만들어서 조작했었는데, 텔레그렘 봇을 알고나서부터는 거의 텔레그램 봇을 만들어서 사용하고 있다. 코딩할 것도 적고 디자인도 고민할 필요가 없어서 너무 편하다.

댓글