기나긴 여정을 위한 공부 (3주차)

이한결·2022년 12월 3일
0

부트 캠프

목록 보기
4/98
post-thumbnail

항해99 사전 스터디 3주차

파이썬은 객체지향적 언어임에도 불구하고 다른 객체지향 언어들과는 차이가 많다.
일단 언어자체가 대화형 언어이기에 코드를 보면 이해하기가 매우 쉽다.
다른 큰 차이점이라고 하면 바로 타입 선언을 안 해준다는 점이다.
C++, 자바, C 등을 보면 알겠지만 어떤 변수에 무조건 string인지 number인지 타입을
항상 선언해주어야한다.
타입 선언을 안해주면 초보자들에게는 매우 큰 장점으로 작용할 것이다. 즉 진입장벽이 낮아진다는 뜻이다.
하지만 프로젝트 규모가 커지면서 코드가 복잡해지면 타입으로 인한 오류 혹은 실수 등이 발생 할 수 있다.
이와 비슷하게 자바스크립트 역시 타입 선언을 안해줘도 된다.
물론 둘 다 스크립트 언어이기에 대부분 간단한 작업만 해왔다. 그래서 타입 시스템이 필요 없었던 것은 사실이다.
하지만 최근 자바스크립트에 타입스크립트라는 것을 같이 사용하면서 타입을 선언해주게 되었다. 이러한 흐름으로 파이썬 역시 3.5부터는 'type hints' 라는 것을 쓸 수 있게 되었다.
코린이들이 우는 소리가 들린다...
게다가 파이썬이 3.11부터는 파이썬의 문제점 중 하나였던 속도도 빨라진다고 하니, 정말로 기대가 되는 바이다.

파이썬

파이썬 3.5버전 기념으로 한번 'type hints'를 사용해보겠다.

fruits: list[str] = ['사과','배','감','귤']

for fruit in fruits:
	print(fruit)

파이썬의 for문은 정말 언제봐도 혁신적이다.
자바스크립트의 for문은 언제봐도 토나올것 같다.
물론 자바스크립트에도 for...in 이 있다.

def sum(a: int, b: int) -> int:
	return a*b
    
sum(2,3)

함수도 다른 언어들과 전혀 다르다. 역시 파이썬!
파이썬의 가장 짜증나는 점이라고 한다면 줄을 잘 맞춰야 한다는 것이다.
자바스크립트에서의 중괄호가 없고 대신 파이썬은 줄을 잘 맞춰야 한다.
저것 때문에 예전에 2시간동안 삽질한적이...

웹스크래핑

파이썬에는 패키지라는 것이 존재한다. 이 패키지 안에는 여러 라이브러리가 들어있다.
간단히 말해서 어떤 기능을 사용하기 위해 설치하는 것이 라이브러리인데 그 묶음이 패키지이다.
Requests와 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('url주소',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')

#############################
# (입맛에 맞게 코딩)
#############################

이것이 웹 스크래핑의 기초 틀이다.
HTML을 BeautifulSoup라는 라이브러리로 불러와서 원하는 부분을 스크랩 하면된다.
나머지는 파이썬 문법이 아니라 BeautifulSoup 사용법이기에 생략하겠다.

mongoDB

DB라는 것은 개인적인 나의 생각엔 '창고'라는 비유가 적절한 것 같다.
어떤 자료나 물건을 쌓아두기 위한 곳(?)이다. 대신 그냥 막 보관하는 것이 아니라,
깔끔하게 정해식 방식에 따라 정리하여 보관하게 된다.
대표적으로 2가지가 있다. SQL과 NoSQL이 있다.

SQL : 행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다.
No-SQL : 딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다.

mongoDB는 NoSQL이다. 3주차 공부하면서 제일 어려웠던 부분은 바로 놀랍게도 mongoDB 가입하고 세팅하는 부분이었다. 중간에 해매는 바람에 30분을 지웠다가 다시 만드는 것을 반복하였다.

# 저장 
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'})

mongoDB 데이터를 저장 혹은 바꾸는 법이다. 외울 필요는 없고, 잘 알아 두었다가 나중에 찾아서 사용하면 된다.

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('웹 url', headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')


gennies = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for song in gennies:
    a = song.select_one('td.info > a.title.ellipsis')
    icon = a.select_one('span')
    if a.select_one('span'):
        icon.decompose()
    title = a.text.strip()
    artist = song.select_one('td.info > a.artist.ellipsis').text
    rank = song.select_one('td.number').text[0:2].strip()
    print(rank, title, artist)

지니 음악 사이트 크롤링이 3주차 과제였다.
strip() 그리고 text[0:2]는 힌트로 주어지는 바람에 잘 해결하였다.
문제는 타이틀에 icon이 섞여있어 원하는 대로 출력결과가 나오지 않았다.
그리하여 구글링을 시전하였다.
decompose()라는 것을 통하여 해당 아이콘(span)을 찾아 지워주었다.

P.S.만약 스파르타 코딩클럽에서 나의 블로그를 보게된다면, 이 부분도 힌트에 넣어주었으면 좋겠다. 는 간절한 나의 개인적인 바램이다.

profile
평범한 삶을 위하여

0개의 댓글