본문 바로가기
멋쟁이사자처럼 AI스쿨

멋쟁이 사자처럼 1주차 회고

by 헬푸밍 2022. 12. 23.

멋쟁이 사자처럼 AI스쿨 첫주차를 마무리하는 시간이다.

이번 주 무엇을 배웠는지 생각하면서 코드 복습을 해봅시다!!

1. 이제 곧 크리스마스다!! 크리스마스 트리를 별찍기로 만들어봅시다~

크리스마스가 며칠 안남았는데여 기념으로 크리스마스 트리를 만들어 볼겁니다.
코드는 이러쿵 저러쿵...
 
n = int(input('크리스마스 트리 사이즈를 입력해주세요(medium : 7, large = 11, ultra = 15) : '))
print('Merry Christmas')
for i in range(1, n+1) :
  print(' '*(n-2),' '*(n-i), '*'*(2*i-1))
for j in range(2, n+3) :
  print(' '*(n-4),' '*(n+2-j), '*'*(2*j-1))
for k in range(3, n+5) :
  print(' '*(n-6),' '*(n+4-k), '*'*(2*k-1))
간단하게 3가지 사이즈를 만들어봤습니다. 저는 소소하게 medium 사이즈로...
 

어떻게 크리스마스 트리같은가요?

 


#2 오늘 날씨가 참 춥군요! 저는 천안에 산답니다. 얼마나 추운지 알아보자구요.

Open API를 통해서 알아봅시다.
먼저 오픈웨더맵 사이트에서 자신의 api key를 발급받아야합니다. 금방 발급받을 수 있을거예요.
저는 수업시간에 배운 것과 같이 https://openweathermap.org/current#name 에서 도시이름으로 날씨 찾기를 해봤습니다.
지금 제가 사는 천안은 눈이 휘날리는 시베리아 날씨인데여 확인을 해봐요!!
https://api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key} <- api는 이렇습니다.
코드는 이렇답니다..

import requests #서버로부터 자료를 받기위해 requests를 import해줍니다.
import json #데이터를 json형식으로 바꾸기위해 import해줍니다.

city = "Cheonan" #현재 천안에 거주중입니다.
apikey = "###############################" #제 api키는 비밀
lang = "kr" #한국어로 출력합니다

api = f"http://api.openweathermap.org/data/2.5/\
weather?q={city}&appid={apikey}&lang={lang}&units=metric" #API에 언어 변환, 단위변환을 추가한 뒤 f스트링을 이용해 변수를 넣어줍니다.

result = requests.get(api) #데이터를 불러옵니다.

print(result.text)
data = json.loads(result.text) #데이터를 json형식으로 바꿔줍니다.

# 복잡한 딕셔너리와 리스트 구조속에서 필요한 데이터를 꺼내줍니다.
# 지역 : name
print(data["name"],"의 날씨입니다.")
# 자세한 날씨 : weather - description
print("날씨는 ",data["weather"][0]["description"],"입니다.")
# 현재 온도 : main - temp
print("현재 온도는 ",data["main"]["temp"],"입니다.")
# 체감 온도 : main - feels_like
print("하지만 체감 온도는 ",data["main"]["feels_like"],"입니다.")
# 최저 기온 : main - temp_min
print("최저 기온은 ",data["main"]["temp_min"],"입니다.")
# 최고 기온 : main - temp_max
print("최고 기온은 ",data["main"]["temp_max"],"입니다.")
# 습도 : main - humidity
print("습도는 ",data["main"]["humidity"],"입니다.")
# 기압 : main - pressure
print("기압은 ",data["main"]["pressure"],"입니다.")
# 풍향 : wind - deg
print("풍향은 ",data["wind"]["deg"],"입니다.")
# 풍속 : wind - speed
print("풍속은 ",data["wind"]["speed"],"입니다.")

 

눈이 오고 추운날씨군요... 엘사의 기분을 느낍니다... 얼른 봄이 오길...


#3 나에게 쓴 편지(파이썬으로 스스로에게 최근에 한 클라이밍 사진을 보내봅시다!!!)

