728x90
반응형

사용할 코드
파이썬 구글 날씨 검색기(크롤러)를 만들기 : 모듈화와 핵심 팁
모듈 설치 요청 및 응답 등의 통신을 위한 requests 모듈을 설치합니다. pip install requests (crawling_blog) PS C:\Users\Desktop\pyqt\Example\begin_for_blog\2> pip install requests Collecting requests..
jvvp.tistory.com
지난 포스팅에 사용한 코드를 가지고 왔습니다.
코드보기
import datetime
import requests
from bs4 import BeautifulSoup as bs
class GoogleWeather():
url = 'https://www.google.com/search?q={}&rlz=1C1EJFA_enKR770KR770&oq=%EC%86%A1%ED%8C%8C%EA%B5%AC+%EB%82%A0%EC%94%A8&aqs=chrome..69i57.2835j0j8&sourceid=chrome&ie=UTF-8'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
result = []
def __init__(self, keyword=None):
self.keyword = keyword
def set_keyword(self, keyword):
self.keyword = keyword
def run(self):
res = requests.get(self.url.format(self.keyword), headers=self.headers)
self.parse_html(res.text)
return res
def parse_html(self, text):
html = bs(text, 'html.parser')
loc = html.find('div', {'id': 'wob_loc'})
loc = loc.string if loc else loc
time = html.find('div', {'id': 'wob_dts'})
time = time.string if time else time
status = html.find('span', {'id': 'wob_dc'})
status = status.string if status else status
now = datetime.datetime.now().replace(microsecond=0)
self.result.append({
'search_time': str(now),
'loc': loc,
'time': time,
'status': status
})
def get_result(self):
if self.result:
return self.result[-1]
else:
return None
if __name__ == '__main__':
crawler = GoogleWeather()
while True:
k = input('지역명 >> ')
crawler.set_keyword(k + ' 날씨')
crawler.run()
r = crawler.get_result()
for v in r.values(): print(v)
print('-'*50)
파이썬 텔레그램 봇 만들기 -2 : 패키지 설치 및 에코봇 구현하기
telegram.ext.Updater — Python Telegram Bot 12.8 documentation The update queue that can be filled from the main thread. python-telegram-bot.readthedocs.io 파이썬 텔레그램 봇 만들기 -1 : API 토큰 발..
jvvp.tistory.com
간단하게 에코봇 만드는 것도 했었죠.
코드보기
from telegram.ext import Updater, MessageHandler, Filters
def get_message(bot, update):
chat_id = bot.message.chat.id
msg = bot.message.text
update.bot.send_message(chat_id, msg)
if __name__ == '__main__':
token = '1305621209:AAHmugmzbjB1T7KcZmYe5nPuDEdk-MMdSSg'
updater = Updater(token, use_context=True)
message_handler = MessageHandler(Filters.text, get_message)
updater.dispatcher.add_handler(message_handler)
updater.start_polling()
updater.idle()
구글 날씨 검색기(크롤러)와 연동
다음과 같이 메시지를 처리하시면 되겠습니다.
1. /start 메시지 처리 -> 안내
2. 크롤러 수행
1) 크롤러 정상적인 응답 -> 응답 데이터 전달
2) 비정상적인 응답 -> 안내
같은 내용이어서 다른 포스팅의 사진을 가져왔습니다.

크롤러의 결과 데이터가 None 이면 지역명을 다시 입력하라고 전달합니다.

전체 코드
from telegram.ext import Updater, MessageHandler, Filters
from crawler import *
def get_message(bot, update):
chat_id = bot.message.chat.id
msg = bot.message.text
if msg == '/start':
update.bot.send_message(chat_id, '날씨를 알려드립니다.')
update.bot.send_message(chat_id, '지역명을 입력하세요.')
return
crawler.set_keyword(msg + ' 날씨')
crawler.run()
r = crawler.get_result()
print(r)
if r and r['loc']:
send_msg = []
for k, v in r.items():
if k == 'loc':
send_msg.append(f'지역명 : {v}')
elif k == 'time':
send_msg.append(f'시간대 : {v}')
elif k == 'status':
send_msg.append(f'날씨 : {v}')
update.bot.send_message(chat_id, '\n'.join(send_msg))
else:
update.bot.send_message(chat_id, '검색 결과가 없습니다.')
update.bot.send_message(chat_id, '지역명을 입력하세요.')
if __name__ == '__main__':
crawler = GoogleWeather()
token = 'Input your token'
updater = Updater(token, use_context=True)
message_handler = MessageHandler(Filters.text, get_message)
updater.dispatcher.add_handler(message_handler)
updater.start_polling()
updater.idle()
반응형