본문 바로가기

About coding/Weekly I learned

[WIL]2023년 2월 20일~24일 : fetch 사용법, Jquery 기본코드, requests 기본코드, bs4 기본코드, certifi 오류해결법, 몽고디비 이용법, flask로 API서버 만드는 법

2월 20일

-웹개발반 복습

1. 다큐먼트레디 제이쿼리

<script>
	$('#document').ready(function () {
    
    })
</script>

새로고침 끝나자마자 원하는 값으로 준비 되어 있게 하는 코드

 

2. 저번에 배운 fetch로 가져와서 내꺼에 데이터 붙이는 코드

<script>
	function hey() {
    	fetch("주소주소주소").then(res => res.json()).then(data => {
        	let seoul = data['Realtimedata']['seoul']
            $('#q1').empty()
            seoul.forEach((a) => {
            	let temp = a['temperature']                
            	let wthr = a['weather']                
            	let hum = a['humidity']
                
                let temp_html = `<tr>
                                    <td>${temp}</td>
                                    <td>${wthr}</td>
                                    <td>${hum}</td>
                                </tr>`
                $('#q1').append(temp_html)
            })
        })
    }
</script>

그리고 이런 거 하기 전에 <head></head>에 JQuery 기본태그 붙어있어야 함

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

별모양 붙이기 태그 (별이 몇 갠지 데이터는 숫자로 표현되어 있다는 전제)

let star = a['star']

let star_image = '⭐'.repeat(star)

 

 

3. 몽고DB 사용해서 백엔드 만들기

1) 파이썬 다운로드 > 설치 때 add python 3.8 to path 꼭 체크박스 하기

2) 윈도우는 깃배쉬도 설치해야 함. Gitbash > install 쭉~~ 딴거 만질거없음

3) 바탕화면에 pythonprac 폴더 생성 > 비스코에서 hello.py 파일 생성 > 비스코에서 확장 기능 python 설치

4) 터미널 > 새 터미널 > 터미널 기본 프로필 선택 > Git Bash > 이렇게 해두고 터미널에 알록달록한 글자들 뜨고 시작

5) 파이썬은 라이브러리(남이 만든 프로그램)가 강력한데, 라이브러리 설치하는 법:

인터프리터3.8.6으로 기본 선택 후 > 터미널에 입력 python -m venv venv > 3.8.6 누르고 venv 선택 > 새 터미널에서 venv 선택 > 이제 venv 공구상자에서 라이브러리 꺼내쓰게 됨.

6) 자바스크립트 제이쿼리에서 fetch의 역할을 하는

      파이썬의 리퀘스츠 라이브러리 설치하기 > pip install requests

        그리고 기본 코드를 써야 함

import requests # requests <--! 라이브러리 설치 필요 !-->

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

 

-SQL반 복습

1. 초반에 배우고 안써서 까먹은 문법이 있었따

select * from checkins
where week in (1,3)

이러면 위크 1주차, 3주차 코멘트만 추출할 수 있음!

 

 

2월 21일

-웹개발반 복습

1. 웹 스크래핑(크롤링): 우선 라이브러리가 필요.          **크롤링이란: 웹에 접속해서 데이터를 솎아내서 가져오는 일

웹에 접속하는 일= requests 사용,   데이터를 솎아내는 일= bs4 사용

pip install bs4

이렇게 beautifulSoup4 라이브러리를 깔아야 한다.

 

그렇게 하면 아래와 같은 코딩이 됨.

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')
ㄴ 그담에 그 데이터를 솎아낼 준비를 해서

print(soup)
ㄴ 찍어보자

그런 다음 프린트 자리에 다시

a = soup.select_one('')
                     ㄴ 작은 따옴표 자리에 뭔가를 넣으면 a라는 이름으로 그걸 솎아낼 수 있다.

위에껀 하나만 가져올 때고, 여러개를 가져와야할 때는 아래 처럼.

trs = soup.select('')

이제

웹사이트에서 갖고 오자 하는 것 우클릭 > 검사> 카피 > 카피셀렉터

한 두어줄 카피셀렉터로 가져와서 구경한다.

#old_content > table > tbody > tr:nth-child(2)
#old_content > table > tbody > tr:nth-child(3)
ㄴ 요렇게 구경해보면
#old_content > table > tbody > tr
요기부분이 공통인 걸 알 수 있다.

그럼 이걸 아래 ('') 안에다가 넣으면 된다.

trs = soup.select('')

응용해보면 예시 아래처럼 할 수 있다.

trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
    a = tr.select_one('td.title > div > a')
    if a is not None:
        print(a.text)

주의할 건, class ="title" 처럼 명찰이 지명된건 .title 이런식으로 쩜지명으로 타고 들어가고

<a alt = 어쩌구></a> 이런 alt 같은 속성은 a['alt'] 이런식으로 꺽쇠로 타고 들어간다.

===========================================================================

서버(데이터베이스) 만들어보기

몽고디비 사용

몽고디비 사용하려면 내 컴퓨터에서도 2개의 라이브러리가 필요

-pymongo

-dnspython

 

**certification 오류가 뜰 때 해결법

certifi 라이브러리를 설치해주면 인증오류 문제를 우회할 수 있다.

먼저 터미널에 pip install certifi 설치해 주고,

import certifi
ca = certifi.where()
ㄴ 이렇게 임포트 해주고

client = MongoClient('mongodb+srv://sparta:test@cluster0.wzq1kwb.mongodb.net/?retryWrites=true&w=majority', tlsCAFile = ca)
ㄴ 이렇게 파이몽고의 디비몽고 연결 코드에서도 맨 뒤에 , tlsCAFile = ca 추가

