선발대

[스파르타] 웹 프로그래밍 A-Z 기초 3주차 (완강) 본문

스파르타코딩클럽/강의 정리

[스파르타] 웹 프로그래밍 A-Z 기초 3주차 (완강)

신선한 스타트 2021. 12. 15. 17:31

1. 수업 후기

 

  • 강의 개수: 15개
  • 총 강의시간: 1시간 10분
  • 수업 목표:
  • 1. 파이썬 기초 문법을 안다.
  • 2. 원하는 페이지를 크롤링할 수 있다.
  • 3. pymongo를 통해 mongoDB를 제어할 수 있다.

 

 mongoDB를 전후로, 이틀에 걸쳐서 전부 수강했다. 총 수강시간6시간 정도 걸린 듯하다. 일단 아침 9시부터 상쾌하게 DB에 대한 설명을 듣고 강의 순서대로 mongoDB를 Pycharm에서 연결하려고 하는데, 갑자기 아래와 같은 에러 메시지가 나왔다. 강의 속에서는 엄청 스무스하게 넘어갔기 때문에 별 문제가 아닌가 보다 하고 구글링을 시작했는데, 그 후로 3시간 동안 해결하지 못했다. 그래서 팀원들한테 물어봤더니 dnspython이나 네트워크 문제 같다고 해서 그렇구나 하고, 패키지들을 삭제 후 재설치를 했다. 그러나 혹시 몰라서 pip, wheel 등의 패키지 버전을 다 업그레이드했는데도 되지 않았다. 내가 뭔가 잘못 건드렸나 싶어서 아예 파이썬을 싹 다 지우고 재설치를 했다. 그래서는 안됐는데... (Stay...)

 

 

첫 번째 에러

 

 

 그랬더니 아래의 두 번째 에러가 나와서 이건 또 뭐지 싶었다. 기존 강의 차시에서도 잘 돌아가던 모듈마저 먹통이 되었다. 분명 패키지는 다 있는데 대체 뭐가 문제인가 싶어서 오버스택플로우에 검색했더니 역시 나와 같은 문제를 가진 사람들이 수두룩했다. 그러나 해결책은 없었다. 내 부족한 지식으로는 이해하는 것도 어려웠다. 

 

 

두 번째 에러

 

 

 어쨌든 이것저것 건드려보다가 다시 전부 초기화하고 구글링하는 과정에서 다양한 방법들을 찾았다. 갑자기 문득 다른 수강생들 생각이 나서 슬랙 채널에 들어가 보니 나와 똑같은 오류를 가진 사람들이 많았고 그곳엔 해결책이 있었다! 와! 입력하자마자 신속히 mongoDB에 데이터가 들어갔다. 

 

 

// 해결방법
// DB 사용시 이 5줄을 붙여준다.
// certifi 패키지를 가상환경에 먼저 설치해준다. 

from pymongo import MongoClient
import certifi

ca = certifi.where()
client = MongoClient('mongodb+srv://test:sparta@cluster0.내주소.mongodb.net/내DB명?retryWrites=true&w=majority', tlsCAFile=ca)
db = client.dbsparta

 

 

 해결되어서 다행이지만 앞으로도 이런 문제는 새로운 기술을 접할 때마다 종종 마주하게 될 것이다. 그렇지만 대부분의 문제는 나한테 처음 일어난 것이 아니니, 다른 사람들의 해결책을 찾아서 열심히 구글링 해야겠다. 같은 강의를 듣는 사람들이 많아서 다행이다. 처음 에러가 났을 때는 어디서부터 손을 대야 할지 감도 안 왔지만, 점점 이런 순간들을 겪다 보면 익숙해질 것이다. 그 때까지 화이팅~

 

 

2. 수업내용 정리

3-1. 3주차 설치
더보기

01. 이번주 수업을 위해 설치 / 가입할 것들!

 

 

Git

 

git-scm.com

 

02. 오늘 배울 것 이야기 - 3주차: Python,  크롤링, mongoDB

 

  • Python: 문법 연습, 라이브러리로 네이버 영화목록 크롤링
  • mongoDB: 데이터베이스 사용방법

 

