항해99 사전강의 3주차
사전 강의 3주 차에서는 파이썬 언어와 mongoDB 데이터 베이스, 페이지의 내용 스크랩 해오기
파이썬 다운로드
반드시 Python 3.8.6 버전을 설치해야 한다. (3.9는 너무 최신 버전이라 오작동하는 라이브러리들이 있어서)
파이썬 다운로드 링크
https://www.python.org/ftp/python/3.8.6/python-3.8.6-amd64.exe
gitBash 다운로드
다음으로 파이썬 기초 문법 공부
기본 연산
a = 3 # 3을 a에 넣는다.
b = 2 # 2를 b에 넣는다.
c = a + b # 2 + 3 더한 값을 c에 넣는다.
문자열을 더할 수도 있다!
a = 'bumkyu"
b = "lee"
c = a + b #"bumkyulee 가 된다"
불리안
is_number = True # True 또는 False -> "Boolean"형이 들어갈 수도 있습니다.
# 변수의 이름은 마음대로 지을 수 있지만 사용해선 안 되는 예약어들이 존재한다! 예) for, const, var, let 등등
또한 변수명을 지을 때는 규칙 또한 존재한다.
1. 라틴문자 사용! (a-z, A-Z, 0-9)
2. 대소문자 구분!
3. 카멜 케이스(someVariable) 사용
변수에는 단어가 두 개 이상일 시에는 첫 글자가 대문자로 시작되는 카멜 케이스(Camel Case) #낙타 문법? 을 사용하는 것을 추천 예시) numberMax = 100;
4. 변수명은 반드시 영어
5. 숫자로 시작 금지
6. 특수문자 금지( _ 언더바 및 $ 달러사인 은 가능!)
7. 아이콘 사용 금지
배열
a_list = ['사과', '배', '김']
배열의 값을 하니씩 확인하고 싶다면 a_list [2] 배열 시작은 0부터 이기 때문에 '김'이라는 값을 확인할 수 있다.
객체
a_dict = {}
a_dict = {'name':'bob', 'age':21} #"name"이라는 key에 "bob"값을 "age'에 21 값을
a_dict['height'] = 178
객체는 key와 value값으로 이루어지는데 위와 같은 방법으로 'height"라는 key의 value를 178이라는 값으로 변경할 수 있다.
함수
def sum_all(a,b,c): <- () 소괄호 안에 들어가는 것은 인자라고 불림
return a+b+c; a, b,c 3개의 인자를 받아서 모두 더한 값을 다시 돌려줌!
sum_all(1,2,3) < 이렇게 sum_all이라는 함수를 실행시키면
1+2+3을 하므로 6을 다시 돌려받는다!
주의할 점으로 파이썬에는 함수를 만들 때 들여 쓰기를 잘 맞춰서 작성해야 한다!
if문
def oddeven(num): # oddeven이라는 이름의 함수를 정의한다. num을 인자로 받는다.
if num % 2 == 0: # num을 2로 나눈 나머지가 0이면
return True # True (참)을 반환한다.
else: # 아니면,
return False # False (거짓)을 반환한다.
for 문
fruits = ['사과', '배', '배', '감', '수박', '귤', '딸기', '사과', '배', '수박']
count = 0
for fruit in fruits: #위에 정의된 fruits 배열을 돌면서 fruit이라는 변수에 넣어주고
if fruit == '사과': # if문을 활용해서 그 fruit라는 변수에 '사과'라는 문자열이 들어가면
count += 1 # count라는 변수에 숫자 값을 1 증가시킨다
결과로 2가 나오게 된다.
파이썬 패키지 설치
패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위이다. 이런 패키지의 묶음을 라이브러리라고 볼 수 있다.
가상 환경?!(virtual environment)이란?
문제 상황 예시
회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었는데 회사 팀장님이 B를 이전 버전인 B~ 로 쓰자고 하신다면 같은 컴퓨터에 깔려 있는 개인 프로젝트에 B~로 쓰면 코드를 다 바꿔야 한다 이런 상황에서 필요한 게 가상 환경?
다 담아둘 필요 없이 공구함을 2개 만들어서, 공구함 1에 A, B', C를 담아두고, 공구함 2에 B, C, D, E를 담아 두는 원리로
가상 환경이라는 개념이 등장했다. 즉, 프로젝트별 공구함이라고 볼 수 있다.
가상 환경(virtual environment)은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경인 인 것이다
출처 : 파이썬 공식 용어집- 가상 환경.
파이참에서 파일 -> 설정 -> 프로젝트 -> python 인터프리터에서 requests라는 패키지를 설치했다.
라이브러리마다 정리된 방식이 다르기 때문에 해당 라이브러리에 사이트에 사용방법을 찾아봐야 한다!
requests 라이브러리 사용방법
import requests # requests 라이브러리 설치 필요
r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()
DB
DB는 왜 쓰는 것일까?
잘 넣어두기 위해서? 나중에 잘 찾기 위해서?
DB 저장이 목적이라기보단 나중에 잘 찾기 위해서에 더 가깝다고 볼 수 있다.
눈에 보이진 않지만 사실 DB에는 index라는 순서로 데이터들이 정렬되어 있다고 한다.
DB에는 두 가지 종류가 있는데
RDBMS(SQL)
행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사하며. 데이터 50만 개가 적재된 상태에서 중간에 열을 하나 더하기는 어렵다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있다.
ex) MS-SQL, My-SQL 등
No-SQL
딕셔너리 형태로 데이터를 저장해두는 DB이다. 고로 데이터 하나하나마다 같은 값들을 가질 필요가 없게 되며, 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있다.
ex) MongoDB
그럼 DB의 실체는 특별한 컴퓨터일까
아니다. 아주 간단하게, 우리가 쓰는 프로그램과 같은 것이며
내 컴퓨터에 게임도 설치하고, PPT도 설치하고, DB도 설치할 수 있는 것이다.
그 런 데! 이 마저도 요새는 Cloud 형태로 제공해주는 곳들이 많아서
강의에서는 최신 클라우드 서비스인 mongoDB Atlas를 사용한다.
mogoDB 가입, DB 생성
https://account.mongodb.com/account/register
pymongo, dnspython 패키치 설치
mongoDB연결코드
from pymongo import MongoClient
import certifi
ca = certifi.where()
client = MongoClient('mongodb+srv://test:sparta@cluster0.이름.mongodb.net/?retryWrites=true&w=majority',tlsCAFile=ca)
db = client.dbsparta
db.user.insert_one(doc)
db. 데이터가 들어갈 저장 소이름. insert_one(넣을 데이터) #이런 식으로 mongoDB에 데이터를 넣을 수 있다.
데이터를 여러 개 가져올 때
#mongoDB에서는 데이터가 저장될 때 id라는 값이 생성돼서 들어가기 때문에 id를 빼고 가져오는 코드
all_users =db.user.find({},{'id':False})
for user in all_users:
print(user)
데이터를 하나 가져올 때
user =db.user.find_one({'name':'bobby'});
데이터를 업데이트할 때
해당 데이터를 먼저 찾는 key:value 형태의 값을 입력하고('name'이 'bobby'인 데이터)
$set을 통해 해당 데이터의 'age'값을 19로 변경
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
데이터를 삭제할 때
db.users.delete_one({'name':'bobby'})
3주차 숙제로 genie 뮤직 사이트의 순의/곡 제목/ 가수를 스크래핑을 해보았다.
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')
musics = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
for music in musics :
a = music.select_one('td.info > a.title.ellipsis')
b = music.select_one('td.number')
c = music.select_one('td.info > a.artist.ellipsis')
if a is not None:
rank = b.text[0:2].strip()
title = a.text.strip().strip('19금').strip()
singer = c.text.strip()
print(rank, title, singer)