사적인 개발자
[Crawling] python, mongoDB(pymongo) 로 특정 키워드 신규 게시물 알림 메일로 발송하기 본문
일단 냅다 던져보는 오늘의 코드
import requests
from bs4 import BeautifulSoup
import smtplib
from email.mime.text import MIMEText
import schedule
import time
from pymongo import MongoClient
import pprint
# 몽고DB 연결
client = MongoClient('mongodb+srv://id:pwd.d7did.mongodb.net/?retryWrites=true&w=majority&appName=cluster')
db = client.db
# Dictionary set
doc = {
'doc_no' : '2975',
'keyword' : '페이백',
'site' : '사이트명'
}
# db insert
# db.crawling_payback.insert_one(doc)
# db select
# pprint.pprint(db.crawling.find_one()) #{'_id': ObjectId('67a5c6db'), 'age': 36, 'name': '닌자'}
# age = db.crawling.find_one({}, {"age":1, "_id":0})
# print(age["age"]) #36
# 이메일 설정
SMTP_SERVER = 'smtp.gmail.com'
# SMTP_PORT = 587
EMAIL_ADDRESS = 'send@gmail.com'
EMAIL_PASSWORD = 'abcd efgh ijkl mnop'
ALERT_EMAIL = 'get@gmail.com'
KEYWORD = '페이백'
def sendEmail(subject, message_list):
try:
# 리스트를 문자열로 변환
message = "\n".join(message_list)
emailMessage = MIMEText(message, 'plain', 'utf-8')
emailMessage['Subject'] = subject
emailMessage['From'] = EMAIL_ADDRESS
emailMessage['To'] = ALERT_EMAIL
with smtplib.SMTP(SMTP_SERVER) as server :
server.starttls()
server.login(user=EMAIL_ADDRESS, password=EMAIL_PASSWORD)
server.sendmail(
from_addr=EMAIL_ADDRESS,
to_addrs=ALERT_EMAIL,
msg= emailMessage.as_string()
)
print(f"알림 이메일 전송 완료: {subject}")
except Exception as e:
print(f"이메일 전송 실패: {e}")
def crawlPayback():
BASE_URL = "https://gall.dcinside.com/mgallery/board/lists"
# 헤더 설정
headers = [
{'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36'}
]
no = 0
message = []
# DB 최신 문서 넘버 불러오기
doc_no_raw = db.crawling_payback.find_one({}, {"doc_no":1, "_id":0})
doc_no_db = 0
if int(doc_no_raw["doc_no"]) > 0 :
doc_no_db = doc_no_raw["doc_no"]
insert_db_flag = False
# page 설정
for i in range(1, 10):
# 파라미터 설정
params = {'id' : 'category_id', 'page' : i, 's_type':'search_subject_memo', 's_keyword' : '페이백'}
response = requests.get(BASE_URL, params=params, headers=headers[0])
soup = BeautifulSoup(response.content, 'html.parser')
article_list = soup.find('tbody').find_all('tr')
# 한 페이지에 있는 모든 게시물 긁어옴
for tr_item in article_list:
doc_no = tr_item.find('td', class_='gall_num')
doc_no_now = doc_no.text
# 새 게시글이라면
if int(doc_no_now) > int(doc_no_db) :
# 가장 최신글 DB 업데이트
if(insert_db_flag == False) :
# db update
db.crawling_payback.update_one({"keyword" : "페이백"}, {"$set":{"doc_no":doc_no_now}})
insert_db_flag = True
# 메세지에 저장
title_tag = tr_item.find('a', href=True)
title = title_tag.text
link = title_tag['href']
message.append(f"{no}. 제목 : {title}\n링크 : {link}\n\n")
# print("제목: ", title)
# print("주소: ", link)
no+=1
if(message != []) :
sendEmail(f"[알림] 페이백 게시글", message)
else :
print(time.strftime('%x %X'), "새 게시물 없음")
#10분마다 실행
schedule.every(10).minutes.do(crawlPayback)
if __name__ == "__main__":
print("크롤링 시작 ............................................................ ")
crawlPayback()
while True:
schedule.run_pending()
time.sleep(1)
실행결과 :
아름다운 터미널
크롤링 시작 ............................................................
02/07/25 18:24:24 새 게시물 없음
02/07/25 18:34:24 새 게시물 없음
아름다운 이메일

기능은 특정 사이트에서 키워드 검색이 포함된 url을 10분단위로 크롤링하여
신규 게시물이 발행되면 제목과 링크가 내 메일로 알림 오게끔 하는 코드다.
모니터링은 해야겠는데, 매번 들어가긴 귀찮고 해서 만들어지게되었는데
처음으로 파이썬으로 만들어보았다. 파이썬 자체를 이 컴에선 처음깔았음 ㅋㅋㅋㅋㅋ
아니군데 파이썬으로 코드짜는거 왤케 편하냐;
최신게시물 넘버를 저장해놓을 DB가 필요해서, 몽고DB도 클러스터 생성해서(예전에 spring과 연계하려고 생성해놨다가 제대로 못쓰고 사장시켰었음) 연결하는데
와 pymongo 연결하는것도 왤케 간단하냐 미쳤냐고요;
사실 위에 코드도 이것저것 공부하면서 쓴 코드들 안지워서 그렇지(나중에,,제가 보려구요,,,ㅋㅎㅎ)
차떼고 포떼고 하면 무척 간단하다.
어쨌든 크롤링을 하려면
1. 크롤링 하려는 사이트에서 html 구조 중 어디서부터 어디까지를 가져올건지 범위를 정한다. 타겟 데이터를 특정하는게 좋음
2. 여러 툴을 사용해서(저는 beautiful soup 아름다운스프를 사용했습니다) 뭐 설치하라면 하고.. 해서
3. 1에서 가져오고자 마음먹은 데이터를 잘 가져와서 프린트를 하던, 나처럼 메일로 보내던 한다.
끗!!!
ref :
https://zladnrms.tistory.com/164
https://velog.io/@jewon119/01.MongoDB-%EA%B8%B0%EC%B4%88-Pymongo-%EC%A0%95%EB%A6%AC-1
https://velog.io/@jewon119/01.MongoDB-%EA%B8%B0%EC%B4%88-pymongo-%EB%8B%A4%EB%A3%A8%EA%B8%B02
'TIL' 카테고리의 다른 글
[git] 로컬 폴더와 github repository 연결, commit하기 (0) | 2025.02.19 |
---|---|
[Linux] alias 등록 (0) | 2025.02.14 |
[Cache] Cache 전략(read, write) (0) | 2025.02.04 |
[Linux] egrep 문 or, and 조건 (1) | 2025.02.03 |
[Server] Web-server, WAS, L4/L7 정리 (0) | 2025.01.23 |