파이썬 프로젝트 - Google News

2025. 1. 30. 14:46IT

지난 24시간 동안의 영문 구글 뉴스를 키워드로 검색하고 검색된 뉴스를 챗GPT를 이용하여 한글로 요약한 후, 원문 뉴스와 그 주소를 이메일로 보내주는 서비스를 만들 계획이라고 말씀드렸습니다. 그러면 영문 구글 뉴스를 어떻게 검색하고 어떤 패키지가 있는지 살펴보고 간단하게 영문 구글 뉴스를 검색하는 것에 대해서 살펴보고 넘어가고자 합니다. 

 

016_GoogleNewsCrawling.py

 

패키지 이름은 GoogleNews입니다. pip install 기억하시죠? 터미널 창을 열어 패키지를 먼저 설치 합니다. 터미널에 입력하지 않고 하는 다른 방법도 있습니다. 파이참의 메뉴에서 File → Settings → Project : MyRPA → Python interpreter에서 좌측 상단의 + 버튼을 이용해 패키지를 설치할 수도 있습니다. 각자 편한 방법을 선택하면 됩니다.

 

import가 끝이났다면 GoogleNews() 클래스를 호출하여 새로운 googlenews를 생성해 줍니다. 생성을 할 때에 매개변수 두 개를 넘겨주고 있습니다. 하나는 lang=’en’으로 언어를 영어로 설정을 하였고, period=’1d’로 하루의 기간을 매개변수로 넘기고 있습니다. 즉, 영어 뉴스 하루치로 사전에 설정을 해 놓는 것입니다. 이외에도 지역을 설정할 수 있습니다. region=’US’와 같이 넣는다면 영어 뉴스 하루치인데 미국 내에서 올라온 뉴스만을 가져오게 됩니다. 

 

 googlenews = GoogleNews(lang='en', period='1d')

 

만약에 ‘1d’가 아니라 기간을 설정하고 싶다면 start와 end 날짜를 지정해 줄 수도 있습니다. 예를 들어 2024년 1월 21일에서 1월 22일까지의 뉴스를 검색하고 싶다면 start=’01/21/2024’, end=’01/22/2024’와 같이 시작과 끝 날짜를 정해주면 됩니다.

 

 googlenews.search('RPA solution')

 googlenews.results(sort=True)

 

다음은 search()함수를 이용해서 검색어를 넣습니다. 나중에는 검색어를 GUI 화면에서 lineEdit 위젯으로 받아서 search() 함수에 넣어주면 될 것 같습니다. search() 함수를 호출하면 실제로 검색이 일어납니다. 그리고 검색된 결과는 googlenews라는 변수에 저장이 되게 됩니다. 검색이 완료된 이후에 다음은 옵션으로 결과물을 순서대로 나오게 할 것인지를 정할 수 있습니다. 있어도 되고 없어도 되는 옵션이지만 우리는 날짜 순서대로 정렬을 하도록 results() 함수에 정렬을 할 수 있도록 sort=True를 줍니다.

 

 texts = googlenews.get_texts()

 links = googlenews.get_links()

 

 print(texts)

 print(links)

 print(len(texts))

 

googlenews 변수에서 get_texts() 함수와 get_links() 함수를 이용해서 각각의 정보를 얻어 올 수 있습니다. 이 정보들은 모두 굴비처럼 엮여 있다고 예를 들어 말씀드린 리스트라는 형태로 저장이 되어 있습니다. for 문에서 for text in texts와 같이 썼던 문장이 기억나시나요? 바로 그렇게 출력을 할 수 있는 리스트 형태로 뉴스의 제목은 texts에 뉴스의 주소는 links에 저장이 됩니다. 앞서서 sort=True로 옵션을 주었기 때문에 두 변수에 저장된 값들은 날짜 순으로 정렬이 되어 있습니다. 리스트들을 print() 함수에 넣어서 출력하고 있습니다. 그러면 굴비처럼 엮인 놈들이 ‘[‘와 ‘]’사이에 콤마로 각각 구분되어 나타날 것입니다. 마지막으로 len()이라는 함수에 texts를 넣으면 굴비가 몇마리가 있는지, 즉 texts에 몇개의 결과가 들어있는지를 출력해 줍니다. 이와 같이 len() 함수를 사용한다면 for문의 구성은 for i in range(len(texts))와 같이 사용할 수 있겠습니다. 그럼 len(texts)를 이용한 for문으로 각각 뉴스 제목과 주소를 한 줄에 출력하는 프로그램을 만들어 보도록 합시다. 검색어를 바꿔보고 뉴스의 시작 날짜와 끝 날짜를 변경해 봐도 좋겠습니다.

책에는 소스를 담지 않겠습니다. 여러분께서 직접 해 보시고, 정답은 깃헙에서 소스를 받아 확인하시기 바랍니다.

메일 보내기

