본문 바로가기
개발일지

[내일배움단] 웹개발 종합반 3주차 (feat. 스파르타코딩클럽)

by 창조하는 인간 2022. 8. 14.

웹개발 종합반 3주차

 

 

 

오늘 정리할 3주 차 개발일지는 삽질의 흔적을 고스란히 담을 것 같다. 

api를 통해 데이터 크롤링의 원리에 대해 배우고, 

실제로 데이터 크롤링을 해봤다. 

크롤링한 데이터를 기존에 만들고 있었던 일명 '스파르타피디아'에 붙여 넣어서 꽤 그럴싸한 영화 소개 페이지의 형태를 구현했다.

 

홈페이지가 꽤 그럴싸해져서 기뻤다.

 

여기까진 즐거웠는데... 

 

파이썬으로 넘어갈 때만 해도 의욕이 충만했었다. 

 

파이썬 수업 들었던 거 생각하면서 코드 쓰고 출력해서 확인해보고 하는 작업을 한다고 생각했다. 

 

파이썬도 마찬가지로 변수, 자료형, 함수, 조건문, 반복문 의 다섯 가지 형태를 기본적으로 배웠다. 

배웠다기보단 훨씬 직관적인 파이썬의 특징을 잘 보여준 거 같았다. 

아직 자바스크립트도 위태위태 하기 때문에 ㅋㅋㅋ 

혼란스럽지 않게 구분을 해주는 게 초보자의 제1 과제.. ㅋㅋㅋㅋ 

외워서 쓰는 단계를 걱정하기 앞서 코드를 딱보고 아 이건 자바스크립트네, 아 이건 파이썬이네 할 수 있기만 해도 성공적이라고 하겠다. 

어쨌든 이 5가지 형태를 훑고 바로 크롤링하러 진도 나갔다. 

5가지 형태 노트 복붙은 접은 글 참조

더보기

그전에, 파이참에서 파이썬을 사용하는 방법.  

 

먼저 바탕화면에 만들어둔 sparta 폴더 안에 pythonprac이라는 폴더를 새로 만든다. 

그다음 파이참으로 와서 파일-새프로젝트-순수python-위치를 pythonprac으로 지정해 준다.

 

 

 

파이참 파이썬 폴더 지정방법

venv가 자동으로 잘 잡혀있는지 확인한다. 

기본 인터프리터가 python3.8이라는 것으로 잘 들어오는지 확인한다. 

 

웰컴 스크립트 생성이 체크되어있다면, 해제시킨다. 

해제시켜야겠네..

 

main.py 웰컴스크립트 생성 체크 해제

 

 

그다음 생성을 누르면, 다음과 같은 창이 뜬다. 

 

이 창(T)를 누르면 된다. 영어로는 this window

 

 

파이썬 구동 초기화면

 

이렇게 뜨면 venv 없는 폴더처럼 대해주면 된다. 안에 아무것도 건들지 않기. 

 

파이썬 파일을 만드는 경로

 

hello.py 파일을 만들자. 

최초로 뜬 창에 

print(‘hello Sparta!!’)라고 치고 ctrl/commend +s  눌러서 저장한다. 

 

그런 다음 오른쪽 마우스 클릭해서 실행을 클릭해본다. 단축키가 있네? ㅋㅋㅋ 외울수 있을까..

실행 버튼들이 여기저기있는데, 다른 것이 실행될 수도 있어서 초보자 시절에는 그냥 마우스 오른쪽 클릭해서 실행을 누르는 것을 추천한다. 

hello sparta!! 의 출력화면

 

파이썬 문법은 자바스크립트 문법보다 훨씬 직관적이라고 한다.

 

드디어 프로그래밍 언어의 5가지 형태 

 

1. 변수 

 

a = 2 

b = 3 

 

이렇게 지정할 수있다. Let 은 필요가 없다. 

또 문자도 합칠 수 있는데, a에는 이름 b에는 성을 쓰면 문자열을 합쳐준다. 

당연히 문자열은 작은따옴표를 잊지 말자. 

print() 한다음 실행해보면 결과값이 그대로 찍히는 걸 볼수 있다.

2. 자료형 (리스트, 딕셔너리) 

자료 형태인 리스트도 있다. 

 

a_list = [‘사과’, ‘배’, ‘감’]

 

print(a_list[1])

 

라고 하면 1번째인 뜬다. 

 

사진이 너무 많이 드니깐 쭉쭉 넘어가겠다. 

 

list에 추가하는 것은 자바스크립트에서는 .push() 였는데, 

파이썬은 .append()이다 

 

외우지 않아도 나중에 파이썬 리스트 추가로 검색하면 다 나온다. 

우선 수박을 추가해 보자

 

수박을 추가한 최종 리스트

 

딕셔너리도 똑같다. 

Dictionary

 

a_dict = {‘name’ : ’bob’ , ‘age’ : 27} 

 

이것을 출력해보자. 

쓸 때 알아보기 쉽게 열을 맞추는 것이 좋다. 

name 가져오자는 명령을 하면, bob 보여준다. 

 

줄맞추는거 대문자소문자에 민감한 파이썬

 

3. 함수 

 

함수는 def sum(a,b) : 

           return a+b

 

라고 쓴다.

여기서 콜론을 빼먹으면 안 된다..

괄호 대신 콜론을 쓰는 듯하다. 줄을 맞춰서 쓸 거니까.

 

result = sum(1,2)

print(result)라고 출력해본다. 

 

이것은 1,2를 넣어서 나를 변신(return)시키라는 의미이다. 

따라서 1+2 값인 3 출력되었다. 

 

그다음 sum과 return사이에 print(‘더하자!’) 를 넣어보자. 

그러면 먼저 읽힌 더하자! 출력되고출력되고 그다음 return 시킨결괏값 3 나오게 된다. 

 

사진을 너무 많이 넣으면 안되지 않을까.. 블로그..

 

4. 조건문 (if, else) 

함수를 함께 써본다.

 

def is_adult(age):

      If age > 20:

          print(‘성인입니다’) 

      else:

          print(‘청소년입니다’) 

 

줄을 맞춰 쓰는 거, 콜론을 빼먹으면 안 되겠다.  

콜론을 써주면 그 범위는 마치 괄호를 한 것처럼 그것의 범위가 된다. 

탭을 한번 범위를 자신의 것으로 가져가기 때문에 들여쓰기가 파이썬에서는 굉장히 중요하다. 

 

조건문은 질리게 쓰게 된다

 

5. 반복문 (for in) 

 

fruits = ['사과', '배', '배', '감', '수박', '귤', '딸기', '사과', '배', '수박']

 

라는 리스트가 있다. 

 

for fruit in fruits: 

      print(fruit) 

 

라고 하고 결과를 우선 살펴보면, 

쭉 나열되는 것을 볼수 있다.

 

자바스크립트 보면, 

