본문 바로가기
Coding

[스파르타코딩클럽] WEB 개발 종합반 - 3주차 개발일지

by 준아이덴티티 2022. 12. 3.
SMALL

 

 

 

 

웹개발 종합반 3주차 종료!

다시 개발일지를 쓸 시간이다.

 

 


 

 

 

🌷수업 목표

  1. 파이썬 기초 문법을 안다.
  2. 원하는 페이지를 크롤링 할 수 있다.
  3. pymongo를 통해 mongoDB를 제어할 수 있다.

 

 

 


 

 

 

  이번 주차 수업을 위해 Python과 Git bash를 준비해뒀다. 드디어 'Python'에 대해 배웠다. 문법을 연습하고, 라이브러리를 활용해 네이버 영화목록을 쫙 가져와보는 식.

 

 


 

 

🍩Python

 

  파이썬을 설치한다는 것은 무얼 의미할까? 일종의 번역팩을 설치한다고 생각하면 된다. 컴퓨터는 101010001과 같은 언어만 알아듣는다. 때문에 파이썬 문법으로 된 것을 101010001로 변환해 줄 수 있도록, 번역 패키지를 설치하는 것.

 

 

프로젝트를 만드는 것으로 시작

 

 

print('Hello, sparta')

hello.py 파일 안에 위 내용을 붙여넣고, 마우스 우클릭 '실행'해보자.

 

 

  파이썬 문법을 시작하기 앞서, 파이썬은 매우 직관적인 언어이고, 할 수 있는 것도 많다고. 그런데 개발자들도 모든 문법을 기억하기란 쉽지 않으며 배운 것 외에 필요한 것들은 구글링해서 찾아보면 된다.

 

 

 


 

 

파이썬 기초🔧

 

 

1. 변수 & 기본 연산

 

a = 3      # 3을 a에 넣는다
b = a      # a를 b에 넣는다
a = a + 1  # a+1을 다시 a에 넣는다

num1 = a*b # a*b의 값을 num1이라는 변수에 넣는다
num2 = 99 # 99의 값을 num2이라는 변수에 넣는다

# 변수의 이름은 마음대로 지을 수 있음!
# 진짜 "마음대로" 짓는 게 좋을까? var1, var2 이렇게?

 

 

2. 자료형

 

 

  ① 숫자, 문자형

 

name = 'bob' # 변수에는 문자열이 들어갈 수도 있고,
num = 12 # 숫자가 들어갈 수도 있고,

is_number = True # True 또는 False -> "Boolean"형이 들어갈 수도 있습니다.

#########
# 그리고 List, Dictionary 도 들어갈 수도 있죠. 그게 뭔지는 아래에서!

 

 

  ② 리스트형(자바스크립트의 배열형과 동일)

 

a_list = []
a_list.append(1)     # 리스트에 값을 넣는다
a_list.append([2,3]) # 리스트에 [2,3]이라는 리스트를 다시 넣는다

# a_list의 값은? [1,[2,3]]
# a_list[0]의 값은? 1
# a_list[1]의 값은? [2,3]
# a_list[1][0]의 값은? 2

 

 

  ③ 딕셔너리형(자바스크립트의 딕셔너리형과 동일)

 

a_dict = {}
a_dict = {'name':'bob','age':21}
a_dict['height'] = 178

# a_dict의 값은? {'name':'bob','age':21, 'height':178}
# a_dict['name']의 값은? 'bob'
# a_dict['age']의 값은? 21
# a_dict['height']의 값은? 178

 

 

  ④ 딕셔너리형과 리스트형의 조합

 

people = [{'name':'bob','age':20},{'name':'carry','age':38}]

# people[0]['name']의 값은? 'bob'
# people[1]['name']의 값은? 'carry'

person = {'name':'john','age':7}
people.append(person)

# people의 값은? [{'name':'bob','age':20},{'name':'carry','age':38},{'name':'john','age':7}]
# people[2]['name']의 값은? 'john'

 

 

3. 함수

 

 

  · 함수의 정의 - 이름은 마음대로 정할 수 있다.

 

# 수학문제에서
f(x) = 2*x+3
y = f(2)
y의 값은? 7

# 참고: 자바스크립트에서는
function f(x) {
	return 2*x+3
}

# 파이썬에서
def f(x):
	return 2*x+3

y = f(2)
y의 값은? 7

 

 

  · 함수의 응용

 

