10/23 데이터 크롤링 하는방법과 mongoDB
파이썬에이어 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 명령어 몇가지에대한 포스팅을마치겠다