3주차 정리
기본적인 것은 비슷하지만
변수 선언을 그냥 할 수 있다
예를 들면
a = 2 이런 방식
def 함수명(매개변수):
함수가 실행할 내용
if 조건 :
실행할 내용
for 변수 in 리스트 :
실행할 내용
괄호가 없는 대신에 줄맞춤이 중요하다
줄맞춤으로 괄호블록을 대신한다
python -m venv venv : 가상환경 만들기
가상환경을 만드는 이유는 라이브러리(패키지)를 따로 관리하기 위해서
→ 요구 조건에 따라서 버전의 차이나 사용환경 등에 의해 라이브러리 간의 충돌이 일어날 수도 있다
→ 가상환경이란 라이브러리를 담아두는 폴더이다
install 패키지명1 패키지명2 패키지명3 … : 라이브러리 설치
requests : 파이썬에서 fetch와 같은 역할을 하는 라이브러리
bs4 : 안에 BeautifulSoup을 이용해 url의 정보를 보다 쉽게 가져올 수 있게 해준다
pymongo : mongoDB를 사용하기 위함
certifi : 내 컴퓨터에서 네트워크 부분의 문제인지 이걸 설치해야 mongoDB를 사용할 수있다
웹 스크래핑(크롤링)
웹 페이지에서 오른쪽 버튼 클릭 → 검사
→ 내가 필요한 부분을 찾는다 → html데이터를 복사해서 붙여넣기
그 안에서 내가 필요한 부분을 이 맞는지 범위를 더 줄여야할지 판단하여
내가 필요한 데이터를 확실히 찾는다
라이브러리로 누군가 만들어놓은 코드를 통해 몇줄로 가져오지만
라이브러리가 없이 구현을 하려면 매우 복잡한 과정을 거친다
DB : 우리가 쓰는 프로그램과 같은 것
즉, 내 컴퓨터에 게임도 설치하고, PPT도 설치하고, DB도 설치할 수 있는 것이다
DB를 사용하는 이유는 잘 가져오는게 목적이자 역할인다
요즘은 이를 클라우드 서비스로 제공
SQL : 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사하게 정형화 되어있다
NO - SQL((Not Onlly) : 딕셔너리 형태로 데이터를 저장해두는 DB. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없고 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족
처음에 DB사용이 제대로 되지 않았다 길게 나오는 에러 메세지를 살펴보다가
pymongo.errors.ServerSelectionTimeoutError: 이게 중요한 메세지 같아서 검색을 통해 해결했다
→ certifi를 사용
3주차 과제
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()
# 힌트 주신대로 일단 모르겠지만 하나씩 프린트 해보고 text[0:2]와 strip()를 맞는 위치에 배정하였습니다
title = tr.select_one('td.info > a.title.ellipsis').text.strip()
if "19금" in title:
# 문자열엔 " "로 감싸주기
# <span class="icon icon-19">19<span class="hide">금</span></span> 를 통해서
# 19금 문자열이 들어간 건 알았지만 어떻게 지울지 몰라서
# 19금 지우는 부분은 구글링을 통해서 찾았습니다
title = title.strip("19금")
# strip("19금") 특정 문자열 지우기, replace('19금','')로 처리해도 된다
title = title.strip()
# strip() 공백 지우기
artist = tr.select_one('td.info > a.artist.ellipsis').text
print(rank, "/", title, "/", artist)
# 19금 문자열을 지우는 법을 알게되면서
# 문자열은 " "로 감싸주는 줘야한다는 것을 알게되었고
# 혹시나 사이에 구분하기 편하게 추가할 수 있을까 시도해본 결과
# 순위, 곡명, 가수 사이에 "/"를 추가해주었습니다
일부러 예전에 21년도 7월 차트로 처음에 했던 것을 가져왔다
그 때 19금곡 하나 때문에 "19금을 어떻게 지워야하나 필요 없는데" 하면서 한참 찾았던 기억이 있었고
주석도 열심히 달았다
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1)
처음에 내가 필요한 순위 곡이름 가수명이 모두 들어있는 범위를 찾아 가져와 tr 뒷부분만 날렸다
#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(1) > td.number
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
뒷부분을 필요한 항목별로 가져와 비교해서 위치를 찾았다
아직도 저게 어떻게 돌아가는지 모르겠지만
일단은 문제 없이 넘어갔으니 다음 과정을 하고 나중에 또 배우다 보면은
자연스럽게 알게 되는 부분도 있다