def sum_all(a,b,c):
	return a+b+c

def mul(a,b):
	return a*b

result = sum_all(1,2,3) + mul(10,10)

# result라는 변수의 값은?

 

 

 


 

 

 🍭 파이썬 기초문법

 

 

1. 조건문

 

 

  · if/ else로 구성

def oddeven(num):  # oddeven이라는 이름의 함수를 정의한다. num을 변수로 받는다.
	if num % 2 == 0: # num을 2로 나눈 나머지가 0이면
		 return True   # True (참)을 반환한다.
	else:            # 아니면,
		 return False  # False (거짓)을 반환한다.

result = oddeven(20)
# result의 값은 무엇일까요?
def is_adult(age):
	if age > 20:
		print('성인입니다')    # 조건이 참이면 성인입니다를 출력
	else:
		print('청소년이에요')  # 조건이 거짓이면 청소년이에요를 출력

is_adult(30)
# 무엇이 출력될까요?

 

 

2. 반복문 : 리스트의 요소들을 하나씩 꺼내쓰는 형태

 

 

  · 무조건 리스트와 함께 쓰임

fruits = ['사과','배','감','귤']

for fruit in fruits:
	print(fruit)

# 사과, 배, 감, 귤 하나씩 꺼내어 찍힙니다.

 

  · 과일 수 세기 함수(응용)

fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']

count = 0
for fruit in fruits:
	if fruit == '사과':
		count += 1

print(count)

# 사과의 갯수를 세어 보여줍니다.
def count_fruits(target):
	count = 0
	for fruit in fruits:
		if fruit == target:
			count += 1
	return count

subak_count = count_fruits('수박')
print(subak_count) #수박의 갯수

gam_count = count_fruits('감')
print(gam_count) #감의 갯수

 

  ·  딕셔너리 예제

people = [{'name': 'bob', 'age': 20}, 
          {'name': 'carry', 'age': 38},
          {'name': 'john', 'age': 7},
          {'name': 'smith', 'age': 17},
          {'name': 'ben', 'age': 27}]

# 모든 사람의 이름과 나이를 출력해봅시다.
for person in people:
    print(person['name'], person['age'])


# 이번엔, 반복문과 조건문을 응용한 함수를 만들어봅시다.
# 이름을 받으면, age를 리턴해주는 함수
def get_age(myname):
    for person in people:
        if person['name'] == myname:
            return person['age']
    return '해당하는 이름이 없습니다'


print(get_age('bob'))
print(get_age('kay'))

 

 


 

 

파이썬 패키지 설치

 

  파이썬에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위다. 이런 패키지의 묶음을 '라이브러리'라고 볼 수 있다. 즉, 여기서 외부 라이브러리를 사용하기 위해 패키지를 설치한다.

 

  가상환경(virtual environment)이란 프로젝트별로 패키지들을 담을 공구함을 의미한다. 가령 회사에서는 패키지 A, B, C를 설치해서 쓰고 개인 프로젝트에선 패키지 B, C, D, E를 설치해서 쓰고 있었다고 치자.

  그런데 회사 팀장님이 B를 이전버전인 B'로 쓰자고 한다. 그렇게되면 같은 PC에 깔려있는 개인프로젝트에서는 B'로 쓰면 코드를 다 바꿔야한다.

 

  이럴 때 다 담아둘 필요없이 공구함을 2개 만들어 공구함1에 A, B', C를 담고 공구함2에 B, C, D, E를 담아서 쓰면 관리하기 편하다. 그래서, '가상환경'이라는 개념의 프로젝트별 공구함이 등장한 것이다.

 

  정리하자면, 가상환경(virtual environment)은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기위해, 파이썬 배포 패키지들을 설치 및 업그레이드하는 것을 가능하게 하는 '격리된 실행환경'인 것.

 

 

 


 

 

  PIP(python install package)를 사용해 requests 패키지를 설치해보자. 앱을 설치할 때 앱스토어/ 플레이스토어를 가듯이 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 PIP를 이용하게 된다.

 

프로젝트 인터프리터 화면에서 +버튼 클릭.

 

 

requests를 검색.

 

 


 

 

 

웹 스크래핑(크롤링) 기초🎄

 

 

· 패키지 추가 설치(beautifulsoup4)

 

bs4

 

 

· 크롤링 기본 세팅

 

import requests
from bs4 import BeautifulSoup

# 타겟 URL을 읽어서 HTML를 받아오고,
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')

