ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 🚀스케쥴 라이브러리를 이용한 크롤링(첨부)파일 자동전송 🚀
    파이썬 2021. 11. 4. 02:04
    728x90

    💢크롤링한 파일 스케쥴링을 통한 자동화메일 발송

    ➰대략적 흐름

    1.파일 크롤링-> 2. dataset폴더에 저장 -> 3. 저장된 첨부파일 자동메일발송 구현 -> 4. 원하는 시간에 작동할 수 있도록 scheduler 사용

    대부분의 설명등을 코드 안에 주석안에 되어있음을 참고하시기 바랍니다.

    ➰크롤링 코드

    import csv, requests
    import pandas as pd
    import time
    
    def covid_crawling():
        # 날짜/지역/확진자누적/사망자누적/격리해제누적
        CSV_URL = 'http://raw.githubusercontent.com/jooeungen/coronaboard_kr/master/kr_regional_daily.csv'
    
        # 확진, 사망, 격리해제
        yesterday_data = {}
        yesterday_data['서울'] = [0, 0, 0]
        yesterday_data['부산'] = [0, 0, 0]
        yesterday_data['대구'] = [0, 0, 0]
        yesterday_data['인천'] = [0, 0, 0]
        yesterday_data['광주'] = [0, 0, 0]
        yesterday_data['대전'] = [0, 0, 0]
        yesterday_data['울산'] = [0, 0, 0]
        yesterday_data['세종'] = [0, 0, 0]
        yesterday_data['경기'] = [0, 0, 0]
        yesterday_data['강원'] = [0, 0, 0]
        yesterday_data['충북'] = [0, 0, 0]
        yesterday_data['충남'] = [0, 0, 0]
        yesterday_data['전북'] = [0, 0, 0]
        yesterday_data['전남'] = [0, 0, 0]
        yesterday_data['경북'] = [0, 0, 0]
        yesterday_data['경남'] = [0, 0, 0]
        yesterday_data['제주'] = [0, 0, 0]
        yesterday_data['검역'] = [0, 0, 0]
    
        flag = False
        csv_data = []
    
        with requests.Session() as s:
            download = s.get(CSV_URL)
            decoded_content = download.content.decode('utf-8')
            cr = csv.reader(decoded_content.splitlines(), delimiter=',')
            my_list = list(cr)
            for row in my_list:
                if row[0] == 'date':
                    continue
    
                # 다음부터 과거 데이터의 차이만 다시 저장
                row[2] = int(row[2]) - int(yesterday_data[row[1]][0])
                row[3] = int(row[3]) - int(yesterday_data[row[1]][1])
                row[4] = int(row[4]) - int(yesterday_data[row[1]][2])
    
                # 누적 데이터 저장
                yesterday_data[row[1]][0] += row[2]
                yesterday_data[row[1]][1] += row[3]
                yesterday_data[row[1]][2] += row[4]
    
                csv_data.append(row)
    
        df = pd.DataFrame(csv_data)
    
        # 
        file_date = time.strftime('%Y-%m-%d', time.localtime(time.time()))
        # file_name = 'C:/02.ElasticStack/0.dataset/covid19_ko_' + time.strftime('%Y-%m-%d', time.localtime(time.time())) + '.csv'
        file_name = 'C:/02.ElasticStack/0.dataset/covid19_ko_' + file_date + '.csv'
        df.to_csv(file_name, index=False, header=False, encoding='utf8')
    
        return file_date

    ➰자동 첨부파일 메일전송화

    from email.mime.base import MIMEBase
    from email.mime.multipart import MIMEMultipart
    import smtplib
    from email.mime.text import MIMEText
    import time
    from email import encoders
    
    
    def send_mail():
        # id = input('메일을 보낼 계정을 입력해 주세요: ')
        # password = input('계정 비밀번호를 입력해 주세요: ')
    
        # 메일 내용을 담을 문자열을 선언합니다.
        text = f'{"크롤링한 파일입니다."}'
    
        # smtp 인스턴스를 만들어줍니다.
        # 인자값으로는 smtp 서버 url과 port가 들어갑니다.
        # 해당 메일 계정에서 smtp 설정 필요
        # smtp = smtplib.SMTP('smtp.gmail.com', 587)
        smtp = smtplib.SMTP('smtp.naver.com', 587)
    
    
        # 초기에 서버와 handshaking 을 시도합니다.
        smtp.ehlo()
        # TLS를 이용해서 암호화할 것이므로 start tls 함수를 호출합니다.
        smtp.starttls()
    
        # smtp 서버 로그인을 위해 id 와 password를 인자로 하여 login 함수를 호출합니다.
        # id는 @가 들어간 email형식으로 입력합니다.
        # smtp.login(id, password)
        smtp.login('wlaud5314@naver.com', 'wlaud!!5314')
    
        # MIMEText 인스턴스에는 보내려는 메일 내용을 인자값으로 넣어줍니다.
        message = MIMEMultipart()
    
        # 메일 제목은 Subject, 보내는 사람은 From, 받을 사람 정보는 To로 설정합니다.
        message['Subject'] = "최신정보입니다."
        message['From'] = "wlaud5314@naver.com"
        message['To'] = "wlaud5314@naver.com"
        message.attach(MIMEText('오늘자 covid19 데이터가 크롤링 되었습니다.', 'plain'))
        # smtp sendmail 함수를 이용하여 실제로 메일을 발송해줍니다.
        # smtp.sendmail(message['From'], message['To'].split(','), message.as_string())
    
        file_name = 'covid19_ko_' + time.strftime('%Y-%m-%d', time.localtime(time.time())) + '.csv'
        file_date = time.strftime('%Y-%m-%d', time.localtime(time.time()))
        # file_name = 'C:/02.ElasticStack/0.dataset/covid19_ko_' + time.strftime('%Y-%m-%d', time.localtime(time.time())) + '.csv'
        path = 'C:/02.ElasticStack/0.dataset/covid19_ko_' + file_date + '.csv'
    
        attachment = open(path, 'rb')
        part = MIMEBase('application', 'octet-stream')
        part.set_payload((attachment).read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', "attachment; filename=" + file_name)
        message.attach(part)
        smtp.sendmail('wlaud5314@naver.com', 'wlaud5314@naver.com', message.as_string())
    
        # smtp quit 함수로 인스턴스를 종료시킵니다.
        smtp.quit()
        print('발송 완료')

    ➰자동메일 스케쥴화

    import schedule
    import time
    from covid19_crawling import covid_crawling as covid
    from automail import send_mail
    
    def covid_schedule():
        file_date = covid()
        subject = f'covid19-{file_date} 크롤링 완료'
        send_mail()
        print('covid_schedule 동작완료')
    
    
    
    # 매일 8시 스케줄 등록
    schedule.every().day.at("08:00").do(covid_schedule)
    
    # 스케줄 테스트용 (10초 마다 스케줄 실행)
    # schedule.every(10).seconds.do(covid_schedule)
    
    if __name__ == '__main__':
        while True:
            schedule.run_pending()
            time.sleep(1)

    댓글

Designed by Tistory.