본문 바로가기
Programming/Python

19. 외부 모듈(Beautiful Soup, Flask 모듈)

by IT learning 2021. 3. 24.
728x90

오늘은 파이썬이 기본적으로 제공해 주는 것이 아닌, 다른 사람들이 만들어 배포하는 모듈을 공부하겠다.

상당히 재밌다. 요번거 공부하는데 시간이 너무 빨리 흘러서 좀 힘들었다 ㅎㅎ ㅋㅋ;

 

외부 모듈

세상에는 다양한 파이썬 책들이 존재한다.

이렇게 기본적으로 가르쳐 주는 파이썬 책도 있고. 사이킷-런, 텐서플로우, 장고, 플라스크, 넘파이 등등의 이름을 달고 나온 책들도 있다.

이것들은 다 외부 모듈에 관해 쓰여진 책이다.

 

이번에 살펴볼 외부 모듈은 Beautiful Soup 과 Flask 모듈이다.

이 두 모듈을 진짜 딥하게 공부하려고 책을 사려면 이 두 모듈만으로도 책 한권이 나온다고 한다.

하지만? 우리는 기초적인 지식을 쌓기가 주 목적이니, 간단하게 사용하는 방법만 알아보자.

 

모듈 설치하기

외부 모듈 설치법은 간단하다.

윈도우의 경우 cmd(명령 프롬프트) 창을 열고,

pip install 모듈 이름

위 처럼 설치하면 된다.

 

하지만, 사지방에서 공부하는 나는 윈도우 cmd창을 키지 못한다. 따라서 구름 IDE 를 사용중에 있다.

구름 IDE 가 뭔지 모른다면?(광고 아니다;)

2021.03.07 - [Programming/Python] - 2. 구름IDE로 파이썬 환경 구축하기 + Github 연동하기

 

2. 구름IDE로 파이썬 환경 구축하기 + Github 연동하기

이번에는 내가 자주사용하는 온라인IDE인 '구름IDE'로 파이썬 환경을 구축하는 방법에 대해 소개하겠다. 서론따윈 없고 바로 본론으로 들어간다. **** 주의할 점 : 깃허브 연동까지 생각한다면, 이

itlearning.tistory.com

따라서 구름 IDE에 설치를 진행했다.

 

위 모듈 중 beautiful Soup 를 설치해보자.

pip install beautifulsoup4

를 입력하자.

위 코드의 실행결과이다.

필자는 이미 설치가 되어있어서 저런 결과가 나왔다.

설치가 정상적으로 진행되는거라면 상태바 뜨고 뭐 주르륵 지나간다.

 

BeautifulSoup 모듈

BeautifulSoup 은 광장히 유명한 파이썬 웹 페이지 분석 모듈이다.

이 모듈을 사용하여 간단한 프로그램을 작성해보자.

from urllib import request
from bs4 import BeautifulSoup

# urlopen() 함수로 기상청의 전국 날씨를 읽습니다.
target = request.urlopen("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")

# BeautifulSoup을 사용해 웹 페이지를 분석합니다.
soup = BeautifulSoup(target, "html.parser")

# location 태그를 찾습니다.
for location in soup.select("location"):
    # 내부의 city, wf, tmn, tmx 태그를 찾아 출력합니다.
    print("도시:", location.select_one("city").string)
    print("날씨:", location.select_one("wf").string)
    print("최저기온:", location.select_one("tmn").string)
    print("최고기온:", location.select_one("tmx").string)
    print()

위 코드를 살펴보자.

첫 줄에는 우리가 전 시간에 배운 표준 모듈에 해당하는 urllib를 불러왔다.

두번째 줄에는 우리가 방금 설치한 BeautifulSoup모듈이다.

위 코드는 기상청의 전국 날씨 정보를 html로 읽어와, 해당하는 태그를 찾아 출력하는 프로그램이다.

bs4 모듈의 BeautifulSoup 함수의 매개변수로 HTML 문자열과 "html.parser" 문자열을 넣으면 BeautifulSoup이라는 특수한 객체를 리턴한다.

 

이를 기반으로 태그를 여러개 선택할 때는 select() 함수, 하나만 선택할 때는 select_one() 함수를 사용해서 원하는 값을 추출한다.

위 코드의 실행결과이다.

코드의 실행결과로 도시의 이름이 나오고, 날씨 등등이 소개된다.

이렇게 웹 페이지의 정보를 수집할 수 있다.

 

Flask 모듈

일반적으로 파이썬으로 웹 개발을 할 때는 Django(장고) 또는 Flask(플라스크) 등의 모듈을 사용한다.

Django매우 다양한 기능을 제공하는 웹 개발 프레임워크이고, Flask는 작은 기능만을 제공하는 웹 개발 프레임워크이다.

 

