코딩하는 털보

웹개발 종합반 WIL - 3W 본문

Boot Camp/항해 99

웹개발 종합반 WIL - 3W

이정인 2021. 8. 2. 22:53

Python 기초 공부

Python 기초 문법

  • 변수, 자료형

    #숫자형, 문자열
    num = 3
    print(num+7) #10
    email = 'rockintuna@kakao.com'
    print(email) #rockintuna@kakao.com
    
    #숫자형을 문자열로 만들기
    print(email+str(num))
    #rockintuna@kakao.com3
    
    #리스트
    a_list = ['사과', '배', '수박']
    #리스트 원소 추가하기
    a_list.append('포도')
    print(a_list)
    #['사과', '배', '수박', '포도']
    
    #딕셔너리
    a_dict = {'name':'bob', 'age':27}
    print(a_dict['name']) #bob
    #딕셔너리 쌍 추가하기
    a_dict['height'] = 175
    print(a_dict) #{'name': 'bob', 'age': 27, 'height': 175}
  • 함수

    파이썬에서 함수의 내용은 따로 중괄호같은 표시로 묶여있지 않고 줄맞춤으로 구분한다.

    #함수 선언하기
    def sum(num1, num2):
        print('hi')
        return num1 + num2
        # 여기까지 함수 내용 
    print(sum(3, 7))  # 10
  • 조건문

    def check_age(age):
        if age > 20:
            print('성인입니다.')
        else:
            print('청소년입니다.')
    #탭(줄맞춤)이 매우매우 중요!
    
    check_age(30)  # 성인입니다.
    check_age(15)  # 청소년입니다.
    
  • 반복문

    fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']
    
    # 반복문으로 리스트 요소 사용하기
    for fruit in fruits:
        print(fruit)
    
    # 수박 개수 세기
    count = 0
    
    for fruit in fruits:
        if fruit == '수박':
            count += 1
    
    print(count)  # 2
    
    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'])
        # bob
        # carry
        # john
        # smith
        # ben

파이썬 패키지 사용해보기

패키지

  • 파이썬의 패키지는 모듈을 모아 놓는 단위이다.
  • 패키지의 묶음을 라이브러리라고 할 수 있다.
  • 파이썬은 이미 만들어놓은 라이브러리가 방대하기로 유명하다.

가상환경(virtual environment)

  • 프로젝트별 공구함
  • 다른 프로젝트(다른 파이썬 응용 프로그램)의 동작에 영향을 주지 않기 위해 프로젝트마다 격리된 실행 환경을 가지게 한다.
  • 프로젝트별로 독립적으로 패키지를 사용할 수 있다.
  • 라이브러리를 담아두는 디렉토리. (venv)

프로젝트 설정에서 패키지를 설치할 수 있다.

설치가 완료되면 venv에 설치된 패키지가 보인다.

패키지 사용해보기

파이썬 requests 패키지는 API 요청을 아주 쉽게 해준다.

  • 서울시 Open API를 이용하여 구별 미세먼지 정보 가져오기
import requests # requests 라이브러리 설치 필요

# GET 요청
r = requests.get('http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99')
rows = r.json()['RealtimeCityAir']['row']

for row in rows:
    gu_name = row['MSRSTE_NM']
    gu_mise = row['IDEX_MVL']
    print(gu_name, gu_mise)

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

웹페이지를 그대로 가져와서 거기서 데이터를 추출해 내는 기법이다.
서버로부터 가져온 HTML파일을 사용하여 데이터를 추출한다.

파이썬 크롤링 패키지 (Beautiful Soup)

bs4

beautifulsoup 내 select 함수에 미리 정의된 방법 사용하기

# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')

# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')

BeautifulSoup를 사용하여 크롤링 해보기

네이버 영화 랭킹 페이지에서 영화 순번, 이름, 별점 리스트 가져오기

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://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)

#data.text는 받아온 HTML문이다.
soup = BeautifulSoup(data.text, 'html.parser')

# 특정 태그 선택하기(단일)
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
# 태그의 텍스트 가리키기
print(title.text) # 그린 북
# 태그의 속성 가리키기
print(title['href']) # /movie/bi/mi/basic.naver?code=171539

# 특정 태그 선택하기(여러개), select()는 리스트를 반환한다. 
trs = soup.select('#old_content > table > tbody > tr')

for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    if a_tag is not None:
        num = tr.select_one('td:nth-child(1) > img')['alt']
        point = tr.select_one('td.point').text
        print(num, a_tag.text, point)

    # 01 그린 북 9.60
    # 02 가버나움 9.59
    # 03 디지몬 어드벤처 라스트 에볼루션 : 인연 9.54
    # 04 원더 9.52
    # 05 먼 훗날 우리 9.52
    # ...

데이터베이스

데이터를 잘 찾아쓰기 위해 사용하는 데이터 관리 프로그램

RDBMS

정형화되어있는 데이터를 저장한다. 높은 데이터 일관성을 가지고 있다.

  • MySQL, MSSQL, Oracle, ...

NoSQL

비정형 데이터를 저장한다. 딕셔너리 형태로 데이터를 저장하기 때문에 유연하게 데이터를 적재할 수 있다. 그러나 RDBMS에 비해 일관성이 부족할 수 있다.

  • mongoDB, cassandra, Redis, ...

pymongo로 mongoDB 조작하기

pymongo : 파이썬에서 mongoDB를 조작할 수 있는 라이브러리이다.

from pymongo import MongoClient
# DB connection
client = MongoClient('localhost', 27017)
db = client.dbsparta

# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

# 한 개 찾기 - 예시 ('name'이 'bobby'만 찾기)
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기 - 예시 (21세만, _id 값은 제외하고 출력)
same_ages = list(db.users.find({'age':21},{'_id':False}))

# 바꾸기 - 예시 ('name'이 'bobby'만 19세로)
# update_many도 있지만 잘 쓰이지 않는다.
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기 - 예시 ('name'이 'bobby'만 삭제)
db.users.delete_one({'name':'bobby'})

mongoDB에 크롤링 결과 저장하기

import requests
from pymongo import MongoClient
from bs4 import BeautifulSoup

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://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303', headers=headers)

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

trs = soup.select('#old_content > table > tbody > tr')

for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    if a_tag is not None:
        rank = tr.select_one('td:nth-child(1) > img')['alt']
        star = tr.select_one('td.point').text

        doc = {'rank': rank, 'title': a_tag.text, 'star': star}
        db.movies.insert_one(doc)

퀴즈

from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client.dbsparta

# '매트릭스' 평점 가져오기
matrix = db.movies.find_one({'title':'매트릭스'})
star = matrix['star'];
print(star)

# '매트릭스' 평점과 같은 영화들
movies = list(db.movies.find({'star':star},{'_id':False}))
for movie in movies:
    print(movie['title'])

# '매트릭스' 평점 0으로 바꾸기
db.movies.update_one({'title':'매트릭스'}, {'$set':{'star':'0'}})
Comments