"자동으로 이메일을 보내줄 수 있다면 얼마나 좋을까?"라는 생각을 해 보셨나요? 이전 우리가 만들게 될 프로그램 스포를 해 드렸죠. 매일 유용한 정보를 주변사람들에게 보내면 좋겠다는 생각에서 자동으로 이메일을 보내는 프로그램을 생각하게 되었습니다. 아이디어만 있다면 만들지 못할 프로그램은 없다라고 생각을 하고 그런 프로그램 관련 인프라도 잘 갖춰져 있다고 생각합니다. 요즘은 아이디어만 있으면 되는 세상이 아닐까 합니다. 

 

이번에는 이메일을 보내는 프로그램을 만들어 보겠습니다. 실제 프로그램을 하기 전에 사전 지식으로 알고 있어야 할 내용을 먼저 보고 가려고 합니다. 이메일은 어떻게 보낼 수 있을까요? 이메일은 그 나름의 전송 규약이 있습니다. 우리가 편지를 보낼 때, 먼저 편지를 쓰고 보내는 사람 인근의 우체국에서 시작해서 받는 사람이 있는 우체국을 통해서 최종 받는 사람에게 우편물이 배달 되는 것처럼 이메일도 비슷한 방식을 취하게 됩니다. 이메일을 보내는 사람이 스마트 폰이건 개인 컴퓨터에서건 이메일을 작성합니다. 작성된 이메일은 해당 보내는 사람의 이메일 서버로 전송이 되는 것입니다. 네이버 메일을 쓰고 있으면 네이버 메일서버로, 다음 메일을 쓰고 있으면 다음 메일서버, 지메일을 사용하고 있으면 지메일의 메일 서버로 이메일이 전송이 됩니다. 다음은 받는 사람의 이메일 서버로 전송이 되겠죠. 마지막으로 받는 사람이 본인의 메일 서버에 접속해서 메일을 가지고 오는 방식입니다. 메일을 보내는 사람에게서 메일 서버로, 또한 메일 서버간의 통신을 위한 규약이 SMTP, Simple Mail Transfer Protocol, 메일을 받아오는데 사용하는 규약이 POP3, Post Office Protocol 입니다. POP3를 대신해서 사용할 수 있는 프로토콜이 IMAP, Internet Message Access Protocol 입니다. 

그럼 우리가 이메일을 보내는 프로그램을 만들려면 어떻게 하면 될까요? 네! SMTP 규약을 이용해서 우리가 사용하고 있는 이메일 서버로 메일을 전송하기만 하면 됩니다. 그러면 어떤 정보를 SMTP를 통해서 서버로 전달하면 될까요? SMTP로 보내는 이메일 그 자체에도 표준 포맷이 있습니다. 바로 MIME, Multipurpose Internet Mail Extension이라는 것입니다.

 

자! 다음의 소스를 이용해서 메일을 먼저 보내보도록 합시다. 여기서는 네이버 이메일을 사용했습니다. 각 메일마다 다른점이 있을 수 있으니 네이버 메일로 테스트를 해 주시기 바랍니다.

어디 어디를 수정해야 할까요? 먼저 ***로 되어 있는 부분은 여러분들의 네이버 메일 주소에 맞게 그리고 비밀번호도 맞게 수정해 주시기 바랍니다.  받는 사람 이메일 주소도 변경해 주셔야겠죠? 그렇지 않으면 수신 메일을 확인할 수 없을테니까요.

 

015_sendEmail.py

 import smtplib

 from email.mime.text import MIMEText

 from email.mime.multipart import MIMEMultipart

 

 # Set up the connection to the SMTP server

 smtp_server = 'smtp.naver.com'

 smtp_port = 587

 smtp_username = 'ricky***@naver.com'

 smtp_password = '*********'

 smtp_connection = smtplib.SMTP(smtp_server, smtp_port)

 smtp_connection.ehlo()

 smtp_connection.starttls()

 smtp_connection.login(smtp_username, smtp_password)

 

 # Define the email message

 from_email = 'ricky***@naver.com'

 to_email = 'sohyemini@gmail.com'

 subject = 'Test HTML email'

 

 html_body = """

 <html>

 <body>

 <h1>This is a test HTML email sent using Python!</h1>

 <p>You can use HTML tags to format your message.</p>

 </body>

 </html>

 """

 

 message = MIMEMultipart()

 message['From'] = from_email

 message['To'] = to_email

 message['Subject'] = subject

 message.attach(MIMEText(html_body, 'html'))

 

 # Send the email

 smtp_connection.sendmail(from_email, to_email, message.as_string())

 

 # Close the connection to the SMTP server

 smtp_connection.quit()

 

준비가 되었다면 실행을 시켜 봅니다. 먼저 메일 수신함을 열어 메일이 도착했는지를 확인하고요. 네이버 이메일로 보냈으니 네이버에 접속을 해서 보낸 편지함에 보낸 메일이 들어있는지도 확인합니다. 모두 확인이 되었다면 우리가 만든 코드가 정상 동작을 하는 것입니다. 다음 메일이나 지메일도 되는지 테스트 해 보실 수 있을 것 같네요. 안된다면 검색을 통해서 어떤 점이 다른지 확인해 보는 것도 좋은 방법입니다.

 

 import smtplib

 from email.mime.text import MIMEText

 from email.mime.multipart import MIMEMultipart

 

