본문 바로가기

TIL

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

21.11.30 : 3-1~3-4

21.12.01 : 3-5~3-8

21.12.02 : 3-9~3-12

21.12.03 : 3-13~과제

 

 


3. 파이썬

준비

  • 파이썬
  • 몽고db : 먼저 c드라브에 data 폴더 만들고 안에 db 폴더 만들어서 설치할 때 폴더 지정.
  • 환경 변수 설정
    • 윈도우 검색창에서 "시스템 환경 변수 편집" 검색 -> path 들어가서 "C:\data\db\bin" 추가.
  • 몽고db 실행 확인
    • 윈도우 검색창에 cmd 입력 -> 명령 프롬프트에서"mongod"
    • http://localhost:27017/ 들어갔을 때 "It looks like you are trying to access MongoDB over HTTP on the native driver port." 뜨면 됨. 
  • 로보3T
  • 깃 배쉬

 

시작하기

  • "설치"했다는 의미 : 1과 0의 전기신호로만 이해하는 컴퓨터에게 프로그래밍 언어(여기서는 파이썬)을 이해하게 해주는 번역팩을 설치한 셈.
  • pycharm에서 new project
    • 파일 경로 지정 : \스파르타코딩클럽\pythonprac\venv  => 폴더 선택 후 venv 붙어있는지 확인
    • 생성된 프로젝트에서 venv 폴더는 절대 건드리지 않기!
  • 실행 : 마우스 우클릭 -> run (파이참에서 우측 상단 초록색 플레이 버튼 누르지 말고)

 

기초 문법

  • 변수
    • 선언 : let, const 이런 거 붙일 필요 없음. 그냥 a = 2
    • 문자열과 숫자를 섞어서 쓰면 에러남. str(숫자) 해주기.
    • 에러 : 마지막 줄이 에러에 대한 설명, 그 윗줄이 에러난 위치
  • 리스트
    • a_list = ['사과', '귤', '포도']
    • 추가하기 : a_list.append('수박')
  • 딕셔너리
    • a_dict = {'name':'bob', 'age':25}
    • 추가하기 : a_dict['height'] = 170
  • 함수
    • def sum(num1, num2) :
          return num1 + num2
    • {} 안 씀. 줄 맞춤으로 이해함.
  • 조건문
    • if age > 20 :
           print('성인')
      else :
           print('청소년')
  • 반복문
    • 리스트의 원소를 하나씩 꺼내서 사용. 리스트의 길이만큼 반복하라고 알려줄 필요 없음.
      • for 원소 in 리스트명:
             print(원소)
      • 리스트 안에 딕셔너리가 있을 땐, 딕셔너리 하나하나가 원소로 꺼내짐.

 

패키지

  • 설치하기
    • 가상환경 : 프로젝트마다 공구함을 갖고 그 안에 라이브러리 저장. 그때그때 필요한 라이브러리 달리지기 때문에. virtual environment 줄여서 venv에 라이브러리 담김.
    • 파이참 > file > settings > project pythonprac > python interpreter : + 누르고 "requests" 검색후 install
  • requests 라이브러리 사용하기
    •  
    • 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: gu_name = gu['MSRSTE_NM'] gu_mise = gu['IDEX_MVL'] if gu_mise<30: print(gu_name, gu_mise)

 

웹스크래핑(크롤링)

  • 크롤링이란?
    • 크롤링 : 검색엔진이 내 사이트를 퍼가는 것
    • 스크래핑 : 어떤 페이지의 자료를 스크랩해가는 것
    • 근데 대충 혼용해서 씀.
  • [실습] 네이버 영화페이지 순위, 영화명, 별점 가져오기
    • beautifulsoup4 패키지 설치 : bs4
    • 과정
      • requests : 브라우저를 켜지 않고 코드단에서 요청
      • beautifulsoup4 : 요청돼서 가져온 html 중 원하는 정보 솎아내기
        • print(soup) 해보면 html 볼 수 있음.
    • 사용법
      1. select_one : 해당되는 딱 하나만.
        • title = soup.select_one('원하는 html에 우클릭>copy>selector')
        • title.text : 위 html 태그에서 내용에 해당하는 글자만 가져옴.
        • title['href'] : 태그의 href 속성 가져옴.
      2. select : 모두 다 선택. 리스트로 나옴.
        • trs = soup.select('#old_content > table > tbody > tr:nth-child(2)')
          for tr in trs:
              print(tr)
        • 구체적으로 tr 안에서 선택할 때, 이번엔 soup이 아니라 tr.select_one('td.title > div > a')
        • 무엇이 ~가 아닐 때 : if 무엇 is not ~
    • 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.nhn?sel=pnt&date=20200303',headers=headers)
      soup = BeautifulSoup(data.text, 'html.parser')
      trs = soup.select('#old_content > table > tbody > tr')
      for tr in trs:
      	a_tag = tr.select_one('td.title > div > a')
      if a_tag is not None:
      	print(a_tag.text)
    • for tr in trs:
          a_tag = tr.select_one('td.title > div > a')
          img_tag = tr.select_one('td:nth-child(1) > img')
          if a_tag is not None:
              title = a_tag.text
              rank = img_tag['alt']
              rate = tr.select_one('td.point').text
              print(rank, title, rate)

 

