# pymongo 연결 코드를 맨 위에 넣어주고# url은 다음 데이터들을 저장할 mongoDB url을 넣어준다(위에 한 방법)from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
# 여기부터는 mongoDB에 넣을 데이터를 크롤링 해서 어떤 데이터를 넣을지 한 것import requests
from bs4 import BeautifulSoup
URL = "https://movie.daum.net/ranking/reservation"
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(URL,headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
video_list = soup.select("#mainContent > div > div.box_ranking > ol > li")
for v in video_list:
# print(v)
rank = v.select_one(".rank_num").text
title = v.select_one(".tit_item").text.strip("\n")
rate = v.select_one(".txt_grade").text
doc = {
'title': title,
'rank': rank,
'rate': rate
}
db.movies.insert_one(doc)
# movies파일?을 만들고 크롤링한 다음의 데이터들을 mongoDB에 저장함
> 그럼 크롤링 할 웹 페이지에서 크롤링 한(제목_title, 순위_rank, 평점_rate) 데이터가 mongoDB에 새로운 movies를 만들고 저장된걸 확인 가능!
영화제목 '[범죄도시3]'의 평점을 가져오기
from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
movie = db.movies.find_one({'title':'범죄도시3'})
print(movie['rate'])
from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
movie = db.movies.find_one({'title':'범죄도시3'})
target_rate = movie['rate']
movies = list(db.movies.find({'rate':target_rate},{'_id':False}))
print(movies)
코드 해석
# 코드 해석from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
# movie는 mongoDB에 저장된 movies중에 title가 범죄도시3인 걸 뜻하는데
movie = db.movies.find_one({'title':'범죄도시3'})
# print(movie['rate']) : 6.9 -> (mongoDB에 저장된 movies중에 title가 범죄도시3)인 movie의 평점# target_rate라고 칭할꺼야 (mongoDB에 저장된 movies중에 title가 범죄도시3)인 movie의 평점을
target_rate = movie['rate']
# movies는 mongoDB에 저장된 리스트중 movies에서 찾을껀대 # rate가 target_rate인걸 찾을꺼야, 단 id는 제거하고
movies = list(db.movies.find({'rate':target_rate},{'_id':False}))
print(movies)
> 범죄도시3와 같은 평점은 없어서 범죄도시에 대한 정보만 나옴
'[범죄도시3]'의 평점과 같은 평점의 영화 제목들을 가져오기
from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
movie = db.movies.find_one({'title':'범죄도시3'})
target_rate = movie['rate']
movies = list(db.movies.find({'rate':target_rate},{'_id':False}))
for a in movies:
print(a['title'])
# movies를 돌면서 가져와 title를
> movies는 범죄도시3와 같은 평점을 가진 것의 정보를 담고 있고 그 같은 평점을 가지고 있는 데이터의 title을 가져오는것, 다만 범죄도시3와 같은 평점이 없어서 범죄도시3만 출력된것
'[범죄도시3]' 영화의 평점을 0으로 만들기
from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
db.movies.update_one({'title':'범죄도시3'},{'$set':{'rate':'0'}})
3주차 숙제
지니뮤직의 1~50위 곡을 스크래핑
# mongoDB 연결from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta
# requests로 웹 사이트 연결# bs4로 크롤링 준비import requests
from bs4 import BeautifulSoup
URL = "https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20230101"
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(URL,headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# songs로 모두 긁어오고
songs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
# songs로 가져온 정보들을 돌아가면서 다음과 같은 데이터만 추출for song in songs:
title = song.select_one('td.info > a.title.ellipsis').text.strip()
rank = song.select_one('td.number').text[0:2].strip()
artist = song.select_one('td.info > a.artist.ellipsis').text
print(rank, title, artist)
for song in songs:
title = song.select_one('td.info > a.title.ellipsis').text.strip()
rank = song.select_one('td.number').text[0:2].strip()
artist = song.select_one('td.info > a.artist.ellipsis').text
print(rank, title, artist)
> .stip --> 앞뒤공백을 지워줌 > [0:2] -->0에서2까지라는 뜻으로 두가지만 나타남 .select 할때 참고
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')
# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')