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

권혁준·2022년 3월 6일
0

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

파이썬

1. 파이썬 시작

1) 파이썬을 설치한다는 것의 의미

파이썬 설치?

  • 일종의 번역팩을 설치, 파이썬 문법으로 된 것을 컴퓨터 언어로 변환해줄 수 있도록 패키지 설치하는 것

2) 파이썬 문법을 시작하기에 앞서..

  • 파이썬은 매우 직관적인 언어 → 할 수 있는 것이 많다

2. 파이썬 기초공부

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 이렇게?
  • 자료형

    • 숫자, 문자형

      name = 'bob' # 변수에는 문자열이 들어갈 수도 있고,
       num = 12 # 숫자가 들어갈 수도 있고,
      
       is_number = True # True 또는 False -> "Boolean"형이 들어갈 수도 있습니다.
      
       #########
       # 그리고 List, Dictionary 도 들어갈 수도 있죠. 그게 뭔지는 아래에서! 
    • 리스트형(Javascript의 배열형과 동일)

      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형과 동일)

      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형의 조합

      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'
  • 함수

    • 함수의 정의 - 이름은 마음대로 지정가능!

      # 수학문제에서
       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라는 변수의 값은?
  • 조건문

    • 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)
         # 무엇이 출력될까요?
  • 반복문

    • 파이썬의 반복문은 리스트의 요소들을 하나씩 꺼내 쓰는 형태

      • 4즉, 무조건 리스트와 함께 사용
      fruits = ['사과','배','감','귤']
      
       for fruit in fruits:
         print(fruit)
      
      # 사과, 배, 감, 귤 하나씩 꺼내어 찍힙니다.

2) 파이썬 패키지 설치

  • 패키지? 라이브러리?
    Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위입니다. 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있습니다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치합니다.

    즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!

    • 가상 환경(virtual environment)이란?
      프로젝트 별로 패키지들을 담을 공구함

      같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.

      출처 : 파이썬 공식 용어집- 가상환경

  • pip(python install package) 사용 - requests 패키지 설치
    ✅ 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip를 이용

    • project interpreter 화면에서 + 버튼을 누르면 아래 창이 뜬다

3) 파이썬 패키지 사용

  • Requests 라이브러리 사용 + List / Dictionary / 함수 / If / For문 연습

    • 아래 방법으로 서울시 대기 OpenAPI에서, 중구의 NO2 값을 가져온다

      import requests # requests 라이브러리 설치 필요
      
      r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
      rjson = r.json()
      
      print(rjson['RealtimeCityAir']['row'][0]['NO2'])
    • 모든 구의 IDEX_MVL 값을 찍는다

      import requests # requests 라이브러리 설치 필요
      
      r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
      rjson = r.json()
      
      gus = rjson['RealtimeCityAir']['row']
      
      for gu in gus:
          print(gu['MSRSTE_NM'], gu['IDEX_MVL'])  
    • IDEX_MVL 값이 60 미만인 구만 찍는다

      import requests # requests 라이브러리 설치 필요
      
      r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
      rjson = r.json()
      
      gus = rjson['RealtimeCityAir']['row']
      
      for gu in gus:
          if gu['IDEX_MVL'] < 60:
              print (gu['MSRSTE_NM'], gu['IDEX_MVL'])

웹스크래핑(크롤링)

1. 웹스크래핑(크롤링) 기초

  • 웹스크래핑 하기 ex) 영화 제목

    https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303
  • 패키지 추가 설치(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.nhn?sel=pnt&date=20200303',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.nhn?sel=pnt&date=20200303',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('위와 동일')
  • 크롬 개발자도구 참고하는 방법

    1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
    2. 원하는 태그에서 마우스 오른쪽 클릭
    3. Copy → Copy selector로 선택자를 복사가능

DB

1. DB 설치 확인

1) DB 설치 확인

크롬 창에 localhost:27017이라고 쳤을 때 아래와 같은 화면이 나오면 mongoDB가 실행되고 있다는 것

2) robo3T 준비

  • robo 3T의 역할
    mongoDB : 그래픽인터페이스(GUI)를 제공하지 않음
    → robo 3T의 역할 : DB 내부를 살펴보기 위한 프로그램
  • robo 3T 세팅
    robo 3T에서 DB 볼 세팅을 미리 해둔다(아무 이름 입력 가능)
  • db, collection, documents(각 데이터들을 지칭)를 확인
    처음에는 System, config만 있지만 데이터가 생기면 아래처럼 보인다

2. DB 개괄

1) DB의 2가지 종류

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

    ex) MS-SQL, My-SQL 등

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

    ex) MongoDB

pymongo

1. pymongo로 DB 조작하기

1) pymongo 라이브러리의 역할

⭐️ pymongo : mongoDB 프로그램을 조작하기 위한 라이브러리

2) 패키지 설치

  • 패키지 설치

    pymongo
  • pymongo 기본 코드

    from pymongo import MongoClient
    client = MongoClient('localhost', 27017)
    db = client.dbsparta
    
    # 코딩 시작
    • DB 연결하기 & 데이터 넣기 pymongo(insert)

      from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
       client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
       db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
      
       # MongoDB에 insert 하기
      
       # '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})
    • 모든 결과 값 보기 pymongo(find)

      from pymongo import MongoClient           # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
       client = MongoClient('localhost', 27017)  # mongoDB는 27017 포트로 돌아갑니다.
       db = client.dbsparta                      # 'dbsparta'라는 이름의 db를 만듭니다.
      
       # MongoDB에서 데이터 모두 보기
       all_users = list(db.users.find({}))
      
       # 참고) MongoDB에서 특정 조건의 데이터 모두 보기
       same_ages = list(db.users.find({'age':21},{'_id':False}))
      
       print(all_users[0])         # 0번째 결과값을 보기
       print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
      
       for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
           print(user) 
    • 특정 결과 값 보기 pymongo(find_one)

      user = db.users.find_one({'name':'bobby'})
       print(user)
    • 수정하기 pymongo(update_one)

      # 생김새
       db.people.update_many(찾을조건,{ '$set': 어떻게바꿀지 })
      
       # 예시 - 오타가 많으니 이 줄을 복사해서 씁시다!
       db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
      
       user = db.users.find_one({'name':'bobby'})
       print(user)
    • 삭제하기 pymongo(delete_one)

      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 값은 제외하고 출력)
     same_ages = list(db.users.find({'age':21},{'_id':False}))
    
     # 바꾸기 - 예시
     db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
    
     # 지우기 - 예시
     db.users.delete_one({'name':'bobby'})

3주차 숙제 : 지니뮤직 크롤링하기

1) 문제

지니뮤직의 1~50위 곡을 스크래핑 해보세요.

  • 순위 / 곡 제목 / 가수를 스크래핑 하면 됩니다.

2) 나의 풀이

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

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=D&ymd=20200403&hh=23&rtm=N&pg=1',headers=headers)

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

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

for tr in trs:
    rank = tr.select_one('td.number').text[0:2].strip()
    title = tr.select_one('td.info > a.title.ellipsis').text.strip()
    singer = tr.select_one('td.info > a.artist.ellipsis').text
    print(rank, title, singer)
profile
비전공개발자의 개발일지

0개의 댓글

관련 채용 정보