관리 메뉴

공부기록용

웹개발 종합반 3주차_01 본문

📚강의록📚/스파르타)웹 개발 종합

웹개발 종합반 3주차_01

과부하가즈아 2023. 6. 5. 00:31

Python

 

터미널

  • 터미널이 뭔가요?

사용자가 텍스트로 명령어를 입력하면, 결과를 텍스트로 화면에 출력해주는 도구

 

  • Q. 터미널은 어디에 사용하나요?

파이썬 라이브러리를 설치하고, 파이썬 프로젝트를 실행하는데 사용

 

  • Q. 왜 사용하나요?

명령어를 적어 작동시키는 것이 빠르고 편리하기 때문, 요새는 GUI(눈에 보이는 아이콘으로 상호작용하는 방식)이 잘 되어 있어 사용하는 경우가 줄어들고 있지만, 코딩할 때는 명령어를 입력하는 방식을 자주 접하게 될 것이다.

 

Python

# 숫자
a = 2
b = 3
print(a+b)

# 리스트
c = ['사과', '배', '감']
print(c[0])

# 딕셔너리
a = {'name':'영수', 'age':24}

print(a['name'])


함수

def로 선언해주고 :를 하면 그 밑에 자동으로 간격이 벌어짐 = 내용이라고 자동으로 인식된다.(Javascript는 { } 사이에 내용이었음)

# 수학문제에서
f(x) = 2*x+3
y = f(2)
y의 값은? 7

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

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

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

# 함수
def hey():         # --->함수의 내용물이다
    print("헤이")  # ---->(내용물)

hey()             # ---->헤이! 로 출력
def sum(a,b,c):     # ---->합계의 값이
    return a+b+c    # ---->a,b,c가 1,2,3으로 변해서/return이 있으면 이 함수sum(1,2,3)를 그 값으로 변신시킨다

result = sum(1,2,3) # ---->sum함수를 부르면

print(result)       # ---->6 출력된다


조건문

age = 25

if age > 20:
    print('성인입니다')
else:
    print('청소년입니다')
    
# ----->출력값은 성인입니다


반복문

ages = [5,10,13,23,25,9] # ------>이런 age리스트가 있는데

for a in ages:           # -----> ages의 하나하나씩의 값을 가져와서 a로 넣고 그 a를 밑에서 가져다 쓰자
    print (a)            # ----->출력값은 5 10 13 23 25 9


반복문+조건문

ages = [5,10,13,23,25,9]

for a in ages:
    if a > 20:
        print('성인입니다')
    else:
        print('청소년입니다')
        
# age를 한번씩 돌면서 조건에 맞는지 안맞는지 돌아서 값을 출력


가상환경 venv - 패키지를 담아두는 공구함

회사에서는 패키지 A, B, C를 설치해서 쓰고, 개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요. 그런데 회사팀장님이 B를 이전 버전인 B' 로 쓰자고 하시네요. 그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B' 로 쓰면 코드를 다 바꿔야 해요. 이때, 

다 담아둘 필요 없이 공구함을 2개 만들어서, 공구함1에 A, B', C를 담아두고, 공구함2에 B, C, D, E를 담아두고 쓰면 관리하기 편하겠죠? 그래서, 가상환경이라는 개념이 등장했습니다. 즉, 프로젝트별 공구함이에요.

정리하자면,
가상환경(virtual environment) 은 같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.

 

venv 생성하기

python -m venv venv 
: 가상환경 venv 파일을 만들어준다.

venv 활성화

venv 활성화
: 활성화를 시켜줘야 라이브러리를 컴퓨터가 읽어준다. (오른쪽 하단에 3.8.3보이는거 클릭해서 venv로 바꿔주고 새터미널 실행하면 venv로 바뀐걸 볼 수 있다.)

이런 방법도 존재

라이브러리 만들기

