Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
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
Tags
more
Archives
Today
Total
관리 메뉴

사적인 개발자

[Crawling] python, mongoDB(pymongo) 로 특정 키워드 신규 게시물 알림 메일로 발송하기 본문

TIL

[Crawling] python, mongoDB(pymongo) 로 특정 키워드 신규 게시물 알림 메일로 발송하기

DevYeri 2025. 2. 7. 19:45

일단 냅다 던져보는 오늘의 코드

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