파이썬으로 클리앙 알뜰구매 크롤링 하(려해보)기
코드 열어보기 (잘못된 코드라 닫아둠)
# -*- coding: UTf-8 -*-
import requests
from bs4 import BeautifulSoup
from slacker import Slacker
import telegram
import os
import schedule
import time
import datetime
DEV_MODE = False
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
targetURL = 'https://www.clien.net/service/group/community' if DEV_MODE else 'https://www.clien.net/service/board/jirum'
slackToken = '--SLACK TOKEN--'
slack = Slacker(slackToken)
slackChannel = '#test'
bot = telegram.Bot(token='--TELEGRAM TOKEN--')
chat_id = bot.getUpdates()[-1].message.chat.id
def msgSlack(msg):
slack.chat.post_message(slackChannel, msg)
print('Success - send to Slack')
def msgTelegram(msg):
bot.sendMessage(chat_id=chat_id, text=msg)
print('Success - send to Telegram')
def sendMsg(msg):
msgSlack(msg)
msgTelegram(msg)
def main():
req = requests.get(targetURL)
req.encoding = 'utf-8'
html = req.text
soup = BeautifulSoup(html, 'html.parser')
posts = soup.select('.symph_row .timestamp' if DEV_MODE else '.contents_jirum .timestamp')
postMeta = soup.select('.symph_row .list_subject' if DEV_MODE else '.contents_jirum .list_subject')
latest = posts[0].text
with open(os.path.join(BASE_DIR, 'latest.txt'), 'r') as f_read:
before = f_read.readline()
f_read.close()
if before != latest:
i = 0
while before != posts[i].text:
beforeTime = datetime.datetime.strptime(before, "%Y-%m-%d %H:%M:%S") if before != '' else False
postTime = datetime.datetime.strptime(posts[i].text, "%Y-%m-%d %H:%M:%S")
if beforeTime != False and beforeTime > postTime:
print('마지막 글이 삭제된 것으로 추정')
break
subject = postMeta[i].select('.subject_fixed')[0].text if DEV_MODE else postMeta[i].select('a')[0].text
link = postMeta[i].get('href') if DEV_MODE else postMeta[i].select('a')[0].get('href')
sendMsg(subject +' https://clien.net'+ link)
i = i + 1
if i > 10:
print('새 글이 10건 이상 발생')
sendMsg('등 10건 이상으로 마지막 기록된 글이 삭제됐을 가능성이 높습니다. 직접 방문을 권합니다. ' + targetURL)
break
with open(os.path.join(BASE_DIR, 'latest.txt'), 'w+') as f_write:
f_write.write(latest)
f_write.close()
else:
print('No update but I\'m working...')
main()
schedule.every().seconds.do(main)
while 1:
schedule.run_pending()
time.sleep(60 if DEV_MODE else 600)
이렇게 사용하는 것이 정상이라고 보기는 어렵다고 판단되어 익숙한 node.js 형태로 바꿨다. request 디펜던시 하나로 세상 편안!! 제대로된 코드라 볼 수 없지만 파이썬은 잘 안쓰니까 혹시 나중에 필요할까 싶어 기록 차원으로 남겨둠..
참고했던 URL
- https://beomi.github.io/gb-crawling/posts/2017-04-20-HowToMakeWebCrawler-Notice-with-Telegram.html
- https://corikachu.github.io/articles/python/python-slack-bot-slacker
참고하려던 URL
추가
지금은 node.js로 만들어놓은 것도 더이상 사용하지 않고 남이 잘 만들어놓은 텔레그램봇 그냥 쓰고 있다.