데이터베이스

  • 설치 확인 : http://localhost:27017/
  • robo 3T : create < name 정하기 < save
    • 몽고DB는 데이터베이스. 근데 눈에 보이지 않게 켜짐. robo 3T를 가지고 볼 수 있게 하는 것. 즉, 몽고db의 데이터를 시각화해서 보여줌.
  • 데이터베이스란?
    • 목적 : 데이터를 단순히 보관하는 것이 아니라 잘 찾아다 쓰기 위함.
    • 종류
      1. SQL : 엑셀 형식. 칸을 만들어두고 채워나감. 이름, 전화번호, 이메일 등을 넣을 칸으로 정해져있음.
        • 단점 : 열과 행을 정해놔야 함. 중간에 구성 바꾸기 힘듦.
        • 장점 : 데이터 뽑아가는 방식은 최적화됨. 데이터가 일관적이고, 분석하기 쉬움.
      2. NoSQL : not only SQL. 정해져있지 않고 딕셔너리 형태로 그냥 들어감.
        • 장점 : 데이터 하나하나가 다름. 그래서 새로운 요소를 추가해도 별 상관 없음. 앞으로 변동이 많을 초기 스타트업/서비스에서 사용하기 좋음.
    • DB도 하나의 프로그램. 컴퓨터가 DB, 서버, 크롤링 모두 할 수 있음.
  • pymongo : 파이썬으로 몽고db 조작하기 위해 사용하는 라이브러리
    • 설치 : 파이참에서 똑같이 검색하면 됨.
    • dbprac 파이썬 파일 만들기
      • insert : 데이터 입력
        • from pymongo import MongoClient
          client = MongoClient('localhost', 27017)
          db = client.dbsparta
          
          doc = {'name':'jane','age':34}
          db.users.insert_one(doc)
          #비슷한 데이터끼리 묶는 게 좋으니 users라는 collection 안에 넣음
          
      • find : 데이터 찾기
        • from pymongo import MongoClient
          client = MongoClient('localhost', 27017)
          db = client.dbsparta
          
          same_ages = list(db.users.find({'age':21},{'_id':False}))
          # {} 안의 내용이 조건. 모든 내용을 가져오고 싶으면 괄호 비워둠.
          # id는 지금 필요하지 않으니까 false로 해서 나타내지 않음.
          print(same_ages)
          결과 : [{'name': 'bobby', 'age': 21}]   ==> 딕셔너리가 들어있는 리스트
        • user = db.users.find_one({'name':'bobby'})
          # find_one 하면 하나만 가져옴. 여러 개 있어도 맨 위에 있는 하나. 따라서 결과는 딕셔너리.
          print(user)
          결과 : {'_id': ObjectId('61a8ff69e3bbdad91d6b3b39'), 'name': 'bobby', 'age': 21}
      • update
        • db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
          # 컬렉션 이름 주의
        • update_many : 전부 바꿈. 근데 위험해서 잘 쓰지 않음.
      • delete : 삭제하기.
        • db.users.delete_one({'name':'bobby'})
          # name이 bobby인 것 찾아서 지우기
        • delete_many : 있지만 이것도 잘 안씀.
  • 퀴즈
    • 매트릭스 평점 가져오기 / 매트릭스와 같은 평점의 영화 제목 나열하기 / 매트릭스 평점 0으로 바꾸기
      from pymongo import MongoClient
      client = MongoClient('localhost', 27017)
      db = client.dbsparta
      
      matrix_star = db.movies.find_one({'title':'매트릭스'})['star']
      print(matrix_star)
      
      same_star = list(db.movies.find({'star':matrix_star},{'_id':False}))
      for movie in same_star:
          print(movie['title'])
      
      db.movies.update_one({'title':'매트릭스'},{'$set':{'star':0}})​
      
       
    • 다른 데이터의 'star' 값은 다들 문자열인 상태. 따라서 0이 아니라 '0'으로 해주면 통일됨.

 

과제