728x90

Python과 mongoDB

 

파이썬으로 웹 스크래핑을 하고 몽고db에 스크래핑한
내용들을 저장하자.




1. Python

Python은 웹 어플리케이션, 소프트웨어 개발, 데이터 과학, 기계 학습(ML) 등에

널리 사용되는 프로그래밍 언어이다.

내가 제일 처음 코딩 공부를 할 때 했던 언어가 파이썬인데,

정말 다른 언어들보다 직관적이고 대화형식이여서

배우기에 쉽고 재미있었다.

 

Javascript 처럼 변수, 기본 연산, 자료형, 

함수, 조건문 ,반복문 을 배웠는데 조금씩 다른 부분이 있지만

결이 상당히 비슷한 부분이 많았다.

 

 

변수에 대해서

a = 3      # 3을 a에 넣는다
b = a      # a를 b에 넣는다
a = a + 1  # a+1을 다시 a에 넣는다

num1 = a*b # a*b의 값을 num1이라는 변수에 넣는다
num2 = 99 # 99의 값을 num2이라는 변수에 넣는다

name = 'bob' # 변수에는 문자열이 들어갈 수도 있고,
num = 12 # 숫자가 들어갈 수도 있고,

is_number = True # True 또는 False -> "Boolean"형이 들어갈 수도 있습니다.

 

자료형 중의 List형

 

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

 

자료형 중의 Dictionary형

 

a_dict = {}
a_dict = {'name':'bob','age':21}
a_dict['height'] = 178

# a_dict의 값은? {'name':'bob','age':21, 'height':178}
# a_dict['name']의 값은? 'bob'
# a_dict['age']의 값은? 21
# a_dict['height']의 값은? 178
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'

 

함수형도 다르게 생겼으면서도

비슷하게 생겼다.

{}가 붙고 :가 붙고 하는건 외우려고 하기보단

그냥 그대로 받아들이는게 더 편하다고 했다..

# 참고: 자바스크립트에서는
function f(x) {
	return 2*x+3
}

# 파이썬에서
def f(x):
	return 2*x+3

y = f(2)
y의 값은? 7

# 함수의 응용
def sum_all(a,b,c):
	return a+b+c

def mul(a,b):
	return a*b

result = sum_all(1,2,3) + mul(10,10)
def oddeven(num):  # oddeven이라는 이름의 함수를 정의한다. num을 변수로 받는다.
	if num % 2 == 0: # num을 2로 나눈 나머지가 0이면
		 return True   # True (참)을 반환한다.
	else:            # 아니면,
		 return False  # False (거짓)을 반환한다.

result = oddeven(20)
# result의 값은 True
def is_adult(age):
	if age > 20:
		print('성인입니다')    # 조건이 참이면 성인입니다를 출력
	else:
		print('청소년이에요')  # 조건이 거짓이면 청소년이에요를 출력

is_adult(30)
# 무엇이 출력될까요? '성인입니다'

 

반복문은 리스트의 요소들을 사용해서 쓰기 때문에

꼭 리스트와 함께 쓰인다.

 

# 파이썬에서의 반복문은, 리스트의 요소들을 하나씩 꺼내쓰는 형태입니다.

fruits = ['사과','배','감','귤']

for fruit in fruits:
	print(fruit)

# 사과, 배, 감, 귤 하나씩 꺼내어 찍힙니다.
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']

count = 0
for fruit in fruits:
	if fruit == '사과':
		count += 1

print(count)

# 사과의 갯수를 세어 보여줍니다.

def count_fruits(target):
	count = 0
	for fruit in fruits:
		if fruit == target:
			count += 1
	return count

subak_count = count_fruits('수박')
print(subak_count) #수박의 갯수

gam_count = count_fruits('감')
print(gam_count) #감의 갯수
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'))

 

2. Python 패키지 (requests, bs4)

파이썬에서는 일종의 기능들을 묶어놓은 모듈들이 모아둔 것을

패키지라고 하는데 이 필요한 기능의 패키지들을 모아둔 것이

'라이브러리'이다. 내부에도 기본적으로 설치된 라이브러리가 있지만

외부 라이브러리를 설치해서도 사용할 수 있다.

 

웹 스크래핑 실습에서는 request와 bs4를 이용해서 실습했다.

각 라이브러리는 누군가가 만들어놓은 패키지 모음이기 때문에

각 라이브러리의 사용방법을 알아보고 써야한다.

 

먼저 requests의 기본 사용법이다.

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

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()
#IDEX_MVL 값이 60 미만인 구만 찍어주자!

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

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()

gus = rjson['RealtimeCityAir']['row']

for gu in gus:
	print(gu['MSRSTE_NM'], gu['IDEX_MVL'])

 

그 다음은 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')

#############################
# (입맛에 맞게 코딩)
#############################
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)

 

3. mongoDB

데이터베이스에는 SQL과 NoSQL이 있는데

mongoDB는 NoSQL방식의 DB이다.

 

SQL은 행/열의 생김새가 정해져있는 엑셀에 데이터를 저장하는 방식과 유사하다.

이미 체계적이고 정형화 되어있는 만큼 중간에 DB를 수정하기엔 어렵지만

그 만큼 데이터의 일관성이나 분석에는 용이할 수 있다.

 

NoSQL은 딕셔너리 형태로 데이터를 저장해두는 DB이다.

데이터 하나 하나가 같은 값을 가질 필요가 없고 자유로운 데이터 적재에

용이하다. 그 만큼 일관성은 부족할 수 있다.

 

스타트업이나 신생 기업같은 경우,

서비스가 자주 추가되거나 개선되면서 유동적인 부분이 많아

유연한 대처가 가능한 NoSQL을 자주 사용한다고 한다.

 

이런 DB도 프로그램인데

개인의 컴퓨터에 설치하여 운용할 수도 있지만

요즘은 클라우드에서도 DB를 제공해주기에

강의 중에는 mongoDB Atlas를 사용해서 실습했다.

클라우드 환경을 이용하면

몰리는 유저 트래픽 대응이나 DB백업, 실시간 모니터링이 유용하다.

 

파이썬에서는 이 mongoDB를 사용하기 위해 필요한 패키지가 있다.

 

pymongo, dnspython

 

from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta

// 잘 연결되었는지 데이터를 삽입해보기.
doc = {
    'name':'bob',
    'age':27
}

db.users.insert_one(doc)

 

pymongo를 사용하는 간단한 코드들이다.

 

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

+ Recent posts