본문 바로가기
개발/기타

스파르타코딩클럽 웹개발 종합반 3주차 - Python, 크롤링, mongoDB

by mabyoungg 2023. 5. 10.

python 기본

프로젝트별로 파이썬 배포 패키지들을 설치하거나 업그레이드하기 위해 독립된 공간인 가상환경 설정 - venu

a = 1
b = 2
c = ['사과','귤']
b = {'name':'철수', 'age':20}

def add(a, b):
	return a+b
    
if test > 3:
	print("ok")
else:
	print("X")
    
for list in lists:
	print(list)

 

크롤링: 웹페이지로부터 원하는 데이터 추출

# requests 기본
import requests

r = requests.get('url')
rjson = r.json()

print(rjson)

# 크롤링 기본
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')

# 선택자 사용
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

# 태그와 속성값으로 찾기
soup.select('태그명[속성="값"]')

# 한 개만
soup.select_one('위와 동일')

 

SQL(RDBMS) ex) MS-SQMl, My-SQL

행/열의 생김새가 정해진 데이터를 저장하는 것과 유사, 정형화 되어 있는 만큼, 데이터의 일관성, 분석에 용이

No-SQL ex) MongoDB

딕셔너리 형태로 데이터 저장, 자유로운 형태의 데이터 적재에 유리, 일관성 부족 

 

mongoDB - Atlas, 클라우드 DB

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

# 저장
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

# 한 개
user = db.users.find_one({'name':'bobby'})

# 여러개
all_users = list(db.users.find({},{'_id':False}))

# 바꾸기
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기
db.users.delete_one({'name':'bobby'})

 

지니뮤직 순위 크롤링

import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient

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

trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for tr in trs:
    title = tr.select_one('td.info > a.title.ellipsis').text.strip()
    rank = tr.select_one('td.number').text[0:2].strip()
    artist = tr.select_one('td.info > a.artist.ellipsis').text
    print(rank, title, artist)