pip install 라이브러리이름_requests
: 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치, 가상환경_venv이 활성화된 상태에서 설치해주기

 

Requests 라이브러리 사용

requsets 웹에 접속하는 라이브러리

Requests 라이브러리는 fetch처럼 서버에서 데이터를 가져와서 볼 때 사용한다. 이런 기능을 사용하기 위해서 requests라이브러리가 필요한 것이다.(pip install requests) Requests라이브러리 docs
# requests 써보기
import requests # requests 라이브러리 설치 필요

# 기재된 url = 즉 데이터를 받아 올 곳
r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair') 
rjson = r.json()

print(rjson)


import requests 

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

print(rjson['RealtimeCityAir']['row'])
# 해당 url(API)의 RealtimeCityAir와 row를 받아옴


라이브러리(requests)를 이용해서 API의 MSRSTE_NM을 gu_name로, IDEX_MVL를 gu_mise로 설정해서 받아온 걸 print(gu_name,gu_mise)한 것
import requests 

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

rows = rjson['RealtimeCityAir']['row']

for a in rows:
    gu_name = a['MSRSTE_NM']
    gu_mise = a['IDEX_MVL']

    print(gu_name,gu_mise)


웹스크래핑(크롤링)

웹에 접속해서 특정 데이터를 솎아내어 가지고 오는 것

pip install bs4
: 가상환경 활성화 해주고(venv) beautifulsoup4 패키지/라이브러 추가 설치하기

- beautifulSoup 데이터를 솎아내는 라이브러리
- requsets 웹에 접속하는 라이브러리

bs4(beautifulsoup4) 사용해보기

# bs4 써보기
import requests
from bs4 import BeautifulSoup

# 해당 url의 정보를 크롤링 해올 것이다.
URL = "https://movie.daum.net/ranking/reservation"
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')

# print(soup)

# 타겟 URL을 읽어서 HTML를 받아오고,
# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.


import requests
from bs4 import BeautifulSoup

URL = "https://movie.daum.net/ranking/reservation"
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')

# select / select_one사용
title = soup.select_one('#mainContent > div > div.box_ranking > ol > li:nth-child(1) > div > div.thumb_cont > strong > a')

# print(title)

print(title.text)


select / select_one

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

개발자도구에서 어떤 뼈대를 가져와야 하는지 찾기

원하는 부분에서 마우스 오른쪽 클릭
→ 검사 원하는 태그에서 마우스 오른쪽 클릭 Copy
→ Copy selector로 선택자를 복사할 수 있음

title = soup.select_one("#mainContent > div > div.box_ranking > ol > li:nth-child(1) > div > div.thumb_cont > strong > a").text
print(title)​

> soup.select_one()으로 셀렉터 값을 넣고 원하는 뼈대만 꺼내기
>> print()로 어떻게 가져와졌는지 확인
>>> 가져온 데이터는 html의 뼈대이기 때문에 .text()를 사용해서 문자 값만 꺼내기


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

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

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

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

import requests
from bs4 import BeautifulSoup

URL = "https://movie.daum.net/ranking/reservation"
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')

lis = soup.select('#mainContent > div > div.box_ranking > ol > li')
# li들을 가져올꺼야

print(lis)
import requests
from bs4 import BeautifulSoup

URL = "https://movie.daum.net/ranking/reservation"
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')

lis = soup.select('#mainContent > div > div.box_ranking > ol > li')

# lis의 li를 돌면서
# title를 가져오는데
# title는 li에서 class가(.) link_txt인 것을 하나가져오는거야
for li in lis:
    title = li.select_one('.link_txt')
    print(title)


import requests
from bs4 import BeautifulSoup

URL = "https://movie.daum.net/ranking/reservation"
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')

lis = soup.select('#mainContent > div > div.box_ranking > ol > li')

for li in lis:
    title = li.select_one('.link_txt').text
    # print(title.text)


import requests
from bs4 import BeautifulSoup

