2022. 4. 21. 00:54ㆍ3층 1구역 - 개발의 장/웹개발 일지(풀스택)
지난 2주차까지 눈에 보이는 HTML, CSS, 자바스크립트를 했다면
이번 3주차는 파이썬을 이용한 기본함수, 웹스크래핑, 데이터베이스 조작하기에 대한
백엔드 과정을 학습하게 된다.
파이썬 패키지(package) 설치하기
- 즉, 여기서는 패키지 설치 = 외부 라이브러리 설치!
- 👉 패키지? 라이브러리? → Python 에서 패키지는 모듈(일종의 기능들 묶음)을 모아 놓은 단위
- 이런 패키지 의 묶음을 라이브러리 라고 볼 수 있다. 지금 여기서는 외부 라이브러리를 사용하기 위해서 패키지를 설치
- 가상 환경(virtual environment) 이란? - 프로젝트별로 패키지들을 담을 공구함
웹스크래핑(크롤링)
- 말 그대로 웹(인터넷) 내용을 스크랩 한다. 즉, 웹에 있는 내용을 가져와서 데이터를 추출하는 방법
네이버 영화 순위 웹스크래핑 하기
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('크롤링 할 인터넷 주소',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
# 코딩 시작
리퀘스츠 임폴트 해오고, 뷰티풀숩 임폴트 할 것 이다.
여기서 '밥정' 이라는 하나를 선택해 올 것이다.(select_one())
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')
movies = soup.select_one('td.title > div > a')
print(movies)
그러면 결과는 <a href="/movie/bi/mi/basic.naver?code=186114" title="밥정">밥정</a> 이렇게 나오고
print(movies.text) 라고 입력하면 '밥정' 이란 단어가 나온다.
여기서 print(movies['href']) 라고 입력 하면 /movie/bi/mi/basic.naver?code=186114 영화의 관련 코드가 나온다.
이런식으로 영화의 순위, 영화제목, 평점들을 크롤링 해올 수 있다.
import requests
from bs4 import BeautifulSoup
# 타겟 URL을 읽어서 HTML를 받아오고,
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)
# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a
movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
a = movie.select_one('td.title > div > a')
# 여기서 None이란 게 나올텐데 영화에서 보이는 가로줄이다.
if a is not None:
# 만약 a가 None이 아니라면 그걸 빼라.
title = a.text
rank = movie.select_one('td:nth-child(1) > img')['alt']
# ['alt'] << 이미지 alt값을 가져와라.
star = movie.select_one('td.point').text
print(rank,title,star)
# expected an indented block << 에러가 나올 경우 들여쓰기가 잘 되었는지 고려해봐야 한다. 주의 할 것
['alt']는 방금전 ['href']와 비슷한 맥락이므로 알아 두도록 하자.
DB는 왜 쓰는 것일까?
우리가 서점에 갔다고 생각을 해보자.
서점에는 교양, 자기계발 등과 같은 큰 카테고리에 출판사 -> 책 이름 으로 책이 분류가 되어있다.
그래서 우리가 책을 찾기가 쉬운데 DB또한 자료를 찾기 쉽도록 하기 위해 이용하는 것.
DB의 종류
RDBMS(SQL)
행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사하다.
중간에 열을 하나 더하기는 어렵다.
단, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이하다.
ex) MS-SQL, My-SQL 등
No-SQL
딕셔너리 형태로 데이터를 저장해두는 DB
데이터 하나 하나 마다 같은 값들을 가질 필요가 없게된다.
자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있다.
ex) MongoDB
MongoDB에서 딱 4가지만 기억하자.
from pymongo import MongoClient
import certifi
ca = certifi.where()
client = MongoClient('mongodb+srv://test:sparta@cluster0.qsm4e.mongodb.net/Cluster?retryWrites=true&w=majority', tlsCAFile=ca)
db = client.dbsparta
# 저장 - 예시
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'})
이번 3주차 숙제는 지니뮤직의 1~50위 차트를 크롤링 하는 것이다.
네이버 영화 크롤링 하는 것과 많이 유사했다.
import requests
from bs4 import BeautifulSoup
# 타겟 URL을 읽어서 HTML를 받아오고,
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)
# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')
musics = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
# soup.select에 공통된 부분 집어 넣기(제목에 오른쪽 마우스 검사 클릭 후, copy -> selector copy)
# #body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis
# #body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.info > a.title.ellipsis
# tr 부분까지 공통된 사항이므로 tr이전 까지 복사해서 붙여넣기
for music in musics:
# 이건 공통부분 for 변수 in 변수s
rank = music.select_one('td.number').text[0:2].strip()
# #body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
# #body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.number
# tr까지 공통된 값이므로 td.number 복사하자.
# 확인 후, print(rank.text[0:2]strip())에서 .text와 .strip()을 가져와 rank부분에 복사한다.
# 이대로 print(rank.text)를 하면 1(아래로 2칸 띄고) 20상승 이렇게 나올텐데 앞에서 2글자 끊기 .text[0:2] 사용
# 그러면 순위만 깨끗하게 나오지만 하나씩 칸이 띄어져 있으므로 .strip()함수를 사용하자!
title = music.select_one('td.info > a.title.ellipsis').text.strip()
# tr까지 공통된 값이므로 td.info > a.title.ellipsis 복사하자.
# 확인 후, print(rank.text[0:2]strip())에서 .text와 .strip()을 가져와 title부분에 복사한다.
artist = music.select_one('td.info > a.artist.ellipsis').text
print(rank,title,artist)
# (중요) print 입력 시 꼭 들여쓰기 적용할 것.
여기서 영화순위와 차이점은
rank관련해서 alt 라는 변수값이 없기 때문에 ['alt']라는 값을 부여하지 않아도 됐다는 점.
단, print(rank)를 했을 때, 칸이 많이 띄어져 있는 것을 볼수 있으며, 음원 차트이다 보니 N위 상승 이런 것들이 보인다.
여기서 .text[0:2]를 사용하는데 앞에서 2글자만 끊어 text를 나타내 주세요 라는 얘기이다.
print(rank.text[0:2])를 해주면 순위가
1
2
3 이런 식으로 나오는데 이럴 때 쓰는 함수가 strip()이다.
즉, print(rank.text[0:2].strip())을 해주면
1
2
3 이런 식으로 순위가 붙어서 실행된다.
title관련해서 print(title.text)를 해주게 되면 제목이 또 띄엄띄엄 나오는데 이때도 print(title.text.strip())으로 정리해주자.
artist관련해서 print(artist.text)를 해주면 아티스트는 이상없이 나오기 때문에 .text만으로 정리해주면 된다.
.text[0:2].strip() <<rank에
.text.strip() <<title에
.text <<artist에 각각 옆에 붙여
rank = music.select_one('td.number').text[0:2].strip()
title = music.select_one('td.info > a.title.ellipsis').text.strip()
artist = music.select_one('td.info > a.artist.ellipsis').text
이런 식으로 만들고
print(rank,title,artist)
로 실행하여 이상없이 나오는지 확인하면 된다.
3주차까지 하면서 재미있다. 하지만 재미있는 것을 떠나서 퀴즈를 4,50분 고민해도 못 풀고 해설강의를 봐야
그제서야 풀리는 걸 보면 '내가 지금 잘 하고 있는 건가' 라는 생각이 들게 된다. 자전거를 어떻게 타는지 보여주고 밀어줘야 겨우 앞으로 나아가는 거 같아 조금 부끄럽다. 더 노력해서 머리가 아니라 몸이 기억할 수 있도록 해야겠다.
'3층 1구역 - 개발의 장 > 웹개발 일지(풀스택)' 카테고리의 다른 글
[스파르타 코딩 클럽]과 함께하는 웹개발 종합반 - 4주차 (0) | 2022.04.28 |
---|---|
[스파르타 코딩 클럽]과 함께하는 웹개발 종합반 - 2주차 (0) | 2022.04.18 |
[스파르타 코딩 클럽]과 함께하는 웹개발 종합반 - 1주차 (0) | 2022.04.12 |
[스파르타 코딩 클럽]과 함께하는 웹개발 종합반 - 0주차 (0) | 2022.04.09 |