import 구문은 총 세 줄로 되어있고 실제 import는 smtplib과 email.mime입니다. smtplib은 이미 살펴본 바와 같이 smtp 프로토콜에 대한 내용입니다. lib은 라이브러리라는 의미로 사용됩니다. 따라서 smtp 패키지 또는 라이브러리라는 의미가 되는 것입니다. 그 다음은 MIME를 사용하기 위한 import죠. MIME는 Multipurpose Internet Mail Extensions의 약자로 전자우편, 이메일을 위한 인터넷 표준 포맷입니다. 

처음으로 알았습니다. pip로 두 개의 패키지를 설치를 해 보려고 했습니다만 설치할 수 없었습니다. 이유는 파이썬에서 기본 내장하고 있는 패키지였기 때문이다. 그러므로 설치를 할 수 없었다.

 

 # Set up the connection to the SMTP server

 smtp_server = 'smtp.naver.com'

 smtp_port = 587

 smtp_username = 'ricky***@naver.com'

 smtp_password = '*********'

 smtp_connection = smtplib.SMTP(smtp_server, smtp_port)

 smtp_connection.ehlo()

 smtp_connection.starttls()

 smtp_connection.login(smtp_username, smtp_password)

 

smtp는 서버간에 전송하는 규약이라고 했습니다. 따라서 규약에 맞게 필요한 정보들을 채워줍니다. Naver 메일을 사용할 것이므로 Naver의 smtp 주소를 넣어줍니다. 네이버의 smtp 서버의 주소는 smtp.naver.com입니다. 인터넷에서는 주소와 함께 포트 번호를 사용합니다. 왜냐하면 주소는 하나인데 사용해야할 용도가 너무나도 많기 때문입니다. 그래서 포트를 나눠서 사용합니다. Naver의 smtp 서버의 포트 번호는 587입니다. 각 smtp 마다 포트 번호가 다르기 때문에 검색을 해서 확인을 하셔야 합니다. 다음은 이메일 주소와 비밀번호를 넣어줍니다. 제 개인 이메일 주소와 비밀번호가 있어서 ***로 표기를 했습니다. 여러분께서는 테스트하실 이메일 주소와 비밀번호를 정확하게 입력하셔야 합니다. 

다음은 SMTP를 위한 커넥션을 만드는데 smtplib.SMTP() 함수에 smtp 주소와 포트 번호를 넘겨줍니다. 다음엔 커넥션에서 ehlo() 함수를 호출해서 실제적으로 SMTP 클라이언트와 서버가 연결이 된다고 합니다.  다음은 starttls()함수입니다. starttls가 하나의 단어가 아니고 start + tls입니다. tls은 인터넷 보안 프로토콜의 하나로 smtp 연결시 보안 연결을 의미하는 것입니다. 그리고 마지막으로 id와 password를 이용하여 로그인을 합니다. 

 

 # Define the email message

 from_email = 'ricky***@naver.com'

 to_email = 'sohyemini@gmail.com'

 subject = 'Test HTML email' 

 

 html_body = """

 <html>

 <body>

 <h1>This is a test HTML email sent using Python!</h1>

 <p>You can use HTML tags to format your message.</p>

 </body>

 </html>

 """

 

from_email에서 subject까지는 나중에 메시지에 들어갈 정보이고, html_body는 이메일의 본문입니다. 이메일의 본문에 html으로 넣으면 좀 더 다양한 표현이 가능하기 때문입니다.

 

 message = MIMEMultipart()

 message['From'] = from_email

 message['To'] = to_email

 message['Subject'] = subject

 message.attach(MIMEText(html_body, 'html'))

 

이메일 메시지에 대한 정보를 갖게 될 MIMEMultipart()를 선언해서 message에 담고 보내는 사람, 받는 사람, 제목 및 이메일 본문을 각각 추가합니다. 그리고 MIMEText를 이용해서 html 타입의 메일 본문을 추가합니다. 이로서 이메이을 보내기 위한 모든 준비가 끝이 났습니다.

 

 # Send the email

 smtp_connection.sendmail(from_email, to_email, message.as_string())

 

 # Close the connection to the SMTP server

 smtp_connection.quit()

 

sendmail() 함수를 이용해서 메일을 보내고, smtp 서버의 연결을 끊습니다.

 

이메일 서버에 따라서, 그리고 서버 설정이 어떻게 되어 있느냐에 따라서 약간씩 보내는 방식이 다릅니다. 대표적으로 gmail의 경우에는 설정을 해야 할 내용도 상당히 많습니다. 보안이 강력하기 때문입니다. 필요하다면 인터넷 검색을 해서 차근차근 따라해 보시기 바랍니다.



반응형

'IT' 카테고리의 다른 글

파이썬 - 화면 캡춰하기  (0) 2025.01.30
파이썬 - 마우스와 키보드  (0) 2025.01.30
파이썬 - 웹 크롤링  (0) 2025.01.30
깃헙 - GitHub  (0) 2025.01.30
챗GPT를 이용하자! + 파이썬 프로그래밍 기초  (1) 2025.01.30