#############################
# (입맛에 맞게 코딩)
#############################

 

 

· select/ select_one의 사용(영화 제목을 가져와보자)

 

 

태그 안의 텍스트를 찍고싶을 땐 → 태그.text

태그 안의 속성을 찍고싶을 땐 → 태그['속성']

 

 

import requests
from bs4 import BeautifulSoup

# URL을 읽어서 HTML를 받아오고,
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
soup = BeautifulSoup(data.text, 'html.parser')

# select를 이용해서, tr들을 불러오기
movies = soup.select('#old_content > table > tbody > tr')

# movies (tr들) 의 반복문을 돌리기
for movie in movies:
    # movie 안에 a 가 있으면,
    a_tag = movie.select_one('td.title > div > a')
    if a_tag is not None:
        # a의 text를 찍어본다.
        print (a_tag.text)

 

 

 

· beautifulsoup 내 select에 미리 정의된 다른 방법을 알아보자.

 

# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')

# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')

 

· 항상 정확하지는 않으나, 크롬 개발자 도구를 참고할 수 있다.

 

원하는 부분에서 마우스 우클릭 → 검사

원하는 태그에서 마우스 우클릭

Copy → Copy selector로 선택자를 복사 가능

 

 

 

 


 

 

🐣 DB(Database)

 

  교보문고에 가서 책을 찾는다. 꽂혀진 방법대로 찾아야 쉽게 찾을 수 있을 것이다. 섹션, 출판사, 책 제목 순으로 우리 눈에 보이진 않지만 사실 DB에는 Index라는 순서로 데이터들이 정렬되어있다.

 

  DB에는 두가지 종류가 있다. 첫번째로 RDBMS(SQL)은 행/ 열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사하다. 정형화된만큼 데이터의 일관성이나 분석에 용이할 수 있다. 예를 들어 MS-SQL, My-SQL 등이 있다.

 

  두번째로 No-SQL은 딕셔너리 형태로 데이터를 저장해두는 DB다. 데이터 하나 하나마다 같은 값들을 가질 필요가 없다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족. 그 예로는 MongoDB가 있다.

 

 

  이렇듯, DB는 특별한 PC가 아닌 아주 간단하게 우리가 쓰는 프로그램과 같은 것이다. 내 PC에 게임도 설치하고 PPT도 설치하고 DB도 설치하듯 말이다. 그런데 이마저도 요새는 Cloud 형태로 제공해주는 곳들이 많다. 그 이유는 유저가 몰리거나 DB를 백업해야하거나 모니터링하기가 아주 용이하기 때문.

 

 


 

 

 

🐥 MongoDB - pymongo로 DB조작하기

 

 

· DB연결 및 데이터 삽입

 

# 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
db.users.insert_one({'name':'bobby','age':21})
db.users.insert_one({'name':'kay','age':27})
db.users.insert_one({'name':'john','age':30})

 

 

· 모든 결과값 보기

 

# 모든 데이터 뽑아보기
all_users = list(db.users.find({},{'_id':False}))

print(all_users[0])         # 0번째 결과값을 보기
print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기

for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
    print(user)

 

 

· 특정 결과값 뽑기

 

user = db.users.find_one({'name':'bobby'})
print(user)

 

 

· 수정

 

# 오타가 많으니 이 줄을 복사해서 씁시다!
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

user = db.users.find_one({'name':'bobby'})
print(user)

 

 

· 삭제

 

db.users.delete_one({'name':'bobby'})

user = db.users.find_one({'name':'bobby'})
print(user)

 

 

· pymongo사용법 코드요약

 

# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))

# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기 - 예시
db.users.delete_one({'name':'bobby'})

 

 

 


 

 

 

☁ 3주차 숙제 : 지니뮤직의 1 ~ 50위 곡을 스크래핑해보자

 

 

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for tr in trs:
    title = tr.select_one('td.info > a.title.ellipsis').text.strip()
    rank = tr.select_one('td.number').text[0:2].strip()
    artist = tr.select_one('td.info > a.artist.ellipsis').text
    print(rank, title, artist)

 

 

 


 

 

🍪 끝으로...

 

  파이썬을 배우게되니 웹 개발에 한 걸음 더 다가갈 수 있는 유익한 시간이었고 한번보고 마는 게 아니라 여러 번 복습하는 습관을 더욱 더 들여야겠다고 느꼈다.

 

 

 

LIST