크롤링

크롤러는 사전적으로 두가지 의미를 가진다.
1. 기는것
2. 파충류

코드라이언님은 크롤러가 우리대신 기어다니면서 데이터를 모아주는 것이라고 설명을 하셨다.

web crawling
크롤러를 사용해 웹 페이지의 데이터를 추출하는 것

이번시간에는 파이썬을 통해 크롤링을 배워 보기로 하겠다.

requests

터미널에서 pip install requests 입력해서 다운.

import requests

print(requests)

put 요청

requests에는 put,get,post,delete 과 같은 함수들이 있는데, get은
요청을 보내는 기능이다. 햄버거집에서 햄버거와 감자튀김을 요리사님께 요청을 보내고, 요리사님은 요청을 받고, 음식을 보내줍니다. 이와같이
클라이언트가 요청을 하면, 서버가 응답하는 것을 생각하면 get을 이해할 수 있다.

print(response.encoding)
인코딩이 어떻게 되어있는지 -> 다음은 ISO-8859-1

#print(response.headers)

#print(response.json)

#print(response.links)

#print(response.ok)

#print(response.status_code)

등등 많은 함수가 있다.

Beautifulsoup

이미 beautifulsoup을 다운해놨다고 가정했을때, 이건 import할때가 좀 다르다.

from bs4 import BeautifulSoup

이렇게 선언한다.

기본문법

BeautifulSoup (데이터,파싱방법)

print(BeautifulSoup(response.text,'html.parser'))

requests와의 차이점

reponse = requests.get(url)
print(type(response.text))

print(type(BeautifulSoup(response.text, 'html.parser')))

이런식으로 두개의 코드가 있는데, 사실 결과값은 보기에 똑같아 보인다.
그러나 사실 같지 않은데, 이것을 알기 위해 type을 붙혀준 것이다.

결과는 위에는 class 'str' , 아래는 class 'bs4.BeautifulSoup'으로 다른것을 볼 수 있다.

BeautifulSoup (데이터,파싱방법)

그 후, result라는 변수에 a태그중, link_favorsch 클래스를 가진 것만
가져와보도록 하겠다.

print(soup.findAll("a","link_favorsch"))

이렇게하면 실시간검색어만 잘 나오는 것을 볼 수 있다.

실시간 검색어 가져오는 총 코드

'''
from bs4 import BeautifulSoup
import requests
from datetime import datetime

url = "http://www.daum.net/"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
rank = 1

results = soup.findAll('a','link_favorsch')

search_rank_file = open("rankresult.txt","a")

print(datetime.today().strftime("%Y년 %m월 %d일의 실시간 검색어 순위입니다.\n"))

for result in results:
    search_rank_file.write(str(rank)+"위:"+result.get_text()+"\n")
    print(rank,"위 : ",result.get_text(),"\n")
    rank += 1
'''

API


( Application Programming Interface )

API Key 발급받기

https://home.openweathermap.org/api_keys

가입 후 이메일 인증만 해주면, my api key에서 내 api 키를 볼 수 있다.

개개인의 고유성을 위해 문자와 숫자로 구성.

API 링크 만들기

Current Weather Data 를 이용해보도록 하겠음.
API doc을 누르면, 설명서 보기 가능.

import requests

city = "Seoul"
apikey = "################################"
api = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={apikey}"

//여기서 fstring을 써서 city, apikey에 위에서 설정한 값으로 입력넣어줌

result = requests.get(api)
print(result.text)

--

print(type(result.text))

여기서 result의 type은 str임을 알 수있다.

json 이용하기

javascript object notation
데이터를 주고받을때, json포맷으로 받아오는 경우가 많다.이미 위에 받아온 내용도 json형식.

import json

json을 사용할땐 dictionary를 생각하면 된다. 그렇다고 dictionary는 아님
때문에 형식 변환을 해줘야함.

data = json.loads(result.text)

이렇게 해주면 type을 활용해 보았을때, data는 dict형으로 변환된 것을 알 수 있다.

그 후 원하는 것을 뽑을때는 dictionary문법을 이용해서 똑같이 뽑아주면 끝.
data["key값"] 이것만 알면 된다.

-최종 코드 -

import requests
import json

city = "Seoul"
apikey = "################################"
api = f"""http://api.openweathermap.org/data/2.5/\
weather?q={city}&appid={apikey}"""

result = requests.get(api)

# print(result.text)

data = json.loads(result.text)

print(data["name"],"의 날씨입니다.")
print("날씨는 ",data["weather"][0]["description"],"입니다.")
print("현재 온도는 ",data["main"]["temp"],"입니다.")
print("하지만 체감 온도는 ",data["main"]["feels_like"],"입니다.")
print("최저 기온은 ",data["main"]["temp_min"],"입니다.")
print("최고 기온은 ",data["main"]["temp_max"],"입니다.")
print("습도는 ",data["main"]["humidity"],"입니다.")
print("기압은 ",data["main"]["pressure"],"입니다.")
print("풍향은 ",data["wind"]["deg"],"입니다.")
print("풍속은 ",data["wind"]["speed"],"입니다.")

