Python Telegram 봇 활용[인프런]

dev-jjun·2021년 9월 16일
0

WEB

목록 보기
2/2
post-thumbnail

CGV 페이지를 분석하고 크롤링하여 예매 알림 여부를 Telegram 봇으로 받는 프로그램의 코드를 작성했다. 인프런 '파이썬으로 영화 예매 오픈 알리미 만들기' 강의를 들으며 학습한 내용이고, 이를 바탕으로 우리 동네의 영화관에 적용해 보았다.

영화 상영 시간 페이지

CGV 사이트의 웹 페이지를 크롤링하기 위해 먼저 구조를 분석해보자.
예매 오픈 알림 여부에 필요 없는 메인 카테고리, 로고, 로그인 등 원하지 않는 정보가 너무 많다. 이를 어떻게 하면 제외하고 필요한 태그만 골라낼 수 있을까?

CGV 페이지는 페이지 안에 다른 페이지를 저장하는 iframe 방식을 사용해서 카테고리와 같은 일정 부분은 반복되도록, 그 안의 내용을 다르게 한다. 필요한 정보는 내부 페이지에 있으므로 그 페이지의 주소만 따로 코드에 저장할 것이다.

<'div'> cols-content 클래스 내에서 <'iframe'> 태그의 source를 복사하여 www.cgv.co.kr/ 뒤에 붙여넣어 주면 상영 시간표만 존재하는 페이지로 이동할 수 있다.

* 메가박스나 롯데시네마에서는 이러한 iframe의 source를 찾을 수 없었다. XPath나 selector copy 또는 패키지의 함수를 이용해 태그로 해당 정보에 접근하는 방식을 이용해야 한다.

소스코드(웹 크롤링 기본 구조)

다음은 select_one, select함수를 이용해 태그에 접근하는 방식의 소스코드이다. select 함수에 '원하는태그.태그명'을 넣으면 해당 태그의 정보를 가져올 수 있다.
*.text만 붙이면 태그 내의 요소만을 가져올 수 있다.

import requests
from bs4 import BeautifulSoup
  
url = '크롤링 하고자 하는 페이지의 주소'
html = requests.get(url)
soup = BeautifulSoup(html.text, 'html.parser'   # 한 번에 soup = BeautifulSoup(ur.urlopen(url).read(), 'html.parser') 로 쓰는 방법도 있음
print(soup.select_one(태그에 들어있는 정보; 원하는 태그의 selector copy))  # html에서 태그에 대한 정보 요청[css문법]

특정 상영관이 오픈되었는지 확인하고, 그 영화의 제목을 출력하기 위해서는 상영관을 감싸고 있는 태그와 영화의 제목들을 가리키는 태그에 대한 정보가 필요하다.

<영화 제목 가져오기; 각 영화에 대한 부모 클래스 >
class=col-times -> class=movie-info -> <.a>태그 -> <.strong> 태그

우리의 목표는 gold class 상영관이 오픈된 영화의 제목들만 모으는 것이다.

그러기 위해서는, 조건문으로 'gold'에 대한 태그가 있으면 요소를 받아오고, 없으면 아직 오픈되지 않은 것으로 판단부모 클래스로 올라가 movie-info에서 제목 받아오는 과정을 거쳐야 한다.

#제목만 수집
print(soup.select_one('body > div > div.sect-showtimes > ul > li:nth-child(1) > div > div.info-movie > a > strong')

title_list = soup.select('div.info-movie')  # 반복문 구현 ver.
for i in title_list:
	print(i.select_one('a > strong').text.strip())
    
# gold 상영관 오픈 여부에 따라 조건문 설정
gold = soup.select_one('span.gold')   
    if(gold):
        gold = gold.find_parent('div', {"class":"col-times"})
        title = gold.select_one('div.info-movie > a > strong').text.strip()
        print(title + ' GOLD 예매가 열렸습니다.')
    else:
		print('GOLD 예매가 아직 열리지 않았습니다.')

텔레그램 봇 사용하기

telegram bot을 사용하는 이유

가장 간단하게 구축할 수 있고, 알리미에서 필요한 선톡 기능을 내장하고 있어 여러 사용자가 이용할 수 있도록 쉽게 만들 수 있기 때문이다. 다른 채팅 봇은 구축 절차가 복잡하기 때문에 간단한 telegram을 활용하는 것으로 한다.

스마트폰에 '텔레그램'을 설치하고 BotFather에 다음과 같은 메시지를 보내면 새로운 봇을 생성하고, 봇의 http api에 접근할 수 있는 token 키를 얻을 수 있다.

import telegram

bot = telegram.Bot(token='부여된 키 값')

for i in bot.getUpdates():
	print(i.message)

위 코드를 실행하면 채팅 내용에 대한 정보가 나오면서 텔레그램 id 값을 알 수 있고, 이를 이용해 원하는 메시지를 보낼 수 있다.

bot.sendMessage(chat_id = 'ID 값', text = '보내고자 하는 내용')

APScheduler

Python 파일 실행 시에만 알림을 보내는 한계를 극복하고 알리미의 기능에 맞게 지속적으로 알림 보내기 기능을 구축하기 위해 APScheduler를 사용한다. 이는 실행하다가 설정한 기준에 따라 중간에 정지시키는 기능이 있고, 시간차를 두고 알림을 보내는 등의 기능을 가지고 있어 구현하고자 하는 알리미 프로그램에 적합하다.

from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()
sched.add_job(job_function, 'interval', seconds=30)
sched.start()

#정지하고자 하는 부분에서 sched.pause()를 쓴다. 

끝에 aws 서버에 구축하는 과정까지는 하지 못했지만, 정상적으로 gold class 상영관의 영화가 오픈되었을 때 텔레그램 채팅으로 영화의 제목과 오픈 알림이 함께 전송되는 결과물을 얻을 수 있었다.

profile
서버 개발자를 꿈꾸며 성장하는 쭌입니다 😽

0개의 댓글