반복문은 어차피 리스트와 같이 쓴다. 

rows 이런 거 써서. 

 

그런데 파이썬은 애당초 list와 함께 쓰도록 기획이 되어있어서 리스트의 요소를 하나씩 꺼내서 내용물로 쓴다라는 의미로 저렇게 작성하게 된다. 

(이 부분을 이해하려면 크롤링하고 데이터베이스화 된 걸 불러오고 하는 과정을 배우면 된다) 

 

저기서  for 뒤에는 아무거나 써도 되고, 그것을 print() 안에 정확하게 써주기만 하면 된다. 

 

for 지정명 in 리스트명

     print(지정명) 

 

의 구조로 되어있는 것이다. 

 

이건 출력을 해보면 리스트의 전체를 출력해준다. 

 

이렇게도 실행해볼 수 있는데, 

 

count를 0으로 지정해주고, 

for 지정명 in fruits:

      If 지정명 == ‘사과’: 

            Count += 1

 

print(count) 

 

만약 지정명이 사과라면, 리스트를 한번 훑어 더해달라는 명령어이다. 리스트 내에 있는 사과는 총 2개이므로 

2가 출력되었다. 

 

count +=2 하면 4라는 리스트를두 번 훑어서 사과의 개수를 샌 결괏값이 나온다.

배로 지정해주고 2 훑어달라고 했더니총 6개라는 결괏값이 도출되었다. 

배가 도출되었다. 사진은 한장만.

 

딕셔너리를 활용한 조건문을 배워보자. 뒤에 가면 계속 나온다. 

 

people = [{'name': 'bob', 'age': 20},

          {'name': 'carry', 'age': 38},

          {'name': 'john', 'age': 7},

          {'name': 'smith', 'age': 17},

          {'name': 'ben', 'age': 27}]

 

 people이라고 하는 리스트 안에 각각 딕셔너리가 들어있다. 

 

for person in people: 

 

이라고 칠 건데, 보통 for 단수 in 복수로 작성한다고 한다. 

물론 앞서 말했듯 뭘로 지정을 하든 상관은 없다. 

리스트에서 하나씩 꺼내서 쓰겠다는 지정을 해줄 뿐이다. 

 

age 20 넘는 name값을 출력해달라고 요청해보자. 

 

age > 20 출력값

다시 한번 강조하지만, 들여 쓰기에 신경 써야 한다. 

안 그러면 오류가 뜬다.. 

 

20 넘는 name값은 carry 와 ben 이다. 

 

조건문을쓸 때가 파이썬이자바스크립트와 가장 다른 부분이다. 

 

 

크롤링 

 

문법만 주야장천 외워봤자 응용이 안되면 말짱 도루묵이다. 

수학공식만 백날 외워봤자 문제 하나 못 풀면 그건 수학을 공부했다고 할 수 없듯이 말이다. 

 

크롤링을 하려면 남들이 만들어 놓은 라이브러리를 사용해야 한단다. 

그걸 패키지라고 부르는데, 별도로 설치가 가능했다. 

 

파이참에 파이썬을 설치할 때 유령마냥 내버려 두었던 폴더가 있었는데 

virtual environment의 약자인 venv 폴더였다. 

 

가상 환경이라는 뜻인데, 프로젝트별로 패키지들을 담을 공구함을 말한다고 한다. 

(이 의미를 잊어버려서 삽질이 더욱 고단했다.. )

 

회사에서는 a,b,c 패키지를 쓰고, 

개인 프로젝트에서는 b,c,d,e를 설치해서 쓰고 있었다. 

 

그런데 갑자기 회사 팀장님이 b를 그 이전 버전인 b'로 쓰자고 하시면, 

같은 컴퓨터에 깔려있는 개인 프로젝트에서도 b가 b'로 바뀔까??? 

그렇지 않다는 것이다. 

프로젝트별로 패키지를 담았기 때문에 a,b',c가 회사 프로젝트 패키지들이고, 

개인 프로젝트 속 패키지 b,c,d,e는 영향을 전혀 받지 않는다. 

별도의 가상 환경이기 때문이다. 

 

삽질을 한번 하고서 필기해둔 내용을 바탕으로 한번 더 풀어쓰니 훨씬 이해가 잘 된다. 

 

지금 현재 나의 프로젝트는 바탕화면에 깔려있는  sparta라는 폴더 안에 들어있는데, javascript는 frontend 라는 폴더에 있고, 

python은 pythonprac 이라는 폴더에 있다. 이게 각각의 프로젝트가 되는 것이다. 

그래서 만약 다른 패키지를 활용한 파이썬을 쓰고 싶다면 새로운 폴더를 만들어서 사용하면 된다. 

 

패키지를 설치하는 방법은 접은 글 참조 

 

더보기

파이참에서 파이썬 패키지를 설치하는 방법

 

파일 - 설정  (window) - 프로젝트:pythonprac - python 인터프리터 

Pycharm - preferences (Mac) - 프로젝트:pythonprac - python 인터프리터 

 

나는 맥이니까 preferences를 타고 흘러들어갔다.

( 점점 삽질의 시간이 다가오네.. )

인터프리터 최초의 화면

 

그다음 + 버튼을 찾아서 누르면 검색창이 뜨는데 거기에 requests라고 친다. 

상단에 있는 +버튼 꾹. 

 

여기서 모든 패키지를 설치할 수 있다.

 이 프로젝트에 맞는 패키지를 설치하려면 꼭 여기서 설치해야 한다. 

안 그러면 적용이 안된다 ^___^ 

request 패키지는 ajax 역할을 하는 것이라고 한다. 

 

설치가 잘 되었다. 

설치한 requests를 써보자 

 

스파르타코딩클럽에서 제공한 코드 스니펫을 복붙 해서 보니 또 미세먼지 데이터.. 

일단 rjson 출력해보자. 

 

초보자에게 미세먼지 데이터는 소중하다.

 

mport requests는 말 그대로 requests라는 라이브러리를 쓸 거라는 의미이다. 

 

리퀘스츠 라이브러리는 이 형태로 사용한다고 한다.

이렇게 쓰라고 하는 건 만든 사람의 마음이기 때문에 출처 사이트를 방문해서 찾아보거나 블로그 검색을 해보면 사용 방법이 나온다.

파이썬의 문법이 아니고 패키지를 만든 사람의 문법이다.  

 

