[TIL] python, bs4, pymongo

김대욱·2023년 1월 11일
1

bs4

python을 이용해 웹 크롤링을 하기 위해선 bs4패키지를 설치한 뒤, 기본적인 코드를 작성해야 한다.
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'}
response = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')

requests : http통신을 위한 라이브러리
bs4 : requests로 가져온 html파일로부터 데이터 추출을 도와주는 라이브러리

headers : 코드로 접근하는것을 차단한 사이트일때 작성해서 크롤링을 할 수 있게 해줌.
response : requests.get으로 요청하고 받은 응답이 담긴 객체. 많은 정보가 담긴다. bs4에서는 response.text를 이용하는 것 같다.

soup : 문자열 response.text 에서 selector를 사용해 원하는 정보를 쉽게 가져올수 있게 수프 객체로 만든다.

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

mysql, oracle에서는 테이블의 PK를 정해서 ID값이 같은 경우에는 중복으로 데이터가 들어가지 않았는데, mongodb 에서는

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

이 코드를 실행할때마다 중복값이 계속 insert 되었다. 이걸 해결하기 위해 구글링을 하던 중, upsert에 대해 알게됐다.

#update({업데이트를 위해 선택할 key-value쌍}, {수정될 내용의 key-value쌍}, upsert, 멀티라인 조건여부) # upsert와 멀티라인 조건여부의 default는 false

update함수의 upsert의 값을 True로 설정하면 선택한 key-value쌍이 존재할 경우에는 update를 진행하고, 없다면 insert를 한다.

doc = {'rank': rank, 'title': title, 'star': star}
db.movies.update_one({'title': title}, {'$set': doc}, True)

코드를 위와같이 수정해서 중복값이 insert되는것을 방지할 수 있었다. 근데 왜 시원한 느낌이 안드는지 모르겠다. 더 공부하면 알 수 있으려나

0개의 댓글