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 - {} 안 씀. 줄 맞춤으로 이해함.
- def sum(num1, num2) :
- 조건문
- if age > 20 :
print('성인')
else :
print('청소년')
- if age > 20 :
- 반복문
- 리스트의 원소를 하나씩 꺼내서 사용. 리스트의 길이만큼 반복하라고 알려줄 필요 없음.
- for 원소 in 리스트명:
print(원소) - 리스트 안에 딕셔너리가 있을 땐, 딕셔너리 하나하나가 원소로 꺼내짐.
- for 원소 in 리스트명:
- 리스트의 원소를 하나씩 꺼내서 사용. 리스트의 길이만큼 반복하라고 알려줄 필요 없음.
패키지
- 설치하기
- 가상환경 : 프로젝트마다 공구함을 갖고 그 안에 라이브러리 저장. 그때그때 필요한 라이브러리 달리지기 때문에. 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 볼 수 있음.
- 사용법
- select_one : 해당되는 딱 하나만.
- title = soup.select_one('원하는 html에 우클릭>copy>selector')
- title.text : 위 html 태그에서 내용에 해당하는 글자만 가져옴.
- title['href'] : 태그의 href 속성 가져옴.
- 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 ~
- trs = soup.select('#old_content > table > tbody > tr
- select_one : 해당되는 딱 하나만.
-
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의 데이터를 시각화해서 보여줌.
- 데이터베이스란?
- 목적 : 데이터를 단순히 보관하는 것이 아니라 잘 찾아다 쓰기 위함.
- 종류
- SQL : 엑셀 형식. 칸을 만들어두고 채워나감. 이름, 전화번호, 이메일 등을 넣을 칸으로 정해져있음.
- 단점 : 열과 행을 정해놔야 함. 중간에 구성 바꾸기 힘듦.
- 장점 : 데이터 뽑아가는 방식은 최적화됨. 데이터가 일관적이고, 분석하기 쉬움.
- NoSQL : not only SQL. 정해져있지 않고 딕셔너리 형태로 그냥 들어감.
- 장점 : 데이터 하나하나가 다름. 그래서 새로운 요소를 추가해도 별 상관 없음. 앞으로 변동이 많을 초기 스타트업/서비스에서 사용하기 좋음.
- 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 : 데이터 찾기
-
결과 : [{'name': 'bobby', 'age': 21}] ==> 딕셔너리가 들어있는 리스트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)
-
결과 : {'_id': ObjectId('61a8ff69e3bbdad91d6b3b39'), 'name': 'bobby', 'age': 21}user = db.users.find_one({'name':'bobby'}) # find_one 하면 하나만 가져옴. 여러 개 있어도 맨 위에 있는 하나. 따라서 결과는 딕셔너리. print(user)
-
- update
-
db.users.update_one({'name':'bobby'},{'$set':{'age':19}}) # 컬렉션 이름 주의
- update_many : 전부 바꿈. 근데 위험해서 잘 쓰지 않음.
-
- delete : 삭제하기.
-
db.users.delete_one({'name':'bobby'}) # name이 bobby인 것 찾아서 지우기
- delete_many : 있지만 이것도 잘 안씀.
-
- insert : 데이터 입력
- 퀴즈
- 매트릭스 평점 가져오기 / 매트릭스와 같은 평점의 영화 제목 나열하기 / 매트릭스 평점 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'으로 해주면 통일됨.
- 매트릭스 평점 가져오기 / 매트릭스와 같은 평점의 영화 제목 나열하기 / 매트릭스 평점 0으로 바꾸기
과제
- 지니뮤직 순위/제목/가수 스크래핑
- 파이썬 문자열 자르기
- [나] split 메서드 이용. https://wikidocs.net/2839
- [정답] strip() 사용. https://wikidocs.net/33017 strip()_ 문자열 및 공백 제거 https://yeonkevin.tistory.com/85 [Python] strip 함수와 split 함수
- 리스트 길이 : len(리스트명)
'TIL' 카테고리의 다른 글
[TIL-78~80] 스파르타 코딩클럽 웹개발 종합반 5주차 개발일지 (0) | 2021.12.09 |
---|---|
[TIL-75~78] 스파르타 코딩클럽 웹개발 종합반 4주차 개발일지 (0) | 2021.12.05 |
노마드코더 유튜브 클론코딩 챌린지 DAY 23~ (0) | 2021.11.30 |
[TIL-70] 노마드코더 유튜브 클론코딩 #6.11~#6.13 (0) | 2021.11.22 |
[TIL-68] 노마드코더 유튜브 클론코딩 #6.8~#6.10 (0) | 2021.11.19 |