여기서 rows = rjson['RealtimeCityAir’] [‘row] 

 

를 추가해서 출력해보면, 

 

가로로 쫙 나열되었지만 소중하다.

이걸 반복문 (for in) 으로 돌리면, 

뜬다. 

반복문으로 구동된 결과값

 

구 이름과 미세먼지 값만 추출해보자. 

let을 안 써도 되어서 훨씬 간결한 명령을 할 수가 있다. 

 

직관적인 파이썬

 

이것을 출력할 당시 미세먼지 농도가 옅었기 때문에 미세먼지 값이 35보다 작은 구의 이름만 추출해 보았다. 

실시간 값이라서 수업내용과는 다른 숫자를 써보았다. 

날씨는 흐리지만 미세먼지는 좋구나.. 비가 그렇게 퍼붓더니. 

 

구이름들만 추출되었다

 

 

이제 본격적으로 파이썬을 활용해서 크롤링을 하는 방법을 배워본다. 

 

웹스크래핑(크롤링)의 기초 

 

네이버 영화페이지

 

네이버 영화 페이지를 가져오셨다. 

랭킹 순위와 영화 제목, 영화 평점을 한눈에 볼 수 있는 페이지다.

 

처음에는 간단하게 영화 제목들만 불러와서 쭉 나열해본다.

 

크롤링을 하려면 두 가지를 해야 한다. 

첫 번째는 크롤링하고자 하는 페이지에 요청해서 html을 가져오는 것. 

이것은 이미 requests 라이브러리를 가지고 가져오기를 해보았다. 미세먼지 데이터 url이 붙어있던 그 자리! 

두 번째는 그 안에서 저 제목들만 쉽게 찾아서 긁어야 하는데 이때 쉽게 찾을 수 있도록 해주는 라이브러리가 있다. 

beautifulsoup 이라는 라이브러리이다. 이거… nft 민팅 할 때 해봤던 거 같은데.. 

우선 이 라이브러리도 설치하자. 

 

Pycharm - preferences - 프로젝트 :pythonprac - python 인터프리터 - +버튼 - bs4 검색 - bs4선택 - 패키지 설치 클릭 

(사진은 생략한다.)

 

크롤링의 기본 세팅이 되는 코드값을 받았다. 

앞으로는 이걸 복붙 하면서 쓸 예정이다. 

친절하게 url도 붙여 넣어주셨다. 

크롤링의 기본 셋팅

이게 기본 세팅 값이라고 한다.

외워서 쓰는 것이 아니라 복붙 해서 쓰신다고. 

 

headers는 코드에서 콜을 날리는데 마치 사람이 브라우저에서 콜을 날린 것처럼 해주려고 쓰는 것이란다. 

흠.. 찾아봐야겠다... 어쨌거나 끝부분에 들어간다. 

 

크롤링을 하려면 그냥 이 기본 세팅 골격을 복사해서 붙여 넣기 하고 보고 싶은 웹페이지의 url만 갈아껴서 보면 된다. 

깊이는들어가지 말자궁. 

 

이제부터 배우는 것도 파이썬 문법이 아니라 beautifulsoup의 사용법이다. 

 

보고 싶은 제목 위에 마우스 커서 올려두고 오른쪽 마우스 클릭해서 검사 창을 띄우면 

elements에서 그 부분만 지정해 보여준다. 

여기에 오른쪽 마우스 클릭한   copy - copy selector 해가지고물론 나는 한국어로 되어있었다.

selector 복사는 copy selector

 

복사 - selector 복사 

 

복사한 뒤에 파이참으로 넘어와서 

다음과 같이 작성한다. 

 

title = soup.select_one()

 

빈 괄호 안에 복사한 것을 그대로 붙여 넣는다. 

이때 작은따옴표 잊지 말 것. 안 그럼 오류가 뜬다. 

밥정이라는 영화 제목의 코드를 가져왔기 때문에 딱 결괏값으로 띄워준다. 

다시 말하지만 이건 파이썬 문법이 아니라, beautifulsoup이라는 라이브러리의 사용법이었다. 

 

print(title.text) 라고 하면 밥 정이라고 하는 태그만 딱 나온다. 

 

제목 밥정 만 출력된 것을 볼 수 있다

 

깨알 꿀팁 접은 글

더보기
파랗게 된 부분

 

파랗게 선택한 태그 값을 찾고 싶을 때 어떻게 하냐면, 

print(title['href’])라고 치면 된다. 

불러내기 참 쉽쥬?

 

뭐든 불러낼 수 있구나. 

어떤 부분이든. 

 

 

 

그렇다면, 리스트 형태의 데이터를 뽑아서 가져와 보자. 

 

영화 페이지에서 제목 2개만 선택해서 seletor 복사해서 두줄 붙여 넣기 해보면, 

숫자만 달라지고 앞뒤로 문자열이 동일한 것을 볼 수 있다. 

 

이것을 soup.select(‘’) 해서 겹치는 앞부분을 넣고 출력해보면 

 

리스트 형태의 데이터 값을 출력해준다.

모를때는 붙여넣기 해서 확인을 해보자.

 

이게 무슨 값이냐고 하면 

웹사이트에서 바로확인해볼 수 있다.

 

대조하면서 어떤 항목인지 볼 수 있다

 

바로 <tr></tr> 로 구성된 덩어리 하나하나를 지칭하는 것으로 알 수 있다.

그게 곧 화면에서는 영화의 제목 부분을 나타내는 것이다. 

 

  <tr></tr> 중에서는 가로선으로만이루어진 것도 있는데,이걸 반복문으로 돌려보면 다음과 같이 출력된다. 

 

영화제목쪽 주소만 리스트업 되었다

 

movie로 지칭하고 movies 리스트에서 movie 한 개를 추출할 건데, a 값을 추출할 것이다. 

하면 a 태그만 쭉 추출해준다. 

 

이때,  None 이 보인다.  바로 라인으로 처리된 부분이 전부 none으로 출력되고 있기 때문이다. 

 

저 none을 없애주어야 한다. 

 

그때는 조건문을 사용한다. 만약 a 가 none이 아닐 때, a의 값을 출력해보자 

같을 때는 == 등호 두 개를 쓰고, 같지 않다고 할때는 != 를 썼는데, 

파이썬에서는!=를 써도 되지만,  조금 더 직관적으로 

 

 is not을 쓴다. 

 

그러면 none 이 사라진 것을 확인할 수 있다. 

이상태에서 

 print(a.text)로 출력문을 바꾸면, 제목만 출력해주는 것을 볼 수 있다. 

 

신기한 크롤링의 세계

 

퀴즈. 순위, 영화명, 평점을 크롤링 하자 

hint

우선순위는 alt 값을 가지고 오면 된다. 

어떻게 가지고 오지? 

평점도 마찬가지로 selector 복사해서  가지고 오면 되는데.. 

 

잘 들여다보면 보이는 alt 값

 

Alt 값을 추출하는 방법을 모르겠어서 … 

삽질 중… 

 

따로 빼서 정의하지 않고 그냥 rank 옆에 movie.select_one() 해주면 되고, 

먼저 랭크 값을 확인해보면 저렇게 뜬다. 

 

저기서 alt 값만 추출하고 싶기 때문에, 

 

print(rank[‘alt’]) 라고 하면 된다. 

단순한건지 어려운건지 모르겠다

 그러면 최종 출력할 땐 어떻게 해야 하는가.. 

 

일단 지웠던 star를 다시 되살렸다. 

p로 지정해주고 텍스트로 바꾼다는 거 해주려고 위에다 썼다. 

 

rank 경우 [‘alt’] movie.select_one() 뒤에 붙여줘도 무방하므로 그렇게 붙였다. 

결괏값은 이렇게 나왔다. 

내 초기 결과값

 

 

 

이게 맞는 건가..강사님의 해설을 확인해보니, 

.text를 그냥 뒤에 붙여버렸다. … 

 

파이썬… 마이 직관적이네.. 

암튼, 퀴즈 완성! 

강사님의 답안대로 수정해보기

 

이제 이 크롤링한 정보를 이렇게 보고만 끝내는 것이 아니라 데이터베이스에 넣는 작업을 배운다고 한다. 

 

오늘 목표한 세 시간 안에 겨우 이 정도를 들었다. 

시간이 조금 오버되겠지만, 나머지도 다 연달아 들어야겠다. 

데이터베이스에 넣고 빼서 활용하는 것,

내가 가장 궁금했던 부분이다. 

편안히 들으라고 하셨지만, 나는 이게 궁금했다. ㅋㅋㅋ 

 

데이터베이스에 관한 지식 정리는 접은 글 참조 

 

더보기

데이터베이스란? 

우리가 방 정리를 하는 이유는 나중에 잘 찾아서 쓰기 위해서 이다. 

책방 가서 책을 찾을 때도 섹션별로, 출판사, 책 제목으로 분류가 되어있다면, 

어떤 출판사를 딱 지정해서 그 출판사 책을 다 주세요라고 할 경우  출판사만 딱 추출해서 뽑으면 된다. 

만약 “코딩”이라는 단어가 들어가는 제목의 책을 다 달라고 할 경우에 책 제목 하나하나를 살펴보아야 한다. 

 

이렇게 정리가 되어있는 순서를 index라고 한다. 

 

데이터베이스는 이 인덱스라는 순서로 잘 정렬이 되어있고, 원하는 정보를 딱 뽑았을 때 일일이 검토하지 않아도 한 번에 잘 추출해줄 수 있게끔 만드는데 그 목적이 있다. 

 

결국 잘 뽑아 쓰기 위해서 잘 저장된 것이 바로 데이터베이스이다. 

 

데이터베이스에는 크게 두 가지가 있다. 

 

칸을 만들어두고 뭔가를 채우는 느낌의 SQL 이 그 첫 번째. 

이것은 엑셀 빈칸에 이름, 나이 등의 항목을 채우는 것과 비슷하다고 생각하면 된다. 

 

다른 하나는 정해진 칸이 없이 들어오는 대로 쌓는  NoSQL이다. Not only SQL  

 

SQL의 장점은 정형화되어있어서 이상한 데이터가 유입되어있지 않고, 빨리 추출이 가능하다. 

그러나 유연하게 대처하는 것이 조금 어렵다. 

 

반면 NoSQL은 그때그때 쌓이기 때문에 나름 유연하게 변경 가능하다.

그래서 초기 스타트업에서 많이 사용하는 방식이다.  

 

NoSQL의 대표적인 것이 mongoDB이다. 

SQL 대표적인 것은 MySQL 있다. 

 

수업화면을 캡쳐해보았다..

 

데이터베이스의 실체는 무엇일까? 

 

DB는 그냥 프로그램이다. 

즉, 어떤 목적을 위해 설치해서 쓰는 포토샵, 일러스트, 파워포인트 같은 프로그램이다. 

 

데이터를 잘 쌓고, 잘 추출하기 위해 설치해서 쓰는 프로그램의 개념으로 알아두면 쉽다. 

 

내 컴퓨터에  DB를 깔 수도 있지만, 요새 트렌드는 클라우드. 

 

유저가 몰리거나, DB를 백업해야 하거나, 모니터링 하기가 아주 용이하기 때문이다. 

 

mongoDB atlas (드디어.. 삽질의 시작) 

이 수업에서도 최신 클라우드 서비스인 mongoDB Atlas를 사용해 볼 것이다.

연습하는 선에서는 무료라고 한다. 

 

가입을 해야겠지… 

 

https://account.mongodb.com/account/register

 

구글 계정 연동해서 써야지… 

 

첨에 들어가서 얘네가 시키는 대로 퀵 설정을 하려고 하면 헷갈리니까 

강사님의 설명을 따라가려면, 

Database 탭을 켜서 connect를 누르고,

 

 

여기까지도 정말 시키는대로 했다 ㅠ

 

 

Allow access from anywhere를 누른 뒤, 

적혀있는 그대로 두고  Add IP address를 누른다. 

 

그다음 database user 설정은 test / sparta로  했다. 

 

 

 

여기까지도 전혀 문제가 없었다

 

Connect your application을 누르면 된다. 

그리고 파이썬 3.8을 쓰고 있으니까 거기에 맞게 드라이버랑 버전을 설정해주어야 한다. 

 

바로 이 화면을 만나야 함. 

여기까지가 mongoDB 에 요청해서 컴퓨터를 하나 배정받은 셈이라고 한다. 

이제 이걸 연결해주어야지... 했는데, 

아무리 봐도 강사님과 나의 주소가 틀린 것이다. myfirstdata라는 건 보이지도 않고 나에겐 그저 password만 바꾸라고 해서 

이 주소를 복사한 다음에 파이 참으로 가서 url 넣는 란에 붙여 넣기 하고 실행을 했는데...

 

그때부터 암흑의 서막이 열렸다... 

 

아직 설명이 조금 더 남았으므로 조금 뒤에 삽질의 흔적을 정리해보겠다며..

 

우선 접속하기 위해서는 두 가지 패키지가 필요하다. 

Pymongo 와 dnspython 이다. 

설치하자. 설명은 생략한다 

 

그런 다음 dbprac 이라는 파이썬 파일을 하나 만들어서 스파르타코딩클럽에서 제공한 코드스니펫을 붙여 넣기 한다. 

mongodb 쓰기 위한기본 형태의 코드인데,

url 만 바꿔끼면 되는 기본골격이라고 했다

 

url을 붙여 넣기 해줘야 한다. 

바로 앞서 만난 화면 하단에 나와있는 코드를 복사 붙여넣기 해준다. 

 

붙여넣기 한 기본 골격

 

password부분에 패스워드로 설정한 sparta를 써준다. 

강사님의 화면 속 url에서는 뒷부분에 MyfirstDatabase라고 되어있던데 나는 그 부분이 없고 바로 물음표로 시작하고 있다. 굳이 넣어줄 필요 없지 않을까; 

웹사이트에서도 password 부분만 바꾸라고 했으니 말이다. 

 

그런 다음 바로 데이터를 하나 넣어보자. 

Doc = {}를 쓴단다. doc는 당연히 document의 약자. 

 

따라 쓰라고 해서 쭉따라 썼는데,안된다. 전혀 연결이 안 됐다. 

 

삽질의 흔적들 접은 글 

더보기

myfirstDatabase 부분이 없지만, 한번 넣어봐야겠다. Cluster0으로. - 안됐다.

아무리 해도 안되어 찾아보니 내가 지금 m1칩을 쓰고 있어서그런 건가싶어 유튜브와 구글링을 통해서다시 한번설치해보기로 했다. 

- 이럴필요 없었다. 

먼저  brew.sh 가서 링크를 복사한 후에 붙여 넣기 해서 homebrew 설치한다. - 프로젝트의 위치가 달라 전혀 적용이 안됐다.

이후 몇 번을 더 깔았는지 몰라.. 

일단 터미널 상에서는 atlas도 깔았고, 라이브러리들도 전부다 업데이트 되어있다. 

파이참에 적용이 안될 뿐.. 

mongoDB 커뮤니티도 깔았다. 심지어 로제타 터미널을 써가면서. - 당연히 안됐다. 

설치하는 동안 다시 현실 자각 타임..

아니, 왜? 아틀라스를 써서 클라우드로 접속할 건데 왜 몽고 디비를 깔아보는 걸까 나는.. 

자꾸 안 되니깐, 일단 검색하고 검색해서 이런 방법을 찾게 된 건데 어떻게든 문제를 해결하면 되지 않겠냐며..

결국 오늘 통으로 날렸다 ㅋㅋㅋ 강의가 아직 뒤에 조금 밀려있는데 

그렇게 설치가 되고 나면, 복잡하니까 command+ K 해서 한번 깨끗하게 쏵 밀자. 

터미널의 사용방법까지 익히게 되었다. 

 

 

몽고DB 공식 사이트 속 커뮤니티 설치법

 

저기 나온 대로 다 해봐도 당연히 안됐다. 그 오류가 아니라고.. 

괜히 설치해서 구동시키기까지 했다. 

서비스를 중지하려면, brew services stop mongodb-community@6.0 을 꼭 쳐줘야 했다... 

 

이렇게 해도 안되고, 저렇게 해도 안된다. 

그렇다면 다시 처음으로 돌아가서.. 

파이 참에서 뜨는오류코드 중아무거나 복사붙여 넣기구글링을 해보았다. 

 

그랬더니첫 페이지에나와 똑같은 질문을 사람이 있다. 

 

그래 이거인가?

들어가 보니 대충 비슷한 상황인가 싶어서 답변을 찾아보았다

요샌 번역이 너무 편하다.. 

이 답변이 유효했다

답변이 달린걸 대충 보니 dnspython이 오래되어 그렇다는데, 이걸 업데이트 다시 깔아보라고 한다. 

 pip는 그냥 윈도우 일 때 쓰고 뒤에 3이 붙는 건 맥용이라고 … nft 민팅할때 대충 찾아봤던 거 같은데 암튼 

 pip3 install dnspython 을 치니 

여전히 터미널에서 삽질중...

 

버전 19.2.3이 깔려있는데, 22.2.2 까지도 쓸 수 있단다. 

업그레이드하고 싶으면 시키는 대로  pip install —upgrade pip라고 치면 되겠다. 

맥에서는 저렇게 시키는 대로 치면 인식을 못한다… 3을 붙여줘야 한다. 

뒤쪽 pip 는 그냥 pip 인가보다 앞에 pip에만 3을 붙여주면 된다. 

 

pip3 install —upgrade pip 

이렇게. 

그러면 설치가 되었다. 

 

다시 파이참으로 가서 실행을 시켜본다… 

그런데도 안된다 ㅠㅠㅠㅠㅠㅠㅠ 

 

앞서 이야기했지만, 프로젝트가 달라서 적용이 전혀 되지 않았다.

그래서 이번에는 파이참에서 라이브러리업데이트하는법을 찾아봤다. 

 

오.. 일단 원래 깔려있던 버전이 1. 15.0 이었다며… ㅠㅠ 

내가 아까 쭉 깔았던 건 파이 참과는 별개로 삽질을 했나 보다… 

이거를 2.2.1로 업데이트 시키겠다. 

 

업데이트 가능한 항목에 대해서는 화살표가 뜨기 때문에 패치 지를 다시 설치하면서, 

버전을 따로 지정해주어야 한다. 

 

보통은 최신버전이 깔리는데... 왜그랬을까..

 

이렇게 지정해주고 깔면, 최신 버전이 깔린다. 물론 아까 2.2.2 까지도 쓸 수 있다고 봤지만,, 

파이참에서는 2.2.1이 최신 버전…! 

 

후… 이제 다시 시도해본다… ㅠㅠ 

5초 뒤에 떠야 하는데 ㅠㅠ …. 

 

쓰다 보니 알게 된 것이 MongoClient = pyongo.mongo_client  였다 … 

 

이제는 다른 새로운 오류 발견..! 

긁어서 그대로 구글링을 해보니, 

 

역시 같은 문제에 대해 논의 하는 페이지가 있다.

 

몽고 디비가 설치되지 않아서 발생하는 오류라는데;? 

내 경우에는 [SSL: CERTIFICATE_VERIFY_FAILED] 이것과 관련이 있을 거 같다. 

 

인증에 문제가 생겼나 보다. 

비번이 틀렸나??? 

그럴 리가.. 

 

업데이트할 수 있는 패키지는 다 최신으로 갈아 꼈다 

 

그리고

또다른 유효 해결책을 발견했다.

 

이런 해결책을 봤기 때문에… 

certifi 라는 패키지를 설치해주었다. 

 

그다음 certifi를 import 해주고, tlsCAFile=certifi.where() 이라고도 써줬다.

 

과연?

해결되지않았다 … ㅠㅠ

나중에 보니 사용법이 조금 달랐던 거 같다. 이게 맞는 해법이었다. 

 

살펴보니 저 오류와 내 오류의 숫자가 다르다… 

 

pymongo.errors.ServerSelectionTimeoutError (_ssl.c:1108)

이런 오류가 떴다. 

 

그래서 그대로 구글링 했더니 이번엔 스파르타코딩클럽에서 질문한 내용도 있는 거 같다. 

 

+_+ 

 

먼저 몽고 DB 개발자 커뮤니티에 올라와있는 해결책부터 봤다. 

인증서에 문제가 있는 게 맞았구나… 

 

몽고DB 개발자 커뮤니티에 올라와있는 답변

 

스파르타코딩클럽에서 제시한 첫번째 해결법

 스파르타코딩클럽의 답변 두 개 중 짧은 거부터 해봤다. 해결이 안 됐다.

그다음 엄청 길게 올라온 답변을 살펴봤다. 정말 너무 길었다. 해결책을 제시하고 해 봤더니 안되고, 다른 방법 제시하고 해 봤더니 안되고 거기도 고군분투의 흔적이 있었다. 3일 전이라고 되어있었는데, 9일이면 꽤 지난 듯.

드디어 찾은 해결책!!!

 

내가 아까 찾은 해법의 정확한 사용법에 알고 있는 듯했고, 뒤이어 나온 해결방법을 적용했더니 나도 데이터베이스에 접속할 수 있게 되었다. 

 

해결법!! 감사합니다!!

 

certifi 패키지를 깔아서 저렇게 처리를 해주면 되는 거였다네… 

그전에 해결책에서는 그대로 쭉 이어서 써가지고 … 틀렸던 건데 저렇게 뒤에 적어줘야 적용이 되는 건가보다. 

 

 

해결된 최종버젼!

 

tlsCAFile이라고 쓴 게 색이 딱 입혀지면서 감이 좋았다. 

 

그러면 이제 데이터베이스가 잘 들어갔는지 살펴보아야겠다. 

ㅠㅠㅠㅠㅠ 12시간 넘게 걸렸다이거 하나 하는데 

너무 오래 기다리고 있었던 강의속 강사님 ㅋㅋㅋ

 

mongoDB atlas의 데이터베이스 페이지에서 Browse Collections라는 버튼을 누르면 뜬단다. 

여기서 막혀 참 답답했는데... ㅠㅠ

 

조금만 기다리면 내가 입력한 데이터 값이 잘 들어가 있는 걸 확인해 볼 수 있다. 

데이터가 잘 들어왔다.

 

험난했다 ㅠㅠㅠ 

이름은 밥, 나이는 27 이 데이터 하나 넣는데 정말 … ㅠㅠ 

 

users는 collections 중 하나로 생성되었다. 그렇게 지정을 했던 것 같다. 

db= client.dbsparta 

db.users.insert_one() 

에서 각각 이름을 지정해줬던 게 적용이 된 것인가 보다. 

 

 

지역도 강의랑 똑같이 하느라 싱가포르 한 건데, 사실 요즘은 대한민국도 있더라… 강의 속 페이지에선 없었는데.

 

어쨌든 이렇게 저렇게 해도 도저히 안 뜨니깐 별짓 다하면서 클러스트도 지웠다가, 프로젝트도 지웠다가 여러 번 다시 생성했다가, 비밀번호도 다시 고쳤다가 … 정말… 흑흑 ㅠㅠㅠㅠ 

 

 

처음에 검색해서 찾아낸 오류의 원인으로는 몽고 DB가 설치되지 않았을 거라는 오해. 

 atlas를 쓰기 때문에 설치 노노다. 

그리고 그다음에 찾아낸 오류가 오래된 라이브러리일 가능성.

꼼꼼하게 읽어보진 않았지만, 처음 오류는 이랬다. 

그래서 패키지를 설치하고 다시 입력했을 때는 모듈의 문제라고 했다. 

모듈의 문제를 해결하기 위해서는 certifi를 설치해주어야 한댔다. 

그런데 해결되지 않았고 계속 검색을 하다가 내 오류 번호가 따로 있다는 사실을 발견했다. 

다시 검색했더니 스파르타코딩클럽에서 제대로 된 답변을 가지고 있었다.. ㅋㅋㅋㅋㅋ 

휴….  

 

이번 오류에서 가장 유효했던 점은 

 

  1. 오래된 라이브러리였던 dnspython은 업데이트 해주어야 한다. 최신버젼으로. 
  2. 파이참과 터미널은 구분되어 설치된다. homebrew는 대체 어디에 깔린걸까… 
  3. 파이참에서 직접 설치하려면 파이썬 콘솔을 사용하면 된다. 하지만 업데이트 정도는 편하게 할수 있도록 인터프리터창이 잘 되어있다. 
  4. certifi 패키지를 깔아준다. 그리고 적용하는 법은 import certifi해서 ca 라고 명명해서 certifi.where()이라고 지정해준다. 그리고 url의 뒷부분에 콤마 찍고 tlsCAFile=ca 라고 넣어주면 된다. 

 

m1칩을 쓰는 새로운 맥북에서 생기는 오류였던 거 같다. 아니면 monterey OS를 쓰는 사람들의 오류이거나. 

 

해결되었으니 되었다 ㅠㅠ 

이제 진도 나갈 수 있다 ㅠㅠㅠㅠ 

정리하고 보니 간단한데 하루를 날려먹었다 ㅠㅠ 쉽지 않구나 코딩 

 

바로 진도 나가기.

언제 그랬냐는 듯 진도를 나가기 시작했다 ㅋㅋㅋ 그렇지만 머리가 몽롱한 상태..! 

어차피 딕셔너리 이기 때문에 

저렇게 입력을 하면, 데이터가 들어간단다. 

 

지역을 싱가포르가 아니라 한국으로 바꿔도 연결이 될까?

 

화면 우측 상단 쪽에 REFRESH 를 눌러준다. 

그러면 이렇게 바비 앤이들어간 것을 볼 수있다. 

 

감동이다 아직도 ㅠ

 

지금은 여러 개를 한꺼번에 넣으려다 보니 

 

db.users.insert_one({'name':'bobby', 'age': 27})

db.users.insert_one({'name':'john', 'age': 20})

db.users.insert_one({'name':'ann', 'age': 20})

 

이렇게 입력을 한 것이지만, 

 

통상적으로는 

 

doc = {‘name’:’bobby’ , ‘age’:27}

db.users.insert_one(doc) 

 

라고 입력해주어야 한단다. 

 

수업자료로 요약 코드를 제공할 예정이라 남겨두지 말고 팍팍 지워가면서 수업을 따라가자. 

 

이제 데이터를 불러와서 보는 방법이다. 

 

데이터 불러오는 기본적인 방법

 

코드를 다 외우지 말고 처음에 썼던걸 계속 가져다 쓰면서 익숙해지면 좋을 것 같다고 한다. 

 

users 컬렉션에서 id만 제거한 데이터베이스 list를 all_user이라고 명명한 뒤에 

반복문으로 출력하면 한번 쭉 훑어서 출력해주겠지. 

 

for user in all_users:

      print(user) 

 

그러면 저렇게 id 값이 없는 리스트의 내용이 쭉 뜬다. 

 

만약 bobby라는 이름 하나만 찾고 싶다면? 

 

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

이렇게 쓰면 된다. 

 

print(user) 해보면,

원하는 부분이 추출되었다.

 

이렇게 뜬다. 

id가 참 거추장스러우니 이번에도 지우려면 ,{‘_id’:False} 를 붙여주면 된다. 

파이썬은 대문자와 소문자를 구분할 수가 있다. 

정말 직관적인 언어니까 대소문자 구분을 철저하게 필요가 있다. 입력한 그대로 출력된다.

정말 직관적인 파이썬

age만 가지고 오고 싶다면 print 할 때 

print(user[‘age’])라고 명령하면 된다. 

 

이제 수정하는 방법.

 

 

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

 

이렇게 쓰면 된단다. 

 

update를 하나 할 건데, name이 bobby 인 것을 찾아서 age를 19로 수정하라는 말이다. 

적용되었는지 확인해보면, 20에서 19 바뀌어 있다. 

 

 

잘 바뀌어 있는 데이터값

 

(잘 안 쓰는) 데이터 삭제하는 방법. 

 

db.users.delete_one({'name':'bobby'})

 

name이 bobby 인 것을 delete 해달라는 말이다. 

 

실행해보면, 

 

바비없네?&nbsp; ㅋㅋㅋㅋ&nbsp; 미쳐가나보다..

복습 겸 찾아서 쓸 명령어.  접은 글 

더보기

# 저장 - 예시

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

 

 

요거를 이용해서 복붙 해가면서 쓸 것이다. 

 

이제.. 연습 시작. 

 

 

아까 크롤링했던 영화 순위 제목 별점을 데이터베이스화 하는 것. 

 

우선 작성했던 hello.py 가 여전히 잘 실행되는지 확인을 하고, 

그다음, mongoDB 명령어 복붙 해서 쓸 거 잘 챙겨서 빼놓고, (특히 나는 certifi가 적용된 url이 중요하다) 

 

컬렉션을 볼 수 있는 웹사이트는 즐겨찾기에 넣어둔다. 

그러면 이제 db 연결에는 문제가 없다고 한다. 

 

 

고생했던 그 3줄의 from import import를 hello.py 에 복붙 할 것이다. 

beautifulsoup하단에 붙이면 된단다. 

 

이렇게.

 

그다음 print 하지 말고, 저장 예시를 보면 doc을 만들어서 나열하고 

doc를 넣어달라는 요청을 했기 때문에 

일단 doc 만든다. 

그다음 db. 컬렉션명. insert_one(doc) 하면 데이터베이스가 저장되지 않을까.. 

영화니까 컬렉션명은 movies로 바꿔준다. 

db.movies.insert_one(doc)

벌써 아득한 크롤링 코드 ..

 

이제 데이터가 잘 들어갔는지 확인을 해보면, 잘 들어가 있었다. (사진 그만...)

 

이제 퀴즈. 

 

지금까지 담배 한 삼십 개비는 물고 있는 느낌이다.. ㅋㅋㅋ 뇌에 산소가 부족하면 비염이 있는 사람들에게 발생하는 현상이라는데 ㅋㅋㅋ 

코딩도 엉덩이 싸움이구나.. 

근육이 훅훅 사라지는 것이 느껴진다. 

 

퀴즈 접은 글 

 

더보기

먼저 파이썬 파일 dbmovie.py를 하나 새로 만든다. 

 

그런 다음 중요한 3줄. 데이터베이스 연결을 위해 시간을 갈아 넣었던 그 세줄을 위에 복사해서 붙여준다. 

나에겐 3줄이 아니고 5줄이다 ㅋㅋㅋ 

 

첫 번째 퀴즈. 

가버나움의 평점만 가져오기. 

한 개만 찾는 코드를 활용해야 하지 않을까. 

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

 

여기서 user를 star로 명명하고, db.movies.fine_one({‘title’:’가버나움’}) 

이라고 해주면 되지 않나 싶다. 

 

한번 해본다. 

 

불필요한 정보까지 쫙 뜬다. Star 값만 가져오고 싶은데 빼먹은 듯.. 

 

star로 명명하면 충돌이 일어날 것 같다. 

S라고만 하겠다. 

s[‘star’] 프린트해달라고 요청했더니

첫번째 퀴즈 정답!

 

9.59만 출력되는 것을 볼 수 있다. 

어떤 이름으로 명명되어있는지 데이터베이스 1개를 꼼꼼히 살펴본 후 정확하게 명령하는 것이 중요한 거 같다. 

 

두 번째 퀴즈는 가버나움의 평점과 같은 영화 제목을 함께 출력하는 것. 

결괏값이 가버나움, 그린 북 이렇게 두 개가 뜨면 된단다. 

 

3분씩 밖에 안 주신다. 

3분 만에 되는 건가? 난 왜 퍼뜩 안 떠오를까.. 

 

평점과 같으니까  star 값이 동일한 것을 찾아달라고 하면 되겠다. 

여러 개를 찾을 거고 id 값, 랭크, 평점은 안 보이고 제목만 두 개 딱딱 뜨면 된다. 

 

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

이걸 이용하면 될까.. 

 

titles라고 하고, list(db.movies.find({’star’ : 9.59})

라고 하고 제목만 보고 싶으니까 

 

print(titles[‘title]) 

이라고 한번 해보겠다. 

 

내 머리는 여기까지야.. 

 

오류가 낫다. 

나는 스타 값이 9.59 인걸 찾아달라는 명령어만 생각했는데, 

 

일단 첨으로 돌아가서, 

가버나움의 평점이 9.59라는 걸 추출하는 명령어 하단에 다시 써 내려가면 된단다. 

 

s = db.movies.find_one({'title':'가버나움'})

star = s['star']

 

그다음에 

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

 

이 형태를 변형시키는 것은 맞다. 

 

all_movies = list(db.movies.find({‘star’ : star}) 

이거를 반복문으로 1번 리스트를 쭉 훑어달라고 하면 된다. 

 

for m in all_movies :

      print(m[‘title’]) 

 

두번째 퀴즈 정답!

 

마지막 퀴즈 

 

가버나움의 평점을 0으로 만들기. 

 

이때 평점들이 전부 문자열로 들어가 있기 때문에, ‘’ 작은따옴표를 써서 ‘0’ 문자열 0으로 바꿔준다.

 

이건 2분짜리 ㅠㅠㅠ

 

 

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

 

이걸 기반으로 하면 될 거 같다. 

 

db.movies.update_one({'title':'가버나움'}, {'$set':{'star':'0'}

 

마지막 퀴즈 결과값

 

그러면 가버나움의 평점이 0이 된 것을 볼 수 있다. 

 

훌륭한 영화인데 

 

이제 대망의 숙제.

여기서 대망이다. 강사님께서는 크롤링을 알려주시며 대망의 크롤링이라고 하셨지만, 내 기준 정말 폭망이었다. 

삽질하면서 익힌 건 잊어버리진 않을 테니까.. 좋은 경험이었다며... ㅎㅎ... 터미널로 설치한 것들... 싹 지우는 법도 배워야 한다.. ㅎㅎ..  

 

숙제도 접은 글 

더보기

지니뮤직사이트에서 1~50위의 순위 제목 가수를 출력한다.

 

출력할 때는 print(rank, title, singer) 

 

앞에서 두 글자만 끊고 싶을 때는 text[0:2]를 이용하라 

 

순위와 곡 제목이 깔끔하게 나오지 않을 텐데, 여백이나 다른 글씨 때문에.. 

그때는 파이썬 내장 함수인 strip()을 잘 연구해보라고 한다. 

 

genie.py 파일을 새로 만들어서 심기일전해보기로 했다. 

 

일단 크롤링을 해와야 하고, 

크롤링해온 데이터를 데이터베이스에 입력해야 하고, 

입력된 데이터베이스에서 1위부터 50위까지 순위, 제목, 가수를 뽑아 쭉 찍어내면 되는 건가?

아니면, 크롤링만 해서 쭉 찍으면 되는 건가? 

아 데이터베이스 쓰지 말고 진행하라고 하신다. 

 

 

크롤링에 필요한 건 그 사이트의 html 값, 

파이썬으로 필요한 내용만 긁기 위해서는 beautifulsoup를 쓴다. 

 

뼈대를 일단 그대로 복붙 해서 쓰자. 

 

분명히 시간이 얼마 되지 않았는데 아득하다… 

언제 배운 건지 … ㅋㅋㅋㅋ

 

강사님 생각에는… 30분 정도 걸릴 수 있을 거 같다는데 ㅋㅋㅋㅋㅋ

 

아이고 망했네.. 

 

 

Rank, title, singer 이니까 각각에 맞게 출력해보자. 

 

먼저 뼈대 복붙 한다. 

 

그다음 

 

Songs라고 명명해주고 soup.select(‘가져오려는 항목의 selector 내용 중 콜론의 앞부분’) 

 

이때 작은따옴표를 잊지 말자. 

 

Seletor 복사는 검사창 - 요소 - 해당 항목에 마우스 커서 대로 오른쪽 마우스 버튼 클릭 후 - selector 복사를 해서 파이썬에 붙여넣기한 뒤 확인한다. 

 

대체로 

 

#body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.info > a.title.ellipsis

 

이런 형태여서 #이 붙어있는 바람에 파이썬 내부에 영향을 주지 않는 참조 글로 들어간다. 

 

> 부등호로 이어지다가 콜론으로 한번 끊기는 부분이 있다. 그 앞부분을 저기 붙여주면 된다.

 

그다음에는, 

 

차트를 쭉 훑어서 리스트를 추출하는 것인데 1위~50위라고 했으므로 범위를 … 안 해줘도 될 거 같다. 딱 50위까지 페이지를 주셨다. 

ㅋㅋㅋㅋㅋ 

 

반복문을 돌린다. 

 

for song in songs:

      Title = song.select_one(‘콜론의 뒷부분을 붙여준다’)

 

이렇게만 하면 지저분한 정보가 촤라라락 다 붙으니 딱 타이틀 제목만 보고 싶다고 명령해야 한다. 

 

. text라고 뒤에 이어 써주는 것만으로도 충분하다. 

 

거기에 한발 더 나가서 모든 공백을 싹 지우고 싶으므로. strip() 도 써준다. 

 

그러면 

 

title = song.select_one('td.info > a.title.ellipsis').text.strip()

 

이렇게 된다. 

 

여기서 해결이 안 됐던 부분이 있는데, 

 

19 곡이 있어서노래 제목앞에 19금 아이콘이 붙어있었다. 

 

저스틴 비버의 곡이었구나..

 

파이썬으로 구동하면, 19 뒤에 공백이 가득했는데, 정말 대환장 파티... 더 이상 싸울 기력이 없었다. 

 

공백의 대환장파티

 

다른 건 다 잘 나열됐는데... 

19금 아이콘 때문에 벽에 부딪혔다. 

그렇지만 또 구글링 ㅋㅋㅋ 

이번에도 스파르타 코딩클럽에서 해결해준 방법을 한번 쓰윽 보고, 따라 해 보기로 했다. 

그 과정에서 적용이 잘 안 되는 코드 부분은 수정을 했다. 내 나름대로. 

 

조건문으로 19금을 지워줘야 한다. 

만약 “19금”이 title안에 있다면~ 

 

.strip()만으로 지워지지 않았고, lstrip(“19금”) 을 해줬다. 

그랬더니 19금이라는 글자만 지워져서, lstrip()을 한번 더 해줬다. 지독하구먼.. 

 

 if "19금" in title:

    title = song.select_one('td.info > a.title.ellipsis').text.strip().lstrip("19금").lstrip()

해결법에는 title = +"19금" ~이라고 되어있고 ~lstrip('19금')이라고 되어있었지만 그러면 사라지지 않았다.

"19금"은 "19금"으로 지우는 것이 인지상정. 거기에 한번 더 꼼꼼하게 지워줬다.  

 

그리고  rank = song.select_one(‘순위-검사-요소-selector복사본의 콜론 뒷자리’).text 

 

해주면

아직 끝나지 않은 아이콘의 저주

 

순위가 오르고 내렸다는 표시가 한국어로 이렇게 당당하게… 

이건 아까 힌트 준걸 활용해서 text[0:2] 이걸 붙였다. 아직 원리를 이해하지 못했지만 쓰라고 해서 썼다.

그리고 보기 싫은 공백은 싹 지웠는데 잘 안 지워져서 한 번 더 rstrip()

 

 

rank = song.select_one('td.number').text[0:2].strip().rstrip()

singer는 쉬웠다. 

singer = song.select_one('td.info > a.artist.ellipsis').text

 

이렇게. 

 

이제 출력을 해주면 print (rank, title, singer)

출력이 다 잘됐다.  

최종 결과 화면

 

최종 코드 화면도 첨부해놔야지 

 

최종 코드 화면

3주 차도 끝났다... ㅠ 

 

아... 복습해야 된다 ㅠㅠ 정말 매분 매초가 다르게 까먹고 있다. 

뇌가 말랑말랑 하지 않아.. 

대체 무신 말인지 점점 기억이 나질 않고 ㅋㅋㅋ... 

 

오류를 한번 만나면 그 늪에 빠져서 헤어 나올 수가 없다; 

이건 정말 학창 시절에 수학 문제 풀던 그 느낌이 분명하다. 

중간에 삽질을 심하게 하는 바람에 체력이 소진되었다.

 

그래도 이렇게까지 기록을 하면서 공부를 하진 않았었기 때문에 

이건 미래의 나를 위한 기록이다. 내가 보면서 공부를 해야 한다. 

나만 알아들을 수 있는 말로만 일기를 쓴 느낌이다. 

 

4주 차, 5주 차에서는 배운 걸 기반으로 프로젝트를 해보지 않을까 싶은데…

앞서 배운 것들이 순식간에 백지처럼 하얘진 느낌이다.. 흑 ㅠㅠ 

정신을 차리자. 

 

한번 쭉들여다보면기억이 새록새록할지도! 

 

오늘 개발일지는 정말... 인간승리.. 멍청했지만. 

 

댓글