스파르타코딩클럽 웹개발 종합반 3-1 ~ 3-14

JaeSung Lee·2022년 10월 25일
0

국비스파르타코딩

목록 보기
5/7

3주차 시작이 되었다.
3주차는 파이썬과 mongoDB를 배운다.
자 그럼 배운것을 써보겠다!

Python 기초

- 1) 변수 & 기본연산
    
    ```python
    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) 자료형
    - 숫자, 문자형
        
        ```python
        name = 'bob' # 변수에는 문자열이 들어갈 수도 있고,
        num = 12 # 숫자가 들어갈 수도 있고,
        
        is_number = True # True 또는 False -> "Boolean"형이 들어갈 수도 있습니다.
        
        #########
        # 그리고 List, Dictionary 도 들어갈 수도 있죠. 그게 뭔지는 아래에서!
        ```
        
    - 리스트 형 (Javascript의 배열형과 동일)
        
        ```python
        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
        ```
        
    - Dictionary 형 (Javascript의 dictionary형과 동일)
        
        ```python
        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
        ```
        
    - Dictionary 형과 List형의 조합
        
        ```python
        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) 함수
    - 함수의 정의 - 이름은 마음대로 정할 수 있음!
        
        ```python
        # 수학문제에서
        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
        ```
        
    - 함수의 응용
        
        ```python
        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라는 변수의 값은?
        ```
        

파이썬 기초공부 2

- 1) 조건문
    - if / else 로 구성!
        
        ```python
        def oddeven(num):  # oddeven이라는 이름의 함수를 정의한다. num을 변수로 받는다.
        	if num % 2 == 0: # num을 2로 나눈 나머지가 0이면
        		 return True   # True (참)을 반환한다.
        	else:            # 아니면,
        		 return False  # False (거짓)을 반환한다.
        
        result = oddeven(20)
        # result의 값은 무엇일까요?
        ```
        
        ```python
        def is_adult(age):
        	if age > 20:
        		print('성인입니다')    # 조건이 참이면 성인입니다를 출력
        	else:
        		print('청소년이에요')  # 조건이 거짓이면 청소년이에요를 출력
        
        is_adult(30)
        # 무엇이 출력될까요?
        ```
        
- 2) 반복문
    
    
    👉 파이썬에서의 반복문은, 리스트의 요소들을 하나씩 꺼내쓰는 형태입니다.
    
    
    
    - 4즉, 무조건 리스트와 함께 쓰입니다!
        
        ```python
        fruits = ['사과','배','감','귤']
        
        for fruit in fruits:
        	print(fruit)
        
        # 사과, 배, 감, 귤 하나씩 꺼내어 찍힙니다.
        ```
        
    - 살짝 응용해볼까요? - 과일 갯수 세기 함수
        - **[코드스니펫] 리스트 예제**
        
        - 1) 조건문
    - if / else 로 구성!
        
        ```python
        def oddeven(num):  # oddeven이라는 이름의 함수를 정의한다. num을 변수로 받는다.
        	if num % 2 == 0: # num을 2로 나눈 나머지가 0이면
        		 return True   # True (참)을 반환한다.
        	else:            # 아니면,
        		 return False  # False (거짓)을 반환한다.
        
        result = oddeven(20)
        # result의 값은 무엇일까요?
        ```
        
        ```python
        def is_adult(age):
        	if age > 20:
        		print('성인입니다')    # 조건이 참이면 성인입니다를 출력
        	else:
        		print('청소년이에요')  # 조건이 거짓이면 청소년이에요를 출력
        
        is_adult(30)
        # 무엇이 출력될까요?
        ```
        

Python 패키지 사용 및 웹스크래핑(크롤링)

- 1) 파이썬 패키지(package) 설치하기
    
    
    👉 패키지? 라이브러리? → 
    Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다. 
    
    즉, 여기서는 **패키지 설치 = 외부 라이브러리 설치**!
    
    
    
    - 1. 가상 환경(virtual environment) 이란?  - 프로젝트별로 패키지들을 담을 공구함
        
        
        📌 **문제상황:**
        회사에서는 패키지 A, B, C를 설치해서 쓰고,
        개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.
        
        그런데 회사팀장님이 B를 이전 버전인 `B'` 로 쓰자고 하시네요.
        그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 `B'`로 쓰면 코드를 다 바꿔야 해요 😭
        
        어떻게 하면 좋을까요?
        
       
        💡 **해결책:**
        다 담아둘 필요 없이 공구함을 2개 만들어서,
        
        공구함1에 A, B', C를 담아두고,
        공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠?
        
        그래서, 가상환경이라는 개념이 등장했습니다.
        즉, **프로젝트별 공구함** 이에요.
        
        
        👉 정리하자면, 
        
        **가상환경(virtual environment)**은
        같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 **격리된 실행 환경** 입니다.
        
        출처 : [파이썬 공식 용어집- 가상환경](https://docs.python.org/ko/3/glossary.html#term-virtual-environment)
        
        
        
    - 2. pip(python install package) 사용 - requests 패키지 설치해보기
        
        
        👉 앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip 를 이용하게 됩니다.
        
        
        
        - project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜹니다!
            
            ![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8e26aac2-d3fc-4884-bd74-c775ba25b94a/Untitled.png)
            
        - requests를 검색하기!
            
            ![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2d350c75-c473-4407-9e71-717ffce511bd/Untitled.png)
            

## **07. 패키지 사용해보기**

- 1) Requests 라이브러리 사용해보기 + List/Dictionary/함수/If/For문 연습
    - 아래 방법으로 서울시 대기 OpenAPI에서, 중구의 미세먼지 값을 가져올 수 있습니다.
        - **[코드스니펫] requests 써보기**
            
            ```python
            import requests # requests 라이브러리 설치 필요
            
            r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
            rjson = r.json()
            ```
            
    - 모든 구의 IDEX_MVL 값을 찍어주자!
        
        ```python
        import requests # requests 라이브러리 설치 필요
        
        r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
        rjson = r.json()
        
        gus = rjson['RealtimeCityAir']['row']
        
        for gu in gus:
        	print(gu['MSRSTE_NM'], gu['IDEX_MVL'])
        ```
        
    - IDEX_MVL 값이 60 미만인 구만 찍어주자!
        
        
        👉 들여쓰기가 얼마나 중요한지 다시한번 확인해보세요!
        
        
        
        ```python
        import requests # requests 라이브러리 설치 필요
        
        r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
        rjson = r.json()
        
        gus = rjson['RealtimeCityAir']['row']
        
        for gu in gus:
        	if gu['IDEX_MVL'] < 60:
        		print (gu['MSRSTE_NM'], gu['IDEX_MVL'])
        ```
        