저장하고 터미널에서 파이썬 파일 실행 하면 끝

=========================================================================

본격 pymongo 이용법.

 

1. 몽고디비에 데이터를 하나 저장하기 코드

doc = {
    'name':'영수',
    'age':24
}

db.users.insert_one(doc)

2. 몽고디비에서 데이터를 CRUD 해보자. Creat Read Update Delete

-R 전부 다 꺼내오기

all_users = list(db.users.find({},{'_id':False}))

for a in all_users:
    print(a)
    
ㄴ특별히 반복문으로 본 이유는 list 형식의 데이터였기 때문에. ㅎㅎ
ㄴfind({},{'_id':False})에서 find 안에 있는 {}는 조건을 넣는 자리. 내가 뭘 찾으려는지 세부 조건.
ㄴ{'_id':False}는 결과값에 _id 라는 값이 붙어서 나오는 걸 제거해주는 역할.

-R 하나만 갖고오기

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

- U 저장된 데이터 하나를 변경하기

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

- D 저장된 데이터를 하나 삭제하기

db.users.delete_one({'name':'영수'})

복습하는 겸 정리해보면,

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

크롤링 할 때 특별한 기능

.text[0:2]
ㄴ 앞에서 두글자까지만 끊자. 결과값이 지저분할 때 씀

.text.strip()
ㄴ 결과값이 문장일 때 문장의 앞 뒤로 지저분하게 붙은 공백들을 제거하라는 뜻.

 

 

-SQL 복습

2-1~ 2-7

select count(*) from table

select min(숫자필드) from table

select max(숫자필드) from table

select sum(숫자필드) from table

select avg(숫자필드) from table

select * from table
group by
order by 필드명

 

2월 22일

웹개발반 복습

-서버(API)만들기: 폴더 만들기 > app.py파일 만들기 > 가상환경venv설치 > flask 라이브러리 설치

통상적으로 플라스크 프레임웍을 쓸 때, 가장 기본이 되는 파이썬 파일 이름을 app.py라고 쓴다.

>venv랑 동급으로 폴더 templates 만들기>그밑에 파일 index.html 만들기(프론트엔드부분이될것)

>app.py 파일로 가서 윗줄에 , render_template 기능 추가

from flask import Flask, render_template
app = Flask(__name__)

-GET 요청은 주소창에 쳐서 Read 기능을 주로 하고, POST요청은 데이터의 생성, 업데이트, 삭제 할 때 사용한다.

-클라이언트(브라우저)의 요청 > API가 심부름한다 > 데이터 > API > 클라이언트에게 반환

**Flask 프레임웍이란: 웹페이지를 찍어내는 공장 역할

-Flask프레임웍으로 API를 만들고, 사용하는 과정에서 두 가지 기능이 필요함 Flask의 request와 jsonify 기능.

from flask import Flask, render_template, request, jsonify ㅡ>>>요로케 기능을 쓸거라고 첫 줄에 꼭 써줘야한다.
app = Flask(__name__)

@app.route('/')
def home():
   return render_template('index.html')

@app.route('/test', methods=['GET'])
def test_get():
   title_receive = request.args.get('title_give')
   print(title_receive)
   return jsonify({'result':'success', 'msg': '이 요청은 GET!'})

if __name__ == '__main__':  
   app.run('0.0.0.0',port=5000,debug=True)

그럼 app.py가 백엔드가 되고

index.html이 프론트엔드가 된다.

 

작동순서는

프론트엔드에서 클라이언트가 버튼 클릭

<button onclick="save_order()" type="button" class="btn btn-warning mybtn">주문하기</button>

버튼에 설정되어있던 함수 save_order()가 작동하면서,

function save_order() {
            let name = $('#name').val()
            let address = $('#address').val()
            let size = $('#size').val()
ㄴ이렇게 고객이 입력했던 값들을 가져오면서
            let formData = new FormData()
            formData.append("name_give", name)
            formData.append("address_give", address)
            formData.append("size_give", size)
ㄴ새로운 폼데이터를 형성해서
            fetch('/mars', { method: "POST", body: formData }).then((res) => res.json()).then((data) => {
                alert(data["msg"])
            });
        }
ㄴfetch를 작동시켜 백엔드의 '/mars' 창구로 요청서를 보냄

그러면 요청서가 백엔드로 가서,

@app.route("/mars", methods=["POST"])
def mars_post():
    name_receive = request.form['name_give']
    address_receive = request.form['address_give']
    size_receive = request.form['size_give']
ㄴ이렇게 고객이 입력한 이름,주소,평수 데이터를 받아서
    doc = {
        'name':name_receive,
        'address':address_receive,
        'size':size_receive
    }    
    db.mars.insert_one(doc)
ㄴ세가지 데이터들을 합쳐서 doc로 만들고 파이몽고를 사용하여 데이터서비스 몽고디비에 저장.

    return jsonify({'msg':'화성땅 구매 요청이 저장되었습니다!'})
ㄴ다 했다는 알림 메시지를 json형식의 데이터로 만들어 프론트에 보냄

그럼 프론트엔드에서

fetch('/mars', { method: "POST", body: formData }).then((res) => res.json()).then((data) => {
                alert(data["msg"])

json형식의 데이터를 착착착착 평소하듯이 일련의 단계를 거쳐서 데이터화 하고 백엔드에서 부탁했던 감사인사 "msg"의 값을 알러트.

끝.

 

- 고객이 입력값을 써넣는 칸을, 저절로 깨끗히 리셋되도록 하는 코드

window.location.reload()

이걸 fetch의 alert 밑에다가 넣는다.

 

 

 

SQL 복습

 

생활코딩