본문 바로가기

웹개발_웹프로그래밍

3주차 개발일지(웹개발)

DB Quiz 1 '매트릭스'의 평점 가져오기

 

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

movie = db.movies.find_one({'title':'매트릭스'})
target_star = movie['star']

완성 된 결과물

 

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

 

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

movie = db.movies.find_one({'title':'매트릭스'})
target_star = movie['star']

target_movies = list(db.movies.find({'star':target_star},{'_id':False}))

#리스트에 딕셔너리가 들어있는 경우는 for문 사용
for target in target_movies:
    print(target['title'])

완성 된 결과물

 

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

 

db.users.update_one({'name':'bobby'},{'$set':{'age':19}})    # 업데이트 문에서 가져와 아래처럼 변형해 쓴다
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

db.movies.update_one({'title':'매트릭스'},{'$set':{'star':0}})

이렇게 되면 완성

 

 

프로젝트 연습 - 지니뮤직 사이트에서 1-50위 곡 크롤링 해보기

먼저 hellp.py 에서 했던 부분을 그대로 가져온 후 아래 지니뮤직  url 링크로 바꿔준다

https://www.genie.co.kr/chart/top200?ditc=D&rtm=N&ymd=20230606

 

지니차트>일간 - 지니

AI기반 감성 음악 추천

www.genie.co.kr

 

 import requests
 from bs4 import BeautifulSoup 

 from pymongo import MongoClient
 client = MongoClient('localhost', 27017)
 db = client.dbsparta

 # 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'}            #아래 ↓ 링크를 지니뮤직 링크로 바꿔주기

 # HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
 soup = BeautifulSoup(data.text, 'html.parser')
 
 # 위 코드들을 print(soup)로 프린트해서 html 코드들이 잘 찍히는지 확인 먼저 해보기

 

 

지니 뮤직 사이트에서 검사를 통해 개발자 도구창을 열고 순위, 제목, 가수를 가져오기

먼저 ' tr 'vscode로 먼저 가져가본다 

 

copy → copy selector

 

tr들을 그대로 가져오려면 ' tr:nth-child(1) ' 부분에서 nth-child(1)만 삭제해야함을 발견할 수 있다

 

#body-content > div.newest-list > div > table > tbody > tr:nth-child(1)

 

:nth-child(1) 부분 삭제

 

이 때, print(trs)를 입력하고 c+f5 실행을 하면 tr들이 터미널 cmd 창에 리스트 형식으로 뜨는 것을 확인 할 수 있다.

 

 

for 반복문을 사용해서 개발자 도구에서 가져온 코드를 입력해보기

 

복사한 tr 코드: #body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis

 '#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) >'      # 삭제할 부분

 

 'td.info > a.title.ellipsis'                                                                                   #사용할 부분

 

위 코드에서  tr 까지는 soup.select () 안에 들어간 코드랑 똑같기 때문에 지워주고  td.info > a.title.ellipsis   이 부분만 사용

 

 

이제  print(title.text)  이 코드를 실행시켜서 제목만 가져와보면 터미널에 공백이 있는채로 제목들이 뜬다.

이 공백들을 없애주기 위해 '파이썬 공백 제거' 구글링을 해보면 파이썬 내장 함수인  .strip ( ) 을 사용하라고 나온다.

 

print(title.text.strip())

 

print(title) 뒤에 붙여주던 .text.strip( ) 을 위에 있는 title에 옮겨 붙여도 title이 똑같기 때문에 무방하다.

 

 title = tr.select_one('td.info > a.title.ellipsis').text.strip()

 

ㄴ위와 같이 프린트 해주면 공백이 제거 된 채로 제목들이 나열되는 것을 볼 수 있다.

 

이제 print(title) 부분은 삭제하고 순위(rank) 코드를 짜보러 가보자

 

마찬가지로 개발자 도구에서 순위 td를 찾아주고 copy selector 를 통해 복사한다. 

#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number

tr 까지는 똑같으므로 #body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > 부분은 삭제한다.

그러면 아래와 같은 코드처럼 입력할 수 있다.

 rank - tr.select_one('td.number')

 

자, 이쯤에서 print(rank.text) 로 중간 점검을 해주자

 

파이썬 문자열 자르기를 통해 숫자 부분만 가져와야 함을 발견할 수 있다.

 
 print(rank.text[0:2].strip())

 

1-50 순위까지 있는 페이지므로 두자릿수임을 표현하는 [0:2] 사용, 그 뒤 .strip( ) 까지 동원하면 위와 같은 순위들이 나열된다.

 

 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()
     print(rank)

 

마찬가지로 .text[0:2].strip( ) 이 코드는 print 바로 위 rank = tr.select_one('td.number') 옆에다 붙여줘도 된다.

 

 

 

마지막으로 가수 이름을 가져오기 위해 copy selector 를 통해 코드를 짜보자.

 

#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis

 

복사한 코드를 select_one( ) ← 괄호 안에 붙여넣기 한 후 쓸데 없는 tr까지의 부분은 삭제한다. 그러면 괄호 안에 들어가는 코드는  td.info > a.artist.ellipsis 이 부분이다. print(artist.text)로 중간 점검 하면 가수 이름들이 뜨는 걸 확인할 수 있다.

 

 

.text는 artist 뒤에 붙히고 순위, 제목, 이름을 호출하는 print(rank, title, artist) 코드를 입력한다.

 

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)

 

순위, 제목, 가수 이름 순으로 실행 된 결과물

 

아래는 완성된 전체 코드이다.

 

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta

# 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'}

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
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)