일일 개발일지 Python. mongoDB

10/23 데이터 크롤링 하는방법과 mongoDB

YOOYOUNGJAE 2022. 10. 24. 12:59
728x90

파이썬에이어 3주차 강의의 마지막인 데이터베이스를 만진다

라고는 말은 쉬운데 이번강의가 유독 말썽이많은 강의였다

들여쓰기 스페이스바 한번 내지 탭한번에 FOR문안으로 들어가지않아서

PRINT가 되지않는다던지  mac환경에서는 5000번 포트를 사용하고있어서

따로 설정을해줘야한다던지 제일중요한 DB서버 와의 연결이되지않아

기술적 오류를 매니져님들과 풀어나간다던지

공부하다가 머리털이 다빠질뻔했다

머리털이빠질만한 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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

from pymongo import MongoClient
import certifi

ca = certifi.where()

client = MongoClient('mongodb+srv://test:sparta@cluster0.im2ccmy.mongodb.net/Cluster0?retryWrites=true&w=majority', tlsCAFile=ca)
db = client.dbsparta

ㅁ 먼저 필수적으로 사용해야하는 것들이다

bautifulsoup이라는 툴을사용하여 pymongo와 연결을해주어었다

위에 data = requests.get 이곳에 내가 가져오고자하는 홈페이지의 주소를 넣어주면된다

 

예를 들기위해서 문제하나를 가져왔다

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=M&rtm=N&ymd=20210701',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
for tr in trs:
        rank = tr.select_one('td.number').text[0:2].strip()
        title = tr.select_one('td.info > a.title.ellipsis').text.strip()
        attist = tr.select_one('td.info > a.artist.ellipsis').text
        print(rank, title, attist)

위에 http하고 들어가있는 주소는 노래스트리밍사이트인 지니의 주소이다

거기서 우리는1~50위까지 등제되어있는 노래와 아티스트명을 가져올것이다

 

soup = beautifulsoup(data.txt, 'html.parser')

html에있는 data를 txt형식으로 가져오겠다

라고 보면된다

그아래 

r

trs = 위에서 requests.get으로 불러온 데이터에서 가져올 태그의 경료를 뜻한다

일일히 하나하나 보면서따라들어가면 시간도 많이소요되고 오타도발생할수있기에

내가얻고자하는 위치에서 마우스오른쪽클릭 검사를 누르면 콘솔창과함께 나오게된다

거기서 마우스 오른쪽클릭을하면 복사 탭에 잇는 selector 복사를 해서 붙여넣기를하면

내가 가고자하는 태그들이 나열되어나온다 중복되는부분을 넣어주고

for문을 사용하여 아래의 정보들을 가져오면된다

 

rank = tr.selet_one('td.number') 뒤에이쓴ㄴ td넘버는 tr하위 에있는 셀렉터이다

td.number값을 가져와서 텍스트로 표기한다 [0:2]번째의 탭은 보이지않고 strip()만보여줘라

라고 해석할수있다

아래도 동일한내용이다

 

print (rank, title, attist) 를해주면 내가 가져오고자하는 정보를

크롤링 에 성공한것이다 

 

1 바라만 본다 MSG워너비 (M.O.M)
2 Next Level aespa
3 신호등 이무진
4 Weekend 태연 (TAEYEON)
5 치맛바람 (Chi Mat Ba Ram) 브레이브걸스 (Brave girls)
6 Butter 방탄소년단
7 나를 아는 사람 MSG워너비 (정상동기)
8 Permission to Dance 방탄소년단
9 비 오는 날 듣기 좋은 노래 (Feat. Colde) 에픽하이 (EPIK HIGH)
10 헤픈 우연 헤이즈 (Heize)
11 하루만 더 빅마마 (Big Mama)
12 비와 당신 이무진

 

이런 정보가 나온다면 성공한것이다

db명령어는 파이몽고와 연결이되어야하며

# 저장 - 예시
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'})

이런것들을 사용해서 정보를 push하거나 변경하거나 지울수있다 

이런것들을 전부외우려고하면 머리가 2000개가 터져도 다못외운다 

그냥 아이런것들이있구나 생각하고 다음에 사용할때 복사해서 사용하는걸 권장한다

 

그렇 데이터크롤링 방법과 db 명령어 몇가지에대한 포스팅을마치겠다

728x90
댓글수1