3-2. 연습 겸 복습 - 스파르타피디아에 OpenAPI 붙여보기
더보기

01. 스파르타가 만들어둔 OpenAPI 파악하기

 

  • API를 써서 저장된 포스팅 불러오기를 진행했음
  • 나중에 API 실제로 만들어볼 예정임

 

02. 포스팅 가져오기 API 붙이기

 

완성된 스파르타 피디아

 

<script>
        $(document).ready(function () { # 로딩과 동시에 실행됨
            listing();
        });

        function listing() {
            $.ajax({
                type: "GET",
                url: "http://spartacodingclub.shop/web/api/movie",
                data: {},
                success: function (response) {
                    $('#cards-box').empty()
                    let rows = response['movies']
                    for (let i = 0; i < rows.length; i++) {
                        let title = rows[i]['title']
                        let desc = rows[i]['desc']
                        let image = rows[i]['image']
                        let comment = rows[i]['comment']
                        let star = rows[i]['star']

                        let star_image = '⭐'.repeat(star) # 별점 주기

                        let temp_html = `<div class="col">
                                            <div class="card h-100">
                                                <img src="${image}"
                                                     class="card-img-top" alt="...">
                                                <div class="card-body">
                                                    <h5 class="card-title">${title}</h5>
                                                    <p class="card-text">${desc}</p>
                                                    <p>${star_image}</p>
                                                    <p class="mycomment">${comment}</p>
                                                </div>
                                            </div>
                                        </div>`

                        $('#cards-box').append(temp_html)

                    }
                }
            });
        }
 </script>

 

3-3. 파이썬 시작하기 
더보기

01. 파이썬을 설치한다는 것의 의미

 

  • 파이썬 = 컴퓨터와 인간의 번역팩

 

02. 프로젝트 만들기 & 파이썬 파일 실행

 

03. 파이썬 문법을 시작하기에 앞서...

 

  • 모든 암기는 불가능. 필요한 것은 구글링해서 찾아보면 OK

 

3-4. 파이썬 기초공부 
더보기

01. 파이썬 기초 문법

 

  • 변수 & 기본연산
  • 자료형: 숫자, 문자형 / 리스트형 / Dictionary형
  • 함수
## 함수 정의방법
# 파이썬
def f(x):
	return x
    
# 자바스크립트
function f(x) {
	return x
}

 

  • 조건문
## 파이썬 조건문

if num % 2 == 0:
	return True
else:
	return False

 

  • 반복문
## 파이썬 반복문
# 리스트 요소 하나씩 꺼낼 때 사용하는 형태, 즉 무조건 리스트와 함께 쓰임

fruits = ['사과', '수박', ...]

for fruit in fruits:
	print(fruit)

 

3-5. 파이썬 패키지 설치하기 
더보기

01. 파이썬 패키지(package) 설치하기

 

  • 파이썬 패키지(= 외부 라이브러리) : 모듈(일종의 기능 묶음)을 모아놓은 단위
  • 외부라이브러리 사용하기 위해 패키지 설치 필요

 

  • 가상환경(virtual environment, venv): 프로젝트 별로 패키지들을 담을 공구함. 같은 시스템에서 실행되는 다른 파이썬 응용프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지 설치 및 업그레이드를 가능하게 하는 격리된 실행 환경임. 라이브러리를 모아두는 곳. 건드리지 말라고 했던 그 폴더. 라이브러리가 담기기 때문에 우리가 건드리는 게 아님.
  • 파이썬 공식 용어집: https://docs.python.org/ko/3/glossary.html#term-virtual-environment
 

용어집 — Python 3.10.1 문서

같은 형의 두 인자를 수반하는 연산이 일어나는 동안, 한 형의 인스턴스를 다른 형으로 묵시적으로 변환하는 것. 예를 들어, int(3.15)는 실수를 정수 3으로 변환합니다. 하지만, 3+4.5 에서, 각 인자

