2주차에서는 javascript를 HTML과 CSS에 접목시키는 것을 배웠다면,
3주차에서는 Python, 크롤링, mongoDB를 중점적으로 배웠다.

[파이썬]
파이썬은 직관적인 편이고, 사용자가 사용하기에 언어가 쉬워 많은 함수가 생략되어있고
원하는 단어를 많이 외울 필요가 없는 장점이 있는 것 같다.
처음에 나도 파이썬으로 코딩을 공부했기 때문에 스파르타 코딩클럽에서 파이썬을 시작한다고 했을 때
즐겁고 기대가 되었다.
하지만 내가 배웠던 파이썬과는 조금 달랐다.
좀더 깊이가 있는 영역을 배워 내가 알던 string, bool과 같은 영역은 언급만하고 지나갔고
직접 대입하는 함수를 위주로 배웠다.
숫자는 "" 혹은 ''을 사용할 필요가 없지만 문자열은 따옴표를 작성해 문자열이라는 것을 알려주어야 한다.
참과 거짓을 판별하는 bool(boolean)형 또한 따옴표를 사용할 필요가 없다.
리스트형은 [] 딕셔너리형은 {}
.append 리스트에 값을 추가
a_list = []
a_list.append(1) # 리스트에 값을 넣는다
a_list.append([2,3]) # 리스트에 [2,3]이라는 리스트를 다시 넣는다
# a_list의 값은? [1,[2,3]]
# a_list[0]의 값은? 1
# a_list[1]의 값은? [2,3]
# a_list[1][0]의 값은? 2
a_list = []
a_list.append(1) # 리스트에 값을 넣는다
a_list.append([2,3]) # 리스트에 [2,3]이라는 리스트를 다시 넣는다
# a_list의 값은? [1,[2,3]]
# a_list[0]의 값은? 1
# a_list[1]의 값은? [2,3]
# a_list[1][0]의 값은? 2
# 딕셔너리형과 리스트형의 조합
people = [{'name':'bob','age':20},{'name':'carry','age':38}]
# people[0]['name']의 값은? 'bob'
# people[1]['name']의 값은? 'carry'
person = {'name':'john','age':7}
people.append(person)
# people의 값은? [{'name':'bob','age':20},{'name':'carry','age':38},{'name':'john','age':7}]
# people[2]['name']의 값은? 'john'
<조건문>
- if / else로 구성
def is_adult(age):
if age > 20:
print('성인입니다')
else:
print('청소년입니다')
is_adult(25) #실행 값은 '성인입니다'라고 뜬다
<반복문>
파이썬에서의 반복문은, 리스트의 요소들을 하나씩 꺼내쓰는 형태
무조건 리스트와 함께 사용
fruits = ['사과','배','감','귤']
for fruit in fruits:
print(fruit)
# 사과, 배, 감, 귤 하나씩 꺼내어 찍힙니다.
people = [{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27}]
# 모든 사람의 이름과 나이를 출력해봅시다.
for person in people:
print(person['name'], person['age'])
# 이번엔, 반복문과 조건문을 응용한 함수를 만들어봅시다.
# 이름을 받으면, age를 리턴해주는 함수
def get_age(myname):
for person in people:
if person['name'] == myname:
return person['age']
return '해당하는 이름이 없습니다'
print(get_age('bob'))
print(get_age('kay'))
<크롤링>
웹 페이지를 그대로 가져와서 거기서 데이터를 추출해내는 방식
크롤링을 하려면 남들이 만들어 놓은 라이브러리를 사용해야한다(=패키지)
패키지 설치는 외부 라이브러리 설치와 같다
가상환경 → 프로젝트 별로 라이브러리를 저장(venv)
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 = BeautifulSoup(data.text, 'html.parser')
# select를 이용해서, tr들을 불러오기
movies = soup.select('#old_content > table > tbody > tr')
# movies (tr들) 의 반복문을 돌리기
for movie in movies:
# movie 안에 a 가 있으면,
a_tag = movie.select_one('td.title > div > a')
if a_tag is not None:
# a의 text를 찍어본다.
print (a_tag.text)
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')
# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')
크롬 개발자 도구를 참고할 수도 있다.
1. 원하는 부분에서 마우스 오른쪽 클릭 후 '검사' 클릭
2. 원하는 태그에서 마우스 오른쪽 클릭
3. Copy → Copy selector 클릭
4. 파이참에 붙여넣기를 해서 비교 (예를 들면 영화 제목 1위와 2위 모두 가져와서 붙여넣기 후 비교)


