728x90
2023.01.19
3-9 DB개괄
- RDBMS(SQL)
행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사하다.
데이터의 일관성이나 / 분석에 용이할 수 있다. ex) MS-SQL, My-SQL 등
- No-SQL
딕셔너리 형태로 데이터를 저장해두는 DB이다.
자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있다. ex) MongoDB
최신 클라우드 서비스인 mongoDB Atlas를 사용해 볼것이다.
3-10 mongoDB 시작하기
- 회원가입하기
https://account.mongodb.com/account/register
- 프로젝트 생성하기
- 연결하기
사용할 아이디와 비밀번호를 입력
3-11 mongoDB 연결하기
- mongoDB와 연결을 하기 위해 pymongo, dnspython 패키지를 설치한다.
- 현재 버전과 일치하도록 선택
- pymongo 기본 코드
from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta
- <password>를 아까 설정한 비밀번호로 바꿔준다. ?retry 앞에 Cluster도 추가
- 테스트해보기
users에 insert 해보았다.
3-12 pymongo로 DB조작하기
- 데이터 넣기
db.users.insert_one({'name':'bobby', 'age' : 27})
db.users.insert_one({'name':'john', 'age' : 20})
db.users.insert_one({'name':'ann', 'age' : 20})
- 결과 값 보기
// 아이디 포함
all_users = list(db.users.find({}))
# {'_id': ObjectId('63c8aab5d90655d1699f18e0'), 'name': 'bob', 'age': 27} 으로 출력
// 아이디 제외
all_users = list(db.users.find({},{'_id':False}))
# {'name': 'bob', 'age': 27}으로 출력
- 특정 결과 값 보기
user = db.users.find_one({'name':'john'})
print(user)
# {'_id': ObjectId('63c8b4596645f283d755b548'), 'name': 'john', 'age': 20}으로 출력
- 수정하기
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
- 삭제하기
db.users.delete_one({'name':'bobby'})
- pymongo 코드 요약
# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})
# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))
# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
# 지우기 - 예시
db.users.delete_one({'name':'bobby'})
3-13 웹스크래핑 결과 저장하기
저번 시간의 네이버 영화 평점 크롤링 한 것과 연결 해보기
for movie in movies:
name = movie.select_one('td.title > div > a')
# print(a) # none 가로선
if name is not None:
title = name.text
rank = movie.select_one('td:nth-child(1) > img')['alt']
star = movie.select_one('td.point').text
print(rank, title, star)
doc = {
'title':title,
'rank':rank,
'star':star
}
db.movies.insert_one(doc)
반복문 안에 넣어 하나씩 movies에 저장했다.
3-14 Quiz_웹스크래핑 결과 이용하기
- 영화 '가버나움' 평점 가져오기 (find_one)
movie = db.movies.find_one({'title':'가버나움'},{'_id':False})
print(movie['star'])
- 영화 '가버나움' 평점과 같은 영화 가져오기 (find)
movie = db.movies.find_one({'title':'가버나움'},{'_id':False})
star = movie['star']
all_movies = list(db.movies.find({'star':star},{'_id':False}))
for movie in all_movies:
print(movie['title'])
- 영화 '가버나움' 평점 0으로 수정하기
# 숫자가 아닌 문자로 수정
db.movies.update_one({'title':'가버나움'},{'$set':{'star':'0'}})
3-15 3주차 끝 & 숙제 설명
https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701
- 순위 / 곡 제목 / 가수를 스크래핑 해오기
숙제 지니뮤직 크롤링하기
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')
순위의 위치를 복사해보니
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
#body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.number
#body-content > div.newest-list > div > table > tbody > tr:nth-child(3) > td.number
이므로 tr 앞까지 rows에 지정해줬다
rows = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
- 공백 제거 함수 strip()
for row in rows:
title = row.select_one('td.info > a.title.ellipsis').text
#공백이 같이 출력
title = row.select_one('td.info > a.title.ellipsis').text.strip()
#공백을 제거함
print(title)
Peaches의 19금 이미지로 인해 공백이 잘 제거되지 않음
- 문자열 원하는 글자수만큼 자르기
for row in rows:
title = row.select_one('td.info > a.title.ellipsis').text[4:].strip()
# 19금 제거 후 공백을 제거함
print(title)
순위는 앞의 두 글자만 가져오고 나머지는 공백을 strip()으로 없애주었다.
for row in rows:
# 앞의 두 글자 자르기
rank = row.select_one('td.number').text[0:2].strip()
# 네번째 이후로 자르기
title = row.select_one('td.info > a.title.ellipsis').text[4:].strip()
name = row.select_one('td.info > a.artist.ellipsis').text.strip()
print(rank, title, name)
결과
3주차 후기
크롤링으로 홈페이지의 정보를 출력하는 부분이 재미있어서
혼자서 여러가지 연습해보다 많이 막혀서 시간을 엄청 썼던 기억이...
No-SQL인 mongoDB를 처음 접해봤는데, 구조가 특이해서 어려운 느낌이 있다.
3주차 공부하다 2주차 복습을 하니 또 까먹은 느낌이 있어서...
얼른 공부하고 복습해야겠다!!
728x90
'개발일기 > 웹 종합' 카테고리의 다른 글
팬명록 입력 체크하기 (0) | 2023.01.22 |
---|---|
Flask 프레임워크 (0) | 2023.01.21 |
크롤링 연습 (기상청 홈페이지) (0) | 2023.01.18 |
파이썬 기초, 웹스크래핑(크롤링) 기초 (0) | 2023.01.18 |
Ajax (0) | 2023.01.14 |