docs.python.org

  • 공구함1: 패키지 A, B, C / 공구함2: 패키지 B', C, D, E (컴퓨터는 하나니까)

 

  • pip(python install package) 사용 - requests 패키지 설치해보기
  • 가상환경(공구함)에 새 프로젝트 라이브러리 설치하려면 pip (플레이스토어 같은 것) 이용함.
  • project interpreter 화면 > + 버튼 > requests 검색

 

3-6. 패키지 사용해보기 
더보기

01. Requests 라이브러리 사용해보기 + List / Dictionary / 함수 / If / For문 연습

 

import requests # requests 라이브러리 설치 필요

# request 쓰는 방법 (라이브러리마다 전부 다르다)

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair') # 미세먼지
rjson = r.json()
rows = rjson['RealtimeCityAir']['row']
 
for row in rows: # 파이썬으로 반복문 돌리기
    gu_name = row['MSRSTE_NM']
    gu_mise = row['IDEX_MVL']

    if gu_mise < 200:
        print(gu_name)

 

3-7. 웹스크래핑(크롤링) 기초 
더보기

01. 웹스크래핑 해보기 (영화 제목)

 

  • 크롤링: 1. 원하는 페이지의 html 가져오기, 2. html 중에서 영화 제목이 뭔지 어떻게 알지
  • 패키지 설치 / 사용하면 된다: beautifulSoup (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.naver?sel=pnt&date=20210829',headers=headers)

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

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

 

 

## 파이썬이 아니라 BeautifulSoup 사용방법임

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 라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 됨.
soup = BeautifulSoup(data.text, 'html.parser')

# selector 복사, tr까지만 동일함
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a


# title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
# print(title.text) # 밥정
# print(title['href']) # href

# 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)

 

3-8. Quiz_웹스크래핑(크롤링) 연습 
더보기

01. [실습] 웹스크래핑 더 해보기 (순위, 제목, 별점)

 

[완성] 원하는 출력화면

 

 

# select 이용해서, tr들 불러오기
movies = soup.select('#old_content > table > tbody > tr') # 리스트 형태임

# movies (tr들)의 반복문 돌리기
for movie in movies:
    # movie 안에 a가 있으면
    a = movie.select_one('td.title > div > a')
    if a is not None: # != 도 가능함
        # a의 text를 찍어본다.
        title = a.text
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        star = movie.select_one('td.point').text #글씨 밖에 없었으니까
        print(rank, title, star)

 

3-9. DB 개괄 
더보기

01. 들어가기 전에 - DB는 왜 쓰는 것일까?

 

  • 사용목적: 데이터 관리를 잘 하기 위해서 사용. (잘 뽑아쓰기 위해서 사용)
  • DB는 Index 순서대로 데이터 정렬되어 있음.

 

02. 들어가기 전에 - DB의 두 가지 종류

 

 

  RDBMS (SQL)  No-SQL
특징 행/열 생김새가 정해진 엑셀에
데이터 저장하는 것과 유사함.
칸 만들어두고 채우는 느낌.

ex) MS-SQL, My-SQL
딕셔너리 형태로 데이터를 저장해두는 DB.
칸이 없고, 들어오는대로 데이터를 쌓음.

ex) MongoDB
장점 정형화 되어 있는 만큼, 
데이터 일관성이나 분석에 용이할 수 있음.
이미 정해져있으니까 이상한 데이터 들어오지 X.
데이터 하나하나마다 같은 값을 가질 필요 없음.
자유로운 형태의 데이터에 유리함.
그래서 초기 서비스, 스타트업들이 많이 선택함.
단점 데이터 사이에 갑자기 열을 하나 더
추가하는 등의 동작이 불가함.
들어오는 데이터가 변화할 때 유동적으로 대처 X
일관성이 부족할 수 있음

 

03. 들어가기 전에 - DB의 실체에 관하여

 

  • DB는 우리가 쓰는 프로그램 같은 것임. 내 컴퓨터에 게임 설치할 수 있는 것처럼 DB도 마찬가지.
  • 요새 트렌드는 Cloud 이용. 
  • 이유: 유저가 데이터를 올리거나, DB 백업하거나, 모니터링에 용이하기 때문.
  • 이 수업에서도 최신 클라우드 서비스인 mongoDB Atlas 사용 예정

 

