티스토리 뷰
10. DB설치 확인
mongodb는 컴퓨터에는 돌아가고 있는데 안보이게 켜진다.
robo3T를 가지고 mongodb의 데이터를 볼수 있게 하는것이다.
11. DB개괄
데이터베이스는 왜쓰는가 ?
데이터를 잘 갖다가 쓰기위해서다.
Database에는, 크게 두 가지 종류가 있다.
SQL는 엑셀과 가깝다.
NoSQL는 정해놓지 않고 한줄 한줄이 딕셔너리 형태이다.
RDBMS(SQL)
행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사하다.
데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어렵다.
. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이 . ex) MS-SQL, My-SQL 등
No-SQL(not only SQL)
딕셔너리 형태로 데이터를 저장해두는 DB 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족 ex) MongoDB
서버는 컴퓨터의 역할
컴퓨터에서 서버라는 프로그램을 돌리자
DB라는 프로그램을 돌리고 크롤링도 한다.
12. pymongo로 DB조작하기
pymongo로 mongoDB 조작하기
pymongo 라이브러리의 역할
mongoDB 라는 프로그램을 조작하려면 라이브러리, pymongo가 필요
pymongo 기본코드
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
# 코딩 시작
1.insert 데이터를 넣는것
2.find 찾는 것
3.update 데이터를 업데이트하는 것
4.delete 삭제하는 것
insert
from pymongo import MongoClient #pymongo를 쓰겠다.
client = MongoClient('localhost', 27017) #내 컴퓨터에서 지금 돌아가고 있는 mongodb에 접속
db = client.dbsparta #dbsparta라고 하는 db이름으로 접속할거다.
# MongoDB에 insert 하기
# 'users'라는 collection에 {'name':'bobby','age':21}를 넣습니다.
db.users.insert_one({'name':'bobby','age':21}) #딕셔너리를 만듬
db.users.insert_one({'name':'kay','age':27}) #users에 name는 kay,age는27를 넣는다.
db.users.insert_one({'name':'john','age':30})
mongodb는 딕셔너리가 쌓이는 것
mongobb가 아무리 자유롭게 쌓는다고 하더라도 콜렉션이 존재(비슷한 것끼리 묶는것)
db안에 users라는 collection에 insert해라
find
from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다.
# MongoDB에서 데이터 모두 보기
all_users = list(db.users.find({}))
# 참고) MongoDB에서 특정 조건의 데이터 모두 보기
same_ages = list(db.users.find({'age':21},{'_id':False}))
print(all_users[0]) # 0번째 결과값을 보기
print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기
for user in all_users: # 반복문을 돌며 모든 결과값을 보기
print(user)


여러개 있어도 제 위에 있는 하나만 가져온다.
update
# 생김새
db.users.update_many({'name':'bobby'},{'$set':{'age':19}}) #bobby하는 name을 모두 찾아서 age 19로 바꿔라 실수를 안하기 위해 많이는 안쓴다.
db.users.update_one({'name':'bobby'},{'$set':{'age':19}}) #바비라는 name을 찾아서 age 19로 바꿔라
user = db.users.find_one({'name':'bobby'})
print(user)

delete
db.users.delete_one({'name':'bobby'})
user = db.users.find_one({'name':'bobby'})
print(user)

insert,findupdate,delete 요약
from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta
# 저장 - 예시
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'})
13. 웹스크래핑 결과 저장하기
insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta //pymongo 기본 코드 추가
# 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 ={ #doc 딕셔너리 만들기
'rank':rank,
'title':title,
'stat' :star,
}
db.movies.insert_one(doc) #insert하기
14. Quiz_웹스크래핑 결과 이용하기
(1) 영화제목 '매트릭스'의 평점을 가져오기
find

(2) '매트릭스'의 평점과 같은 평점의 영화 제목들을 가져오기

(3) 매트릭스 영화의 평점을 0으로 만들기


15. 3주차 끝 & 숙제 설명
지니뮤직의 1~50위 곡을 스크래핑 해보세요.
검사에서 제목부분 확인하고 copy select
#body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.info > a.title.ellipsis
#body-content > div.newest-list > div > table > tbody > tr:nth-child(3) > td.info > a.title.ellipsis
=>body-content > div.newest-list > div > table > tbody > tr 공통부분 묶어서 soup.select 안에 넣는다.
tilte
> td.info > a.title.ellipsis 공통부분 안넣은 부분


rank
순자 전체 네모부분
#body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.number
공통부분 빼면
> td.number 공통부분 안넣은 부분


결과가 이거때문인듯하다.
검사에서 2부분을 자세히 살펴보니 "1 "이런식을 으로 되어있고 순위도 두자리도 있어서

artist
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
공통적인 부분 빼면
td.info > a.artist.ellipsis로

정답코드
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=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:
title = tr.select_one('td.info > a.title.ellipsis').text.strip()
rank = tr.select_one('td.number').text[0:2].strip()
artist = tr.select_one('td.info > a.artist.ellipsis').text
print(rank, title, artist)
'sparta 웹개발 종합반 개발일지' 카테고리의 다른 글
| Sparta 웹개발 종합반 4주차 10~16강 +숙제 (0) | 2022.06.02 |
|---|---|
| Sparta 웹개발 종합반 4주차 1~9강 (0) | 2022.05.22 |
| Sparta 웹개발 종합반 3주차 1~9강 (0) | 2022.05.21 |
| Sparta 웹개발 종합반 2주차 9~12강+숙제 (0) | 2022.05.20 |
| Sparta 웹개발 종합반 2주차 1~8강 (0) | 2022.05.20 |