URL = "https://movie.daum.net/ranking/reservation"
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')

lis = soup.select('#mainContent > div > div.box_ranking > ol > li')

# 순위(rank), 제목(title), 평점(rate) 가져오기
for li in lis:
    rank = li.select_one('.rank_num').text
    title = li.select_one('.link_txt').text
    rate = li.select_one('.txt_grade').text
    print(rank,title,rate)

title = li.select_one(".tit_item").text.strip("\n")
: 제목을 출력했는데 공백이 많다면, strip()을 검색해서 사용, 그래도 많다면, \n을 strip안에 넣어보기

DB

: 잘 쌓는게 아닌 저장해 놓은 데이터를 잘 가져오기 위함

 

Database에는, 크게 두 가지 종류가 있다.

RDBMS(SQL)

행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.

정형화된 규칙이 있어서 많은 정보를 관리하기에 유용(대기업)

ex) MS-SQL, My-SQL 등
No-SQL(Not only)

딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.

정해진 저장 규칙은 없음(스타트업)

ex) MongoDB

 

MongoDB

mongoDB 조작 시 필요한 패키지

pymongo설치 : pip install pymongo
dnspython설치 : pip install dnspython

pymongo 기본 코드
from pymongo import MongoClient
client = MongoClient('URL 입력')
db = client.dbsparta

# url이 mongodb주소

> 해당 url을 넣어주면 연결

> url에 <password>는 만들면서 지정한 password 넣어주면 

pymongo로 mongoDB 조작해보기
from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

# doc라는 딕셔너리를 하나 만들어보고
doc = {
    'name':'영수',
    'age':24
}

# 데이터 넣기
db.users.insert_one(doc)​

> 생성이 잘 된걸 볼 수 있다.


데이터 넣기 (앞전 영수의 데이터 넣고 추가로 넣은 거임)
from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

doc = {'name':'영희','age':30}
db.users.insert_one(doc)

doc = {'name':'철수','age':20}
db.users.insert_one(doc)​

pymongo(find)
# 핵심은 db.users.find({},{'_id':False})
all_users = list(db.users.find({},{'_id':False}))​
from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority') --->이 DB에서 
db = client.dbsparta

all_users = list(db.users.find({-조건-},{'_id':False})) 
# db에서 user들을 찾아서,{'_id':False} --> id 안보겠다

for a in all_users:
    print(a)

pymongo(find_one)
user = db.users.find_one({})
print(user)​
from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:sparta@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

user = db.users.find_one({})
print(user)​

pymongo(update_one)
db.users.update_one({'name':'영수'},{'$set':{'age':19}})

# mongoDB에서 name이 영수인걸 찾아서 age를 19로 바꿔라​

pymongo(delete_one)
# db.users.delete_one({조건})
db.users.delete_one({'name':'영수'})

영수의 정보가 삭제


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'})​

총 정리를 해보자!

즉, 웹에 접속해서 원하는 데이터를 크롤링해서 저장하기의 과정이 필요한것, 모두 가상환경으로의 설정 후 진행!!


+웹에 접속을 위해서 reauests 라이브러리가 필요

설치 : pip install requests

import requests 

r = requests.get('url') 
rjson = r.json()

print(rjson)


+원하는 데이터를 크롤링하기 위해서 bs4(beautifulsoup4) 라이브러리가 필요

설치 : pip install bs4

import requests
from bs4 import BeautifulSoup

URL = "크롤링 할 웹 페이지 url"
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')


+mongoDB에 저장해주기 위해서 

pymongo설치 : pip install pymongo
dnspython설치 : pip install dnspython

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

# url이 mongodb주소
# client = MongoClient('mongodb+srv://test:<password>@cluster0.ybbyzho.mongodb.net/?retryWrites=true&w=majority')
# <password>자리에는 부여했던 password 넣어주기

> 이게 제일 맨 위에 배치되어야 함

Comments