3-10. mongoDB 시작하기

 

3-11. mongoDB 연결하기
더보기

01. mongoDB - Atlas 연결하기

 

  • 파이썬으로 MS Excel을 조작하려면 특별한 라이브러리가 필요함.
  • 마찬가지로 mongoDB 프로그램 조작하려면 특별한 라이브러리, pymongo 가 필요함.

 

3-12. pymongo로 DB 조작하기
더보기

01. pymongo로 mongoDB 조작하기

 

# 'users'라는 collection에 DB 연결하고 데이터 넣기
db.users.insert_one({'name':'bobby','age':21})
db.users.insert_one({'name':'kay','age':27})
db.users.insert_one({'name':'john','age':30})



# 모든 데이터 뽑아보기
all_users = list(db.users.find({},{'_id':False}))

print(all_users[0])         # 0번째 결과값을 보기
print(all_users[0]['name']) # 0번째 결과값의 'name'을 보기

for user in all_users:      # 반복문을 돌며 모든 결과값을 보기
    print(user)

 

02. pymongo 사용법, 코드요약

 

  • 딱 4가지 기능만 알면 된다. (저장, 찾기, 변경, 삭제) 

 

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

 

3-13. 웹스크래핑 결과 저장하기
더보기

01. insert 연습하기 - 웹스크래핑 결과를 DB에 저장하기

 

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
import certifi
ca = certifi.where()
client = MongoClient('mongodb+srv://test:sparta@cluster0.frvlk.mongodb.net/Cluster0?retryWrites=true&w=majority', tlsCAFile=ca)
db = client.dbsparta

(중간 생략, 위의 강의와 같은 코드임)

# movies (tr들)의 반복문 돌리기
for movie in movies:
    # movie 안에 a가 있으면
    a = movie.select_one('td.title > div > a')
    if a is not None: # != 도 가능함
        # a의 text를 찍어본다.
        title = a.text
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        star = movie.select_one('td.point').text #글씨 밖에 없었으니까
        doc = {
            'title': title,
            'rank': rank,
            'star': star
        }
        db.movies.insert_one(doc)

 

3-14. Quiz_웹스크래핑 결과 이용하기
더보기

01. [실습] find, update 연습하기 (delete는 제외)

 

## 영화제목 '가버나움' 평점 가져오기
movie = db.movies.find_one({'title':'가버나움'})
# print(movie['star'])
star = movie['star']


## '가버나움' 평점과 같은 평점의 영화 제목들 가져오기
# (1) 나는 조건문을 썼는데 굳이 쓸 필요 없었음. (2)으로 고
# all_movies = list(db.movies.find({},{'_id':False}))
# for movies in all_movies:
#     a = movies['star']
#     if a == star:
#         print(movies['title'])

# (2) 그냥 식에 조건 달아주기
all_movies = list(db.movies.find({'star':star},{'_id':False}))
for m in all_movies:
    print(m['title'])


## '가버나움' 영화의 평점을 0으로 만들기
db.movies.update_one({'title':'가버나움'},{'$set':{'star':'0'}})

 

3-15. 3주차 끝 & 숙제 설명
더보기

01. 지니뮤직의 1~50위 곡 스크래핑

 

  • 웹서비스: 눈에 보이는 것(HTML, CSS, JS) + 앞의 것을 보여주는 것(서버)
  • 1,2주차는 전자를, 3주차에는 후자를 공부했음. (파이썬은 서버를 프로그래밍하는 언어 중 하나)
  • 4주차부터는 두 개를 합치는 것에 대해 공부할 것임.

 

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',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')


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

for song in songs:
        singer = song.select_one('td.info > a.artist.ellipsis').text
        title = song.select_one('td.info > a.title.ellipsis').text.strip()
        rank = song.select_one('td.number').text.split()[0] # .text[0:2].strip()도 가능

        print(rank, title, singer)

 

Comments