<DB(데이터베이스)>
나중에 잘 찾기위해 사용
Index라는 순서로 데이터가 정렬되어 있다.
*형태 - RDEMS(SQL) : 행 / 열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사
행과 열로 정리해둔 상태에서 중간에 데이터 추가는 힘들다
하지만, 정형화 되어있는 만큼 데이터의 일관성이나 분석에 용이하다.
- No-SQL(ex. MongoDB) : 자유로운 형태로 데이터를 저장해두는 DB
자유로운 형태의 데이터 적재에 유리하지만, 일관성이 부족하다
초기서비스나 초기스타트업에서 많이 사용된다.
내 컴퓨터에도 DB를 설치할 수 있지만 유저가 몰리거나, DB를 백업해야하거나, 모니터링 하기에 용이한 클라우드를 주로 많이 사용한다.
파이참에서 pymongo, dnspython 패키지를 설치하고
mongoDB를 연결했을 때,
오류가 계속 생겨서 멘붕을 먹고 30분 넘게 끙끙 거리면서 포스팅을 작성했었는데

위와 같이 계속 오류가 발생했다.
혹시 오타가 있어서 안되는 걸까봐 강의 코드와 계속 비교했는데,
오타는 전혀 없었고 그냥 계속 연결이 안되면서 오류가 계속 발생해서
즉문즉답에 나와 같은 상황인 사람들이 있어서
certifi패키지도 설치해보고 똑같이 해보았지만 그래도 안된다...
결국 해결이 안되어 스파르타 코딩클럽에 질문을 남겼다.
질문한지 1분도 안되어서 빠른 답변으로 막히면 바로바로 질문하기에 정말 좋은 시스템같다.
진작 질문할껄..

가장 첫 답변은
mongoDB에서 Network Access에 0.0.0.0/0 아이피가 추가되어있는지 확인해보고, 없으면 추가하라는 답변!
확인해보니 이미 추가되어 있었다..
이미 추가 되어 있고 그래도 안된다고 답변을 보낸 뒤 나와 같은 사람의 질문을 다시 확인해보니

SECURITY에 Database Access에서 Built-in Role을 Read and write to any database로 변경하라는 말이 있길래
해보았지만 역시 연결이 되지 않았다..........ㅠㅠㅠㅠㅠ
왜그런거야 ㅠㅠ 도대체..
머리 싸매고 있는데 카톡으로 답변이 왔다는 연락이 왔고 다시 즉문즉답을 확인해보니
# 원래 코드
from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta
# 수정한 코드
from pymongo import MongoClient
import certifi
ca = certifi.where()
client = MongoClient('경민님 url', tlsCaFile=ca)
db = client.dbsparta
.
.
.
이렇게 바꿔서 해보라고 하시길래 바꾸자마자 연.결.
ㅋ.ㅋ.ㅋ.ㅋ.ㅋ.ㅋ..ㅋㅋ
정말 이런거 하나하나 어떻게 다 아시는지
정말 대단하다고 느끼고 내가 너무 부족하다고 느꼈다.
그렇게 고난과 역경의 시간으로 MongoDB를 연결하고


mongoDB에 데이터가 쌓인 모습까지 확인했다.
# 저장 - 예시
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'})
pymongo는 위와 같이 코드를 작성한다.
위의 코드를 저장해두고 필요할때마다 복사해서 사용
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()
title = tr.select_one('td.info > a.title.ellipsis').text.strip()
artist = tr.select_one('td.info > a.artist.ellipsis').text
print(rank,title,artist)
위의 코드는
지니뮤직의 1~50위 곡을 스크래핑하는 것이다.
숙제를 열심히 풀다가 막히면 풀이를 보고 하다가 잘 풀었는데..
분명 문제풀이와 코드가 같은데
또 막혔다..
또 문제가 생겼다.

15번이 19금 뒤로 틀이 틀어졌다..!!
분명 선생님이...
text[0:2] 앞에 두 글자만 끊기
.strip() 옆에 여백이 있다던가, 다른 글씨도 나올때 사용
이라고 해서 print(rank), print(title), print(artist)하나씩 해보면서 했는데 title이 문제여서 title 뒤에 .strip()을 붙여서 했는데도
여백이 없어지지 않고 위의 사진처럼 떴다...!!!!!!
그래서 다시 즉문즉답!
이번에도 역시 바로 질문하기 보다 나와 같은 상황의 사람들이 있는지 보기 위해 검색부터하니... 있다!
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()
title = tr.select_one('td.info > a.title.ellipsis').text.replace('19금','').strip()
artist = tr.select_one('td.info > a.artist.ellipsis').text
print(rank,title,artist)
바로 위의 코드와 무엇이 다른지 느껴지심미꽈?
그렇다.....!!!
title 뒤에 .replace('19금','')을 추가로 넣어주었다.
타이틀에 19금과 빈칸을 없애라는 뜻..!!!!!!!!!!!!
유레카
그렇게 수정하고 출력하니 아주 제대로 출력이 되었다.
이렇게 나의 3주차 역경많은 코딩일지를 마친다
'개발일지 > 스파르타 코딩클럽' 카테고리의 다른 글
스파르타 코딩클럽 웹개발 종합반 4주차 개발일 (0) | 2022.11.10 |
---|---|
스파르타 코딩클럽 앱개발 1주차 개발일지 (0) | 2022.10.25 |
외 않되???? jQuery와 자바스크립트의 연결 (0) | 2022.10.24 |
스파르타 코딩클럽 웹개발 종합반 1주차 개발일지 (0) | 2022.10.21 |