2021. 8. 12. 19:07ㆍ카테고리 없음
Python과 MongDB에 대해서 배운 주차였다.
파이썬은 Javascript에 비해서 직관적이고 쉽다고 설명을 들었는데 확실히 그 말이 맞는 것 같다.
명령어도 대체로 간결하고 괄호가 적고(!) 줄바꿈과 정렬만으로 작동이 되는 것이 상당히 편하긴 했다.
물론 처음하는 만큼 쉽다고는 해도 처음부터 술술 풀리지는 않은 것 같다.
그리고 파이썬을 이용해 자료를 크롤링하는 방법을 배웠는데,
이거 같은 경우는 그냥 실생활에서도 활용해볼 만한 거 같다.
python 기본:
fruits = ['사과','배','감','귤']
for fruit in fruits:
print(fruit)
def get_age(myname):
for person in people:
if person['name'] == myname:
return person['age']
return '해당하는 이름이 없습니다'
a_list = []
a_list.append
a_dict = {}
people = [{'name':'bob','age':20},{'name':'carry','age':38}]
def f(x):
return 2*x+3
def sum_all(a,b,c):
return a+b+c
def mul(a,b):
return a*b
result = sum_all(1,2,3) + mul(10,10)
def oddeven(num): # oddeven이라는 이름의 함수를 정의한다. num을 변수로 받는다.
if num % 2 == 0: # num을 2로 나눈 나머지가 0이면
return True # True (참)을 반환한다.
else: # 아니면,
return False # False (거짓)을 반환한다..
def is_adult(age):
if age > 20:
print('성인입니다') # 조건이 참이면 성인입니다를 출력
else: print('청소년이에요') # 조건이 거짓이면 청소년이에요를 출력
크롤링할 때는 bs4패키지를 이용
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.nhn?sel=pnt&date=20200303',headers=headers)
# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
추출할 때에는 추출할 부분 우클릭 Copy → Copy selector로 선택자를 복사할 수 있음
soup = BeautifulSoup(data.text, 'html.parser')
#############################
# (입맛에 맞게 코딩) #############
################
DB에 대해서도 배웠는데,
RDBMS(SQL): 이것은 마치 엑셀처럼 데이터를 정해진 데이터를 표처럼 한줄씩 쌓아나가는 형식이다
중간에 데이터를 추가하기는 어려우나 정형화된 데이터의 일관성과 분석에 용이한 방식이다
(My-SQL, MS-SQL)
No-SQL(Not only): 이것은 딕셔너리 형식으로 데이터를 저장해둘 수 있는 방식이다. 데이터마다 다른 값을 자유롭게 가 지게 할 수 있다. 자유로운 데이터 적재가 가능하다.
(mongoDB)
그리고 DB 다룰 때 기본 기능
*users 부분에 db파일 이름을 제대로 쓸 것*
# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})
# 여러개 찾기 - 예시
( _id 값은 제외하고 출력) same_ages = list(db.users.find({'age':21},{'_id':False}))
# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
# 지우기 - 예시
db.users.delete_one({'name':'bobby'})
from pymongo import MongoClient # pymongo를 임포트 하기(패키지 인스톨 먼저 해야겠죠?)
client = MongoClient('localhost', 27017) # mongoDB는 27017 포트로 돌아갑니다.
db = client.dbsparta # 'dbsparta'라는 이름의 db를 만듭니다.
그리고 이번 주차 숙제인 지니뮤직 크롤링하기
////
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
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=D&ymd=20200403&hh=23&rtm=N&pg=1',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
#body-content > div.newest-list > div > table > tbody
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1)
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
#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(2) > td.info > a.artist.ellipsis
trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
# .text[0:2] >> 문자열 인덱싱 "0번째부터 2번째까지의 문자열만 뽑아낸다"
for tr in trs:
rank = tr.select_one('td.number').text[0:2].strip()
singer = tr.select_one('td.info > a.artist.ellipsis').text.strip()
song = tr.select_one('td.info > a.title.ellipsis').text.strip()
print(rank,singer,song)
1 조정석 아로하
2 가호 (Gaho) 시작
3 엠씨더맥스 (M.C the MAX) 처음처럼
4 임영웅 이제 나만 믿어요
5 지코 (ZICO) 아무노래
6 장범준 흔들리는 꽃들 속에서 네 샴푸향이 느껴진거야
7 권진아 뭔가 잘못됐어
8 ITZY (있지) WANNABE
9 하현우 (국카스텐) 돌덩이
10 오반 (OVAN) 어떻게 지내 (Prod. by VAN.C)
11 창모 (CHANGMO) METEOR
12 규현 (KYUHYUN) 화려하지 않은 고백
13 김필 그때 그 아인
14 아이유 (IU) Blueming
15 노을 문득
16 아이유 (IU) 마음을 드려요
17 방탄소년단 ON
18 노을 늦은 밤 너의 집 앞 골목길에서
19 조이 (JOY) 좋은 사람 있으면 소개시켜줘
20 WINNER 뜸
21 Red Velvet (레드벨벳) Psycho
22 IZ*ONE (아이즈원) FIESTA
23 진민호 반만
24 Anne-Marie 2002
25 마마무(Mamamoo) HIP
26 마크툽 (Maktub) 오늘도 빛나는 너에게 (To You My Light) (Feat.이라온)
27 AKMU (악뮤) 어떻게 이별까지 사랑하겠어, 널 사랑하는 거지
28 방탄소년단 작은 것들을 위한 시 (Boy With Luv) (Feat. Halsey)
29 Maroon 5 Memories
30 Dua Lipa Don't Start Now
31 폴킴 안녕
32 백예린 (Yerin Baek) 다시 난, 여기
33 폴킴 모든 날, 모든 순간 (Every day, Every Moment)
34 아이유 (IU) Love poem
35 개코 바빠서 (Feat. 헤이즈)
36 코드 쿤스트 (CODE KUNST) 꽃 (flower) (Feat. 박재범 & 우원재 & 기리보이)
37 백예린 (Yerin Baek) Square (2017)
38 장범준 노래방에서
39 Billie Eilish bad guy
40 임재현 조금 취했어 (Prod. by 2soo)
41 V.O.S 잘 지내고 있는지 궁금해
42 HYNN (박혜원) 시든 꽃에 물을 주듯
43 박경 새로고침 (Feat. 강민경 of 다비치)
44 전상근 사랑이란 멜로는 없어
45 버스커 버스커 (Busker Busker) 벚꽃 엔딩
46 신예영 우리 왜 헤어져야 해
47 씨야 (SeeYa) 사랑의 인사
48 HYNN (박혜원) 아무렇지 않게, 안녕
49 Lauv Paris In The Rain
50 잔나비 주저하는 연인들을 위해
////
이번 것은 대체로 쉬웠지만, 중간에 rank부분에서 text출력 시 다른 글자까지 나오는 바람에 조금 귀찮았다.
구글링 결과, 문자열 인덱싱이란 걸 활용해서, 내가 필요한 부분은 순위 부분만 뽑아내면 되기 때문에 text함수에 문자열 인덱싱을 활용해서 0번째 문자열부터 2번째 문자열까지만 뽑고 나머지는 strip()으로 공백을 제거했다.
그렇게 한 결과 코드 아래와 같은 결과값을 얻을 수 있었다.