##



- ) 웹스크래핑 해보기 (영화 제목)
    - 어떤 걸 스크래핑 할 계획인가요?
        - **[코드스니펫] 네이버영화 페이지**
            
            ```python
            https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829
            ```
            
    - 패키지 추가 설치하기(beautifulsoup4)
        
        ```python
        bs4
        ```
        
    - 크롤링 기본 세팅
        - **[코드스니펫] 크롤링 기본 세팅**
            
            ```python
            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://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
            
            soup = BeautifulSoup(data.text, 'html.parser')
            
            # 코딩 시작
            ```
            
        
        ```python
        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
        태그 안의 속성을 찍고 싶을 땐 → 태그['속성']
        
        
        
        ```python
        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에 미리 정의된 다른 방법을 알아봅니다
        
        ```python
        # 선택자를 사용하는 방법 (copy selector)
        soup.select('태그명')
        soup.select('.클래스명')
        soup.select('#아이디명')
        
        soup.select('상위태그명 > 하위태그명 > 하위태그명')
        soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
        
        # 태그와 속성값으로 찾는 방법
        soup.select('태그명[속성="값"]')
        
        # 한 개만 가져오고 싶은 경우
        soup.select_one('위와 동일')
        ```
        
    - 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있습니다.
        1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
        2. 원하는 태그에서 마우스 오른쪽 클릭
        3. Copy → Copy selector로 선택자를 복사할 수 있음
        
        ![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6a40280b-252d-4655-9540-b76bfed20292/Untitled.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6a40280b-252d-4655-9540-b76bfed20292/Untitled.png)
        

## **09. Quiz_웹스크래핑(크롤링) 연습**

- 1) ✍웹스크래핑 더 해보기 (순위, 제목, 별점)
    - Q. 아래와 같이 보이면 완성!
        
        ![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5b5a7cca-11c7-45ce-ac0e-0390d76900d4/Untitled.png)
        
    - A. 완성 코드
        
        ```python
        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://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
        
        soup = BeautifulSoup(data.text, 'html.parser')
        
        #old_content > table > tbody > tr:nth-child(3) > td.title > div > a
        #old_content > table > tbody > tr:nth-child(4) > td.title > div > a
        
        movies = soup.select('#old_content > table > tbody > tr')
        
        for movie in movies:
            a = movie.select_one('td.title > div > a')
            if a is not None:
                title = a.text
                rank = movie.select_one('td:nth-child(1) > img')['alt']
                star = movie.select_one('td.point').text
                print(rank, title, star)
        ```

MongoDB

DB란?

데이터베이스(영어: database, DB)는 여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합이다.[1] 작성된 목록으로써 여러 응용 시스템들의 통합된 정보들을 저장하여 운영할 수 있는 공용 데이터들의 묶음이다. 데이터베이스에 속해있는 모델은 다양하다.

우리 눈에 보이진 않지만, 사실 DB에는 Index 라는 순서로 데이터들이 정렬되어 있다.

👉 **RDBMS(SQL)**

행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사하다.
데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것이다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이하다.

ex) MS-SQL, My-SQL 등

👉 **No-SQL**

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

ex) MongoDB

요즘은 Cloud 형태로 많이 만든다!


3주차 강의 파이썬과 몽고디비...
백엔드 서버 관련해서 많이들 듣는 강의다.
웹개발 종합반이라서 내가 듣기 싫어도 들어야된다 ㅜㅜ
어차피 프론트엔드를 마스터 하려면 백엔드를 알아야하고
백엔드를 마스터 하려면 프론트엔드를 알아야된다고 한다.
백엔드 강의를 들어봤는데 나름 재미있다.

설마... 내 적성은 백엔드..?

profile
정말 최선을 다하겠습니다.

0개의 댓글