웹개발/수업

웹개발 3주차 개발일지_Sparta Coding Club

끈끈 2023. 2. 25. 14:22

 

3주차 수업 목표

 

1. 파이썬 기초 문법을 안다.

 

2. 원하는 페이지를 크롤링 할 수 있다.

 

3. pymongo를 통해 mongoDB를 제어할 수 있다.

 

 

 

Python 윈도우 다운로드

 

https://www.python.org/ftp/python/3.8.6/python-3.8.6-amd64.exe

 

주의) Add Python 3.8 to PATH 에 체크!

 

 gitbash 다운로드

 

Git (git-scm.com)

 

 Python 맥 다운로드

 

https://www.python.org/ftp/python/3.8.2/python-3.8.2-macosx10.9.pkg

 

👉 파이썬을 설치한다는 것은?

 

일종의 번역팩을 설치하는 것이다.

 

파이썬 문법으로 된 것을 컴퓨터가 알아듣는 언어로 변환해줄 수 있도록, 번역 패키지를 설치하는 것.

 

패키지 설치 = 외부 라이브러리 설치

 

 

 

✔ 가상환경(virtual environment, venv) 이란?

 

프로젝트별로 패키지들을 담을 공구함

 

[설정] - [프로젝트] - [Python 인터프리터] - [+] - [requests 패키지 설치]

 


 

 파이썬 기초 문법

 

 변수

 

a = 3 //3을 a에 넣는다
b = a

 

 자료형

 

숫자, 문자형
name = 'bob'
is_number = True //Boolean 형이 들어갈 수도 있음

리스트형
a_list = ['사과', '배', '감']
a_list.append('수박') //리스트에 추가하는 법 (자바에서는 push)

딕셔너리형
a_dict = {'name':'bob', 'age':27}

 

 함수

 

def sum(a, b): //definition
	return a+b
    
result = sum(1,2)
print(result) //3 출력

 

 조건문

 

def is_adult(age):
	if age > 20:
    	print('성인입니다')
    else:
    	print('청소년입니다')
        
is_adult(15) //청소년입니다 출력

 

 반복문

 

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

 

즉, 무조건 리스트와 함께 쓰인다

 

fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']

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:
    if person['age'] > 20:
        print(person['name']) //carry, ben 출력

 

✔ requests 라이브러리 사용해보기

 

import requests //requests 라이브러리 설치 필요
r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()

 

✔ 들여쓰기의 중요성!

 


 

 크롤링 이란?

 

웹사이트, 하이퍼링크, 데이터, 정보 자원을 자동화된 방법으로 수집, 분류, 저장하는 것.

 

✔ 패키지 추가 설치하기(beautifulsoup4, bs4)

 

[설정] - [프로젝트] - [Python 인터프리터] - [+] - [bs4 패키지 설치]

 

✔ 크롤링 기본 세팅

 

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.naver?sel=pnt&date=20210829',headers=headers)
//url만 변경해가며 쓰면 됨

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

 

✔ bs4 사용하는 법

 

예시) 영화 제목 가져와보기

 

 

영화제목 오른쪽 클릭 - [검사] - [우클릭] - [복사] - [selecetor 복사]

 

 

title = soup.select_one('~')

 

 

print(title) //검사창의 한 줄 출력

 

태그 안의 텍스트를 찍고 싶을 땐 👉 태그.text
태그 안의 속성을 찍고 싶을 땐 👉 태그['속성']

 

 

print(title.text) //영화 제목만 출력

 

print(title['href']) //하이퍼링크 출력

 

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.naver?sel=pnt&date=20210829',headers=headers)

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

#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a

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

for movie in movies:
    a = movie.select_one('td.title > div > a')
    if a is not None: # is not 은 != 로도 표현 가능
        print(a.text)

 


 

데이터베이스(Database)에 넣기

 

✔ DB의 두 가지 종류

 

👉 RDBMS(SQL)
행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사함
정형화되어 있어 데이터의 일관성이나 분석에 용이함
ex) MS-SQL, My-SQL 등

👉 No-SQL
딕셔너리 형태로 데이터를 저장해두는 DB
데이터 하나하나마다 같은 값들을 가질 필요가 없게 되고
자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있음
ex) MongoDB

 

✔ MongoDB 가입하기

 

https://account.mongodb.com/account/register

 

✔ 패키지 추가 설치하기(pymongo, dsnpython)

 

[설정] - [프로젝트] - [Python 인터프리터] - [+] - [pymongo, dsnpython 패키지 설치]

 

✔ pymongo 기본 코드

 

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

 

 

MongoDB [Connect] - [Connect your application] - 네모 복사

 

 

✔ MongoDB 데이터 입력하기

 

from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ucyg0qc.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

doc = {'name' : 'bob', 'age' : 27}

db.users.insert_one(doc)

-------------------------------

from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ucyg0qc.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

db.users.insert_one({'name' : 'bob', 'age' : 27})
db.users.insert_one({'name' : 'bobby', 'age' : 22})
db.users.insert_one({'name' : 'Ann', 'age' : 20})

 

MongoDB [Browse Collections] - [Collections]

 

✔ pymongo 사용법과 코드 요약

 

# 저장(insert)
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
또는,
db.users.insert_one({'name':'bobby','age':21})
db.users.insert_one({'name':'ann','age':20})

# 한 개 찾기(find)
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기(find) 👉 _id 값은 제외하고 출력
all_users = list(db.users.find({},{'_id':False}))

# 수정(update) 👉 조건, 바꿀 내용 
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 삭제(delete) 👉 거의 안 씀
db.users.delete_one({'name':'bobby'})

 


 

함수 정리

 

.select('~') 👉 해당 내용이 리스트로 묶여 나오는 것

 

.select_one('~') 👉 리스트 안의 값이 추출되는 것

 

.strip() 👉 양쪽 여백 없애기

 

.split(~) 👉 ~를 기준으로 문자열 나누기

 

.text[0:2] 👉 문자열 앞에서 두 글자만 끊기

 

.len() 👉 문자열의 길이를 반환하는 함수, .len[()] 👉 리스트나 튜플 등의 안에 속한 값의 개수

 

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 Saf
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:
    title = tr.select_one('td.info > a.title.ellipsis').text.strip()
    rank = tr.select_one('td.number').text[0:2].strip()
    artist = tr.select_one('td.info > a.artist.ellipsis').text
    print(rank, title, artist)