보낼 사진은 이러한데... 절벽을 기어오르는 한 마리의 뚱냥이 같군요...

먼저 이미지 파일을 pc에 저장한 뒤 구글코랩에 파일을 업로드 해줍니다.

그리고 코드를 작성...

import smtplib #smtp라이브러리를 호출합니다.
from email.message import EmailMessage #email.massage모듈에서 EmailMessage기능만을 호출합니다.
import imghdr #이미지의 확장자를 판별하기 위한 모듈
import re #정규표현식 모듈

SMTP_SERVER = "smtp.gmail.com" #사용할 서버
SMTP_PORT = 465 #사용할 포트

def sendEmail(addr):
    reg = "^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$" #이메일의 정규표현식
    if bool(re.match(reg,addr)): #이메일의 유효성 검사
        smtp.send_message(message)
        print("정상적으로 메일이 발송되었습니다.") #이메일이 유효할 경우
    else:
        print("유효한 이메일 주소가 아닙니다.") #이메일이 유호하지 않을 경우

message = EmailMessage()
message.set_content("뚱냥이 사진을 보냅니다.") #이메일 내용

message["Subject"] = "뚱냥이" #제목
message["From"] = "yangh0705@likelion.org" #보내는 사람
message["To"] = "yangh0705@naver.com" #받는 사람

with open("/content/뚱냥이.jpg","rb") as image: #이미지를 열고 자동으로 닫기 위해 with open 사용
    image_file = image.read()

image_type = imghdr.what('/content/뚱냥이.jpg',image_file) #이미지 타입 판별
message.add_attachment(image_file,maintype='image',subtype=image_type) #이미지 첨부와 확장자

smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT) #사용할 서버와 포트
smtp.login("yangh0705@likelion.org","**********") #아이디와 비밀번호 입력

sendEmail("yangh0705@likelion.org") #센드이메일함수로 이메일 호출
smtp.quit() #종료

과연 이메일이 도착할까요...?

잘 받았습니다람지!!!


#4 네이트 실시간 키우드를 알아봅시다!(웹 크롤링)

강의에서 배운 다음과 네이버는 실시간 검색어가 죽었다... B U T
네이트는 아직 실시간 키워드가 살아있었다....

이것을 웹 크롤링으로 출력해 보자!
일단 코드 작성... 영차 영차...

from bs4 import BeautifulSoup #bs4모듈에서 BeautifulSoup기능만 불러오기
import requests #requests모듈 불러오기
from datetime import datetime #현재 시간 불러오기

url = "https://www.nate.com/?f=autorefresh" #네이트 사이트
response = requests.get(url) #데이터 요청
soup = BeautifulSoup(response.text, 'html.parser') #뷰티플수프를 사용해 텍스트정보 불러오기
rank = 1 #순위(1부터 시작)

results_fir = soup.findAll('a') #데이터 너무 많아 일단 a태그만 불러오기
print(results_fir)

results_fin = soup.findAll('a', 'ik')#공통된 ik도 추가해서 불러오기
print(results_fin)

print(datetime.today().strftime("%Y년 %m월 %d일의 실시간 키워드 순위입니다.\n")) #현재 날짜

for result in results_fin:
    print(rank,"위 : ",result.get_text().split('\n')[1],"\n") #부가정보도 같이 나와 리스트형으로 분리후 검색어만 추출
    rank += 1

불러올 데이터가 너무 많아서 results_fir = soup.findAll('a')를 출력해 a태그만 꺼내 오면
대충 이렇게 어지러운데....

실시간 검색어 키워드에서 'ik'가 겹친다... 그리하여 results_fin = soup.findAll('a', 'ik')를 출력해보면

이렇게 실시간 키워드만 나오고
결국 예쁘게 출력 하면 짜짠!

이렇게 나옵니다!!!
근데 1~5위랑 6~10위 페이지가 계속 바뀌어서 어쩔때는 1~5위 저쩔때는 6~10위 가 나오는.... 이것은 해결 못했습니다...

여기까지... 이번 주 배운 것을 복습해봤습니다.

저는 그럼 이만... 다음주에 봐요~

댓글