본문 바로가기
스파르타/Web

[Web] 스크래핑 데이터 저장 - ( week 3 )

by bakcoding_sparta 2023. 4. 20.

이제 스크래핑한 데이터를 DB에 저장해 보도록 한다.

 

베이스 코드

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

 

mongoDB에 연결하는 코드를 작성한다.

from pymongo import MongoClient
client = MongoClient('URL')
db = client.dbsparta

그리고 데이터를 딕셔너리 형태로 묶어준다음 DB로 데이터를 전송한다.

  doc = {
    'title': title,
    'rank': rank,
    'rate': rate
  }
  db.movies.insert_one(doc)

 

그리고 db 사이트에 접속해 보면 새로운 movies라는 그룹이 생긴 걸 볼 수 있고 그 안에는 내가 가져온 정보들이 저장되어 있다.

 

 

 

저장한 데이터 중에서 하나 골라서 가져와본다.

movie = db.movies.find_one({'title':'슈퍼 마리오 브라더스'})
print(movie)

 

저장했던 값이 그대로 잘 가져와진다.

 

이번에는 특정 영화의 특정 값과 동일한 영화를 가져오도록해본다. 

movie = db.movies.find_one({'title':'슈퍼 마리오 브라더스'})
# 슈퍼 마리오 브라더스의 평점
target_star = movie['rate']

# 슈퍼 마리오 브라더스와 동일한 평점의 영화 가져오기
movies = db.movies.find({'rate' : target_star}, {'_id':False})
for a in movies:
    print(a['title'])

두 개의 영화가 잘 들어오고 있다. 혹시나 해서 DB에서 확인해봤는데 올바른 데이터를 가져온것이 맞다.

 

 

이번엔 특정 영화의 평점을 변경해본다.

db.movies.update_one({'title' : '거울 속 외딴 성'}, {'$set':{'rate':0}})

값이 잘 변경되었다.