우리는 일단 Flask 로 맛만 보자.

 

Flask 도 설치방법은 동일하다.

 

설치 후 사용해보자.

# flask 모듈 사용하기
from flask import Flask
app = Flask(__name__)

@app.route("/") # 데코레이터
def hello():
    return "<h1>Hello World!</h1>"

# 하.. 서버가 열리긴 하는데, 또또또또또또 사지방이라 막힘..

위 코드를 살펴보자.

@app.route() 라고 되어있는 부분은 데코레이터라고 부른다. 이건 조금 있다가 보자.

 

이렇게 하고 실행을 해야하는데, Flask는 코드를 실행하는 방법이 특이하다.

터미널이나 cmd, 혹은 각자의 IDE 터미널에서 이 코드를 입력하자.

set FLASK_APP=파일이름.py
flask run

한번에 입력하는게 아닌 한 줄, 한 줄 이다.

 

혹시 리눅스나 맥 사용자라면, 다음과 같이 입력해야 한다.

export FLASK_APP=파일이름.py
flask run

이렇게 입력하면

위 코드의 실행결과이다.

이렇게 화면이 뜬다.

 

??? : 아니 뭐가 된거 맞음? 아무것도 안뜨잖아요.

 

Running on 이후에 있는 주소로 들어가보자.

 

들어가면 Hello World! 라고 반겨주는 웹 서버가 나온다.

 

하지만, 필자는 지금 사이버 지식 정보방(싸지방)이라 외부 IP 접속이 불가해 들어갈 수가 없다..ㅠ

아무튼 이렇게 돌아간다는 것만 알아두자.

 

Flask 모듈은 @app.route(경로)처럼 '<경로>에 들어갈 때 실행할 함수'를 지정하는 형태로 사용한다.

이때 함수에서 리턴하는 문자열을 기반으로 HTML 파일을 웹 브라우저에 제공해 준다. 

 

 

<경로>에 들어갈 때마다 함수가 실행되므로, 이전에 만들었던 BeautifulSoup 스크레이핑을 실행하는 코드를 만들어보자.

# BeautifulSoup 스크레이핑 실행하기
from flask import Flask
from urllib import request
from bs4 import BeautifulSoup

app = Flask(__name__)
@app.route("/")

def hello():
    # 기상청 정보 스크레이핑
    target = request.urlopen("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")
    
    soup = BeautifulSoup(target, "html.parser")
    
    output = ""
    for location in soup.select("location"):
        output += "<h3>{}</h3>".format(location.select_one("city").string)
        output += "날씨: {}<br/>".format(location.select_one("wf").string)
        output += "최저/최고 기온: {}/{}".format(location.select_one("tmn").string, location.select_one("tmx").string)
        output += "<hr/>"
    return output

위 코드를 보자.

아까 사용한 모듈과 합쳐서 사용하면, 우리가 봤던 정보들이 웹 서버에 저장이 되어 올라간다.

 

아쉽게도 이것도 서버만 열리고 접속이 안된다..ㅠㅠㅠㅠㅠㅠㅠㅠ

 

라이브러리와 프레임워크

모듈을 살펴보면 라이브러리와 프레임워크라는 말을 많이 듣는다.

최근에는 큰 구분 없이 사용하는데, 그래도 확실히 구분하면 제어 역전 여부에 따라서 달라진다.

구분 설명
라이브러리 정상적인 제어를 하는 모듈
프레임워크 제어 역전이 발생하는 모듈

 

라이브러리

제어 역전이란 쉽게 말해 제어가 역전되어 있다라는 뜻이다.

일단 역전되지 않은 정상적인 제어가 뭔지 알아보자.

# time 모듈
import time

print("지금부터 5초 동안 정지합니다!")
time.sleep(5)
print("프로그램을 종료합니다.")

이 모듈은 전 시간에 봤던 표준 모듈에 해당하는 time 모듈이다.

time 모듈은 모듈 내부의 기능을 '개발자'가 직접 호출했다.

이처럼 개발자가 모듈의 기능을 호출하는 형태의 모듈라이브러리 라고 한다.

 

 

프레임워크

아까 살펴본 Flask 모듈은 다음과 같이 코드를 작성했다.

# flask 모듈 사용하기
from flask import Flask
app = Flask(__name__)

@app.route("/") # 데코레이터
def hello():
    return "<h1>Hello World!</h1>"

# 하.. 서버가 열리긴 하는데, 또또또또또또 사지방이라 막힘..

그런데 코드를 보면 내부에 함수만 정의 했지, 직접적으로 뭔가를 진행하는 코드는 단 하나도 없다.

그리고 출력결과를 보면

위 코드의 실행결과이다.

이것도 우리가 출력했던 적이 없다. 그러면 이건 어디서 출력이 된건가..?