googletrans 라이브러리

언어감지와 번역기능이 있는 googletrans.import를 해주자

from googletrans import Translator

translator = Translator()

sentence = "안녕하세요 코드라이언입니다."
detected = translator.detect(sentence)

print(detected)

import 한 후, sentence에 글을 넣고
detect함수를 이용해주니 출력값으로 lang=ko 를 출력해준다. 한국어를 잘 감지했다.

이번엔 문장을 집적 입력받고, 무슨언어인지 출력해주는 코드를 짜보자.

sentence = input("번역할 문장을 입력하세요\n")
detected = translator.detect(sentence)

print(detected.lang)

translate

이번엔 원하는 언어로 직접 번역을 해주는 것을 해보자.

translator.translate(text,destination,src)

를 이용해주면 된다.
첫번째는 텍스트, 두번째는 목적지(언어) ,src는 인식하는 언어의 종류 (시작지 언어라고 생각하면된다. 구글을 믿고 안써도 된다.)

-최종 코드-

from googletrans import Translator

translator = Translator()

sentence = input("번역을 원하는 문장을 입력해주세요 : ")
dest = input("어떤 언어로 번역을 원하시나요?")

result = translator.translate(sentence,dest)
detected = translator.detect(sentence)

print("===========출 력 결 과===========")
print(detected.lang,":",sentence)
print(result.dest,":",result.text)
print("=================================")

메일 만들기

SMTP
( SIMPLE MAIL TRANSFER PROTOCOL )
간단하게 메일을 보내기위한 약속.

메일을 보낼땐 무조건 smtp를 씀
서버에서 클라한테 보낼땐 IMAP이용. 그 외 서버끼리나 클라에서 서버는 SMTP

SMTP는 3가지 단계만 기억하자.
1. SMTP 메일 서버를 연결한다.
2. SMTP 메일 서버에 로그인한다.
3. SMTP 메일 서버로 메일을 보낸다.

  • 1단계 서버연결 코드 -
import smtplib

SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465

smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)
  • 2단계 서버에 로그인 코드 -
print(smtp.login("###@gmail.com","######"))

3단계 가기전에, MIME에 대해서 이해하고 가자.
SMTP는 한국어를 알아듣지 못한다. 때문에 중간에 MIME형태로 변환을 해주고 보내줘야 한다.

그러기위해선

from email.message import EmailMessage

를 임포트 해주고,

message = EmailMessage()
message.set_content("중중")

message["Subject"] = "메일 제목"
message["From"] = "dafdf@gmail.com"
message["To"] = "sendedman34243@gmail.com"

이렇게 설정해주면 된다.

  • 총 코드
import smtplib
from email.message import EmailMessage

SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 465

message = EmailMessage()
message.set_content("코드라이언 수업중입니다.")

message["Subject"] = "이것은 제목입니다."
message["From"] = "###@gmail.com"
message["To"] = "###@gmail.com"

smtp = smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT)
smtp.login("###@gmail.com","######")
smtp.send_message(message)
smtp.quit()

메일에 사진첨부하기

이미지를 컴퓨터가 읽을 수 있는 바이너리로 변환시키는 것이다.

image = open("codelion.png","rb")
print(image.read())

이 코드를 실행하면 , 바이너리 코드로 바꿔준 것을 볼 수 있다.

with open("codelion.png","rb") as image:
	image_file = image.read()

위 코드 없이 이렇게 작성하면, close없이 안전하게 파일을 열고닫을 수 있다.

본격적으로 첨부하는 방법에 대해 알아보자.

add_attachment(...) 을 이용해서 첨부할 수 있다.

import imghdr //import 해줘야 밑에 imghdr.what 사용가능

image_type = imghdr.what('codelion',image_file)
message.add_attachment(image_file,maintype='image',subtype=image_type)

이렇게 해주면 이미지 첨부가 가능하다.

유효성 검사

reg = "^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$"
print(re.match(reg,"codelion.examplegmailcom"))

이걸 이용해서 함수로 만들어 주도록 하겠다.

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("유효한 이메일 주소가 아닙니다.")

밑에서 나중에 sendEmail(이메일)입력해주면 끝


이로써 5일차 강의가 끝났다. 하루에 1강씩 듣는게 쉽지는 않았지만
생각보다 많이 재미있었고, 유익한 것들을 많이 배울 수 있었다. 감사합니다 코드라이언 :)

profile
TIL 기록

0개의 댓글