드디어 3주차 회고 입성..!!!
회고 쓰는게 은근 오래 걸리고 귀찮네요...ㅠㅠ
근데 확실히 회고를 쓰고 나면 기억에 오래 남고
무엇보다도 뿌듯하니까^ㅁ^.. 오늘도 열심히 써보겠습니다~~😎
수업 목표
- 파이썬 기초 문법을 안다.
- 원하는 페이지를 크롤링 할 수 있다.
- pymongo를 통해 mongoDB를 제어할 수 있다.
배운 것
파이썬 기초 문법
- 변수와 기본 연산
a = 3 # 3을 a에 넣는다
b = a # a를 b에 넣는다
a = a + 1 # a+1을 다시 a에 넣는다
num1 = a*b # a*b의 값을 num1이라는 변수에 넣는다
num2 = 99 # 99의 값을 num2이라는 변수에 넣는다
- 자료형 (숫자형/문자형/리스트형/딕셔너리형)
# 숫자, 문자형
name = 'bob' # 변수에는 문자열이 들어갈 수도 있고,
num = 12 # 숫자가 들어갈 수도 있고,
is_number = True # True 또는 False -> "Boolean"형이 들어갈 수도 있다.
# 리스트형
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
# 딕셔너리형 (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
# 딕셔너리형과 리스트형의 조합
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'
# 딕셔너리 예제
people = [{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27}]
# 이름을 받으면, age를 리턴해주는 함수
def get_age(myname):
for person in people:
if person['name'] == myname:
return person['age']
return '해당하는 이름이 없습니다'
print(get_age('bob'))
print(get_age('kay'))
- 함수
# 참고: 자바스크립트에서의 함수 형태
function f(x) {
return 2*x+3
}
# 파이썬에서의 함수 형태
def f(x):
return 2*x+3
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']
# 과일의 개수를 세는 함수
def count_fruits(target):
count = 0
for fruit in fruits:
if fruit == target:
count += 1
return count
subak_count = count_fruits('수박')
print(subak_count) # 수박의 개수
gam_count = count_fruits('감')
print(gam_count) # 감의 개수
- 조건문
def oddeven(num): # oddeven이라는 이름의 함수를 정의한다. num을 변수로 받는다.
if num % 2 == 0: # num을 2로 나눈 나머지가 0이면
return True # True (참)을 반환한다.
else: # 아니면,
return False # False (거짓)을 반환한다.
result = oddeven(20) # True 반환
- 반복문 (리스트와 함께 쓰임)
fruits = ['사과','배','감','귤']
for fruit in fruits:
print(fruit)
# 사과, 배, 감, 귤 하나씩 꺼내어 찍힙니다.
파이썬 패키지 설치
- 패키지(package): 모듈(기능들의 묶음)을 모아 놓은 단위로, 패키지의 묶음을 라이브러리라고 한다.
- 가상 환경(virtual environment): 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경. 즉, 프로젝트별로 패키지들을 담는 공구함이다. 만약, 갑자기 사용하던 패키지의 버전을 변경해야 하는 상황에서 코드를 다 수정할 필요 없이 가상 환경을 2개 만들어서 관리하면 편리하다.
- pip(python install package): 앱을 설치할 때 앱스토어에서 다운을 받듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하기 위해 pip를 이용한다.
파이썬 패키지 사용하기
- Request 라이브러리: 파이썬용 HTTP 호출 라이브러리
# 미세먼지가 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'])
웹스크래핑(크롤링) 기초
- 크롤링 기본 세팅: bs4(beautifulsoup4) 라이브러리 설치 후 import하여 사용!
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')
- 네이버 영화 페이지에서 영화 제목 크롤링 하기
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들을 불러오기 (원하는 부분에서 마우스 오른쪽 클릭으로 검사 > Copy > Copy selector로 선택자 복사)
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)
- 영화 순위, 제목, 별점 크롤링 하기
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:
rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기
title = a_tag.text # a 태그 사이의 텍스트를 가져오기
star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기
print(rank,title,star)
- 선택자(selector) 사용법
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')
# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')
MongoDB / Robo 3T 개념
- MongoDB: 데이터베이스는 크게 RDBMS(SQL)와 No-SQL 두 종류가 있다. MongoDB는 No-SQL에 속하며, 딕셔너리 형태로 데이터를 저장하는 DB이다.
RDBMS(SQL) | No-SQL |
관계형 데이터베이스 (테이블 형태) | 비관계형 데이터베이스 (딕셔너리 형태) |
정해진 데이터 스키마에 따라 저장하여 부정확한 데이터를 다룰 위험이 없음. |
관계와 스키마가 존재하지 않아 다른 구조의 데이터를 저장이 가능하다. 중복 데이터의 위험이 있지만, 복잡하고 느린 Join을 사용할 필요가 없다. |
데이터 구조가 정형화 된 기업에서 용이 |
아직 데이터 구조가 확립되지 않은 스타트업에서 용이 |
ex) MySQL, Oracle | ex) MongoDB |
- MongoDB 설치 확인: 크롬 창에 localhost:27017을 쳤을 때, 연결 화면이 뜨면 MongoDB가 돌아가고 있는 것!
- Robo 3T: MongoDB는 GUI를 제공하지 않기 때문에 DB 내부를 확인하기 위해 필요한 프로그램이다.
pymongo로 DB 조작하기
# pymongo 기본 코드 (DB 연결)
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.db명
- pymongo DB CRUD 방법 (insert, find, update, delete)
# 저장 - 예시
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'})
웹스크래핑 결과를 DB에 입력 / 검색 / 수정 하기
- 도큐먼트(doc)를 만들어서 영화 정보를 하나씩 DB에 입력(insert)하는 코드
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient # pymongo import
client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다.
# 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:
rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기
title = a_tag.text # a 태그 사이의 텍스트를 가져오기
star = movie.select_one('td.point').text # td 태그 사이의 텍스트를 가져오기
doc = {
'rank' : rank,
'title' : title,
'star' : star
}
db.movies.insert_one(doc)
- 제목이 '매트릭스'인 영화의 평점을 검색(find)하기
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
target_movie = db.movies.find_one({'title':'매트릭스'})
print (target_movie['star'])
- '매트릭스'와 같은 평점의 영화 제목 검색(find)하기
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
target_movie = db.movies.find_one({'title':'매트릭스'})
target_star = target_movie['star']
movies = list(db.movies.find({'star':target_star}))
for movie in movies:
print(movie['title'])
- '매트릭스'의 평점을 0으로 수정(update)하기
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
db.movies.update_one({'title':'매트릭스'},{'$set':{'star':'0'}})
만든 것
- 지니뮤직의 1~50위 곡 순위 / 곡제목 / 가수 크롤링
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
client = MongoClient('localhost', 27017) # 로컬 DB 연결
db = client.dbsparta # DB 이름
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()
artist = tr.select_one('td.info > a.artist.ellipsis').text
print(rank, title, artist)
좋았던 것
웹스크래핑을 배우고서 느낀 점은 집 짓기 전 연장을 하나 챙긴 것 같은 든든함이라고 해야할까나....?ㅋㅋㅋ
앞으로 내가 프로젝트를 진행할 때 보다 부담감 적게 도전해 볼 수 있는 분야가 넓어진 것 같아 뿌듯했다!!
도전의 문턱을 낮춘 기분😊
바라는 것
근데 요새 좀 시간관리 좀 못하는거 같다.....노는 것도 좋은데 너무 빠지지 말자!!!!
'Programming > Web' 카테고리의 다른 글
[개발일지/회고] 스파르타코딩클럽 웹개발 종합반 - 5주차 (2) | 2022.02.12 |
---|---|
[개발일지/회고] 스파르타코딩클럽 웹개발 종합반 - 4주차 (0) | 2022.01.27 |
[개발일지/회고] 스파르타코딩클럽 웹개발 종합반 - 2주차 (0) | 2022.01.15 |
[개발일지/회고] 스파르타코딩클럽 웹개발 종합반 - 1주차 (0) | 2022.01.08 |
[JavaScript] 자바스크립트란? (0) | 2020.12.24 |