바로 Flask 모듈 내부이다. 우리가 작성한 코드를 직접 실행하지 않았다.

Flask 모듈이 제공하는 명령어를 실행하면 Flask가 내부적으로 서버를 실행한 뒤 지정한 파일을 읽어 들여 적절한 상황에 스스로 실행하게 된다.

이처럼 모듈이 개발자가 작성한 코드를 실행하는 형태의 모듈을 프레임워크 라고 부른다.

이게 제어역전이다. 개발자가 만든 함수를 모듈이 실행하는 형태 말이다.

 

함수 데코레이터

파이썬에는 데코레이터라는 기능이 있다. 

아까 Flask 모듈 코드에서 봤을텐데, @로 시작하는 구문을 파이썬에서는 데코레이터라고 부른다.

 

데코레이터는 만드는 방법에 따라 크게 함수 데코레이터클래스 데코레이터로 나눌 수 있다.

우리는 일단 함수 데코레이터에 대해서 알아보겠다.

 

함수 데코레이터의 기본

함수 데코레이터는 함수에 사용되는 데코레이터이다.

이 말은 대상 함수의 앞뒤에 꾸밀 부가적인 내용을, 혹은 반복할 내용을 데코레이터로 정의해서 손쉽게 사용할 수 있도록 한 것을 말한다.

아래 코드를 보자.

# 함수 데코레이터의 기본
def test(function):
    def wrapper():
        print("인사가 시작되었습니다.")
        function()
        print("인사가 종료되었습니다.")
    return wrapper
    

# 데코레이터를 붙여 함수를 만듭니다.
@test
def hello():
    print("hello")

    
hello()

test 함수에서 wrapper() 함수를 리턴하므로, 최종적으로 hello에 함수가 들어가 hello() 형태로 호출할 수 있다.

hello = test(hello)

위와 같은 기능을 사용하는게 데코레이터이다.

 

어우 하면서도 복잡하니, 이건 나중에 다른 외부 모듈을 사용할때 자연스레 사용할 테니 그때 더 공부하자.

 

etc..

# COVID-19 한국 일일 확진자 표

from urllib import request
from bs4 import BeautifulSoup

target = request.urlopen("http://ncov.mohw.go.kr/")

soup = BeautifulSoup(target, "html.parser")

nums = []
circles = []
dates = []
before_list = []
today_list = []

for item in soup.select("div.liveNum_today_new"):
    for data in item.select("span.data"):
        today_list.append(data.string)

for item in soup.select("div.chart_d"):
    for data in item.select("span.num_rnum"):
        circles.append(data.string)

for item in soup.select("div.liveNum"):
    for data in item.select("span.num"):
        nums.append(data.string)
        
for item in soup.select("div.liveNum"):
    for data in item.select("span.before"):
        before_list.append(data.string)

for stem in soup.select("div.liveNumOuter"):
    for data in stem.select("span.livedate"):
        dates.append(data.string)
        

print("\tCOVID-19 한국 상황도")
print()
print("환자 현황", dates[0])
print("\t일일확진자")
print("국내발생 {} | 해외유입 {}".format(today_list[0], today_list[1]))
print()
print("확진환자:",circles[1] + "", before_list[0])
print("격리해제:", nums[1] +"\t ", before_list[1])
print("치료 중: ", nums[2] + "\t\t ", before_list[2])
print("사망:    ", nums[3] + "\t\t ", before_list[3])

 

제대로 알고 했으면 저렇게 길게 나오지 않을텐데..

위에서 배운 코드들을 바탕으로 코로나 확진 표를 만들어보았다.

위 코드의 실행결과이다.

위 코드는 실시간으로 업데이트 되고, 위에서 배운 모듈들을 사용한 것이다.

 

아직 부족하지만, 더 열심히 해보자.

정리
외부 모듈
은 파이썬이 기본적으로 제공하지 않는, 다른 사람들이 만들어 제공하는 모듈을 의미한다.
pip install은 외부 모듈을 설치할 때 사용하는 명령어이다.
제어 역전은 개발자가 모듈의 함수를 호출하는 것이 일반적인 제어 흐름이나, 이와 반대로 개발자가 만든 함수를 모듈이 실행하는 것을 말한다.
라이브러리는 개발자가 모듈의 기능을 호출하는 형태와 같이 정상적인 제어를 하는 모듈이다.
프레임워크는 모듈이 개발자가 작성한 코드를 실행하는 형태의 모듈이다.
728x90

'Programming > Python' 카테고리의 다른 글

21. 클래스  (0) 2021.03.26
20. 모듈 만들기  (0) 2021.03.25
18. 표준 모듈  (0) 2021.03.23
17. 예외 고급  (0) 2021.03.22
16. 구문 오류와 예외  (0) 2021.03.21

댓글

IT_learning's Commit