<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>BBOrong_22.log</title>
        <link>https://velog.io/</link>
        <description>아 스파르타 복습해야한다..</description>
        <lastBuildDate>Sun, 01 May 2022 07:40:31 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. BBOrong_22.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bbrong_22" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[내 프로젝트를 서버에 올리기]]></title>
            <link>https://velog.io/@bbrong_22/%EB%82%B4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EC%84%9C%EB%B2%84%EC%97%90-%EC%98%AC%EB%A6%AC%EA%B8%B0</link>
            <guid>https://velog.io/@bbrong_22/%EB%82%B4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EC%84%9C%EB%B2%84%EC%97%90-%EC%98%AC%EB%A6%AC%EA%B8%B0</guid>
            <pubDate>Sun, 01 May 2022 07:40:31 GMT</pubDate>
            <description><![CDATA[<p>어떤 컴퓨터도 서버가 될 수 있다고 했다.
서버의 역할은 기본적으로 클라이언트(주로 브라우저)가 요청을 하면 <strong>그릴 것을 주거나</strong>,아니면 뒤에서 Ajax로 요청을 하면 <strong>Ajax에 대한 답변으로 데이터를</strong> 주거나 이러한 <strong>어떤 뭔가</strong>를 주는 행위 이 가운데서 <strong>클라이언트들의 요청을 받는 행위</strong>를 하는 게 서버의 역할이다.</p>
<p>서버는 어떤 컴퓨터든지 그 역할을 수행할 수 있다.
모든 컴퓨터도 모든 역할을 할 수 있다.</p>
<p>그런데 언제나 요청에 응답하려면 컴퓨터가 항상 켜져 있어야 한다.그리고 app.py가 항상 실행되어 있어야 하고 모두가 접근할 수 있는 IP주소로 나의 웹 서비스에 접근할 수 있도록 컴퓨터를 밖에다가 열어놔야한다.</p>
<p>듣기만 해도 뭔가 보안에 취약해 보이고 왠지 특별한 컴퓨터가 있어야 할 것 같은 느낌이 든다.</p>
<p>그래서 통상적으로 모든 서비스는 이렇게 지금 코딩하는 컴퓨터에다가 서버 역할을 시켜서 밖에다 열어두지 않는다.특히 요새는 클라우드 환경:인터넷 환경에 있는 컴퓨터를 사서 거기다 올려놓고 사람들한테 그쪽으로 접속하게 만들어 둔다.</p>
<p>옛날에는 서버실이 따로 있고 컴퓨터들의 본체만 쌓아두고 거기다가 서버실을 만들어두기도 했었다.
요새는 그런 회사가 거의 없다.</p>
<p>그래서 AWS(아마존 웹서비스.아마존 e-커머스 회사에서 만들어둔 클라우드 플랫폼이다.) 라는 클라우드 서비스에서 편하게 서버를 관리하기 위해서 항상 켜 놓을 수 있는 컴퓨터인 EC2 사용권을 구입해 서버로 사용할 것이다.</p>
<h3 id="🐾-ip-주소와-포트">🐾 IP 주소와 포트</h3>
<p>사실 우리가 접속하는 컴퓨터는 숫자로 되어있는 주소(IP 주소)가 붙어있다. 우리가 아는 URL 은 우리가 알아보기 쉽게 하는 등의 이유로 IP 주소를 알파벳으로 바꾼 거다. 이렇게 변환해주는 시스템을 DNS 라고 한다.</p>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/22158a0b-4474-44fc-b2a0-506c4736c314/image.png" alt=""></p>
<ul>
<li><p>IP 주소(줄여서 IP라고 부른다.)</p>
<p>  : 컴퓨터가 통신할 수 있도록 컴퓨터마다 가지는 고유한 주소라고 생각하면 된다. 정확히는 네트워크가 가능한 모든 기기가 통신할 수 있도록 가지고 있는 특수한 번호다.  서버는 하나의 주소를 가지고 있다. </p>
</li>
<li><p>포트(port)</p>
<p>  : 하나의 IP에 여러 포트가 있다. 하나의 포트에 하나의 프로그램을 실행시킬 수 있다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[무비스타 - POST연습(삭제하기)]]></title>
            <link>https://velog.io/@bbrong_22/%EB%AC%B4%EB%B9%84%EC%8A%A4%ED%83%80-POST%EC%97%B0%EC%8A%B5%EC%A2%8B%EC%95%84%EC%9A%941-btl44z28</link>
            <guid>https://velog.io/@bbrong_22/%EB%AC%B4%EB%B9%84%EC%8A%A4%ED%83%80-POST%EC%97%B0%EC%8A%B5%EC%A2%8B%EC%95%84%EC%9A%941-btl44z28</guid>
            <pubDate>Sat, 30 Apr 2022 17:07:35 GMT</pubDate>
            <description><![CDATA[<h1 id="api-만들고-사용하기">API 만들고 사용하기</h1>
<h2 id="카드-삭제-api-delete-→-post">카드 삭제 API (Delete → POST)</h2>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/91f6ab1e-d0b1-45cf-bff7-65d7c6c2f30e/image.png" alt=""></p>
<p>1) 클라이언트와 서버 연결 확인하기
2) 서버부터 만들기
3) 클라이언트 만들기
4) 완성 확인하기</p>
<p>1) 클라이언트와 서버 연결 확인하기
서버에서 &#39;/api/delete&#39;에 &#39;POST&#39;에&#39;sample_give&#39;로 받고 있고 msg로는 &#39;delete 연결되었습니다!&#39;를 주고 있다.
클라이언트에선 변수로 name을 받는  deleteStar(name)라는 함수&#39;POST&#39;에 &#39;/api/delete&#39;
sample_give:&#39;샘플데이터&#39;로 주고 있고
alert으로 msg를 받는다.</p>
<p>브라우저에서 삭제를 누르니 &#39;delete 연결되었습니다!&#39;라는 msg가 뜬다.잘 연결이 되어있다.</p>
<p>2) 서버부터 만들기
name을 받아야한다.
<code>name_receive = request.form[&#39;name_give&#39;]</code>
받은 name으로 삭제를 해주어야한다.
 <code>db.mystar.delete_one({&#39;name&#39;:name_receive})</code>
msg로는 &#39;삭제완료!&#39;를 해주겠다.
<code>return jsonify({&#39;msg&#39;: &#39;delete 연결되었습니다!&#39;})</code></p>
<p>3) 클라이언트 만들기
데이터로는 name_give로 주고 방금 받은 name을 변수로 가져가면 되겠다.
<code>data: {name_give:name},</code>
마찬가지로 alert 밑에 새로고침 코드를 넣어준다.
<code>window.location.reload();</code></p>
<p>4) 완성 확인하기
리로딩을 하고 삭제 버튼을 눌러준다.
그러면 refresh 되면서 삭제한 카드가 삭제가 된다.
<img src="https://velog.velcdn.com/images/bbrong_22/post/5ec32256-43a9-476c-92ef-ecb815ca57a8/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[무비스타 - POST연습(좋아요+1)]]></title>
            <link>https://velog.io/@bbrong_22/%EB%AC%B4%EB%B9%84%EC%8A%A4%ED%83%80-POST%EC%97%B0%EC%8A%B5%EC%A2%8B%EC%95%84%EC%9A%941</link>
            <guid>https://velog.io/@bbrong_22/%EB%AC%B4%EB%B9%84%EC%8A%A4%ED%83%80-POST%EC%97%B0%EC%8A%B5%EC%A2%8B%EC%95%84%EC%9A%941</guid>
            <pubDate>Sat, 30 Apr 2022 16:50:48 GMT</pubDate>
            <description><![CDATA[<h1 id="api-만들고-사용하기">API 만들고 사용하기</h1>
<h2 id="좋아요-api-update-→-post">좋아요 API (Update → POST)</h2>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/1f75d8ea-990b-4fff-ad84-ee08810131e2/image.png" alt=""></p>
<hr>

<p>좋아요를 높여주는 기능을 만들면 된다.
어떤 의미인지 생각하자면
일단 클라이언트에서 이름을 받아서 그 이름의 좋아요 값을 찾은 다음에 그 좋아요 값에다 1을 더해서 그거를 덮어 씌워 주면 되겠다.다시 말해서 업데이트를 해주면 된다.</p>
<hr>

<p>1) 클라이언트와 서버 연결 확인하기
2) 서버부터 만들기
3) 클라이언트 만들기
4) 완성 확인하기</p>
<hr>

<p>1) 클라이언트와 서버 연결 확인하기
서버에서 &#39;/api/like&#39;에다 &#39;POST&#39;에 &#39;sample_give&#39;로 받고 있고 msg로 &#39;like 연결되었습니다!&#39;받고 있다.
클라이언트에선 likestar 함수가 &#39;위로!&#39;라는 버튼에 붙어있다.변수로(name)을 받고 있는데 좋아요를 받은 이름을 받아야 그 이름을 넘겨주면서 그 이름의 like를 올려달라 할 수 있다. 그 함수는 &#39;POST&#39;에 &#39;/api/like&#39;에다 sample_give:&#39;샘플데이터&#39;값을 주고 있다.잘되면 msg가 alert으로 뜬다.</p>
<p>브라우저에서 아무나 한명 &#39;위로!&#39;버튼을 누르니 msg &#39;like 연결되었습니다!&#39;가 잘뜬다.</p>
<p>2) 서버부터 만들기
서버에서는 이름을 받는다.
<code>name_receive = request.form[&#39;name_give&#39;]</code>
좋아요를 받은 이름을 찾아서 뭘 해줘야하기 때문에 아까 좋아요 누른 스타에 해당하는 이름 하나를 찾아야한다. 한개 찾기 db를 가져온다. target_star라는 변수를 주고 목록이름은 name 그대로이다.
<code>target_star = db.mystar.find_one({&#39;name&#39;:name_receive})</code>
target_star로 찾을 것이다.한줄만 나올것이다.
그 안에서 like값만 갖고 오고 싶다.
<code>current_like = target_star[&#39;like&#39;]</code>
그리고 거기서 +1을 해줄거기 때문에
<code>new_like = current_like +1</code>
이제 star의 like 값을 업데이트 시켜줘야 한다.
name_receive로 받아 온것에 &#39;like&#39;를 new_like해주겠다.
<code>db.mystar.update_one({&#39;name&#39;: name_receive}, {&#39;$set&#39;: {&#39;like&#39;: new_like}})</code>
msg로는 &#39;좋아요 완료!&#39;를 띄워주겠다.
<code>return jsonify({&#39;msg&#39;: &#39;좋아좋아!&#39;})</code></p>
<p>3) 클라이언트 만들기
data를 뭘로 갖다주냐면
request.form[&#39;name_give&#39;]
name_give로 준다 했고 내용물은 변수로 담겨질name이다.
<code>data: {name_give:name},</code></p>
<p>한가지 더,좋아요를 눌렀을때 새로고침이 되면 더 좋겠다.alert 아래에
<code>window.location.reload();</code></p>
<p>4) 완성 확인하기
브라우저에서 위로!를 누르면 업데이트되면서 +1이 축적되고 refresh(새로고침) 되면서 좋아요가 많은 스타가 위로 올라간다.</p>
<p>좋아요 버튼이 눌리면 likeStar(name)함수가 작동이 되면서 좋아요를 받은 변수(name)이 들어가게 되고 그 좋아요 받은 이름을 &#39;name_give&#39;로 형식으로 주고 서버에서 받아서 
그 좋아요 받은 이름을 찾는다.그 찾는 이름에서 like를 찾고 거기서 +1을 해준다.
그리고 그 +1해준 이름을 +1로 업데이트로 반영시켜준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[무비스타-GET(보여주기)]]></title>
            <link>https://velog.io/@bbrong_22/%EB%AC%B4%EB%B9%84%EC%8A%A4%ED%83%80-GET%EB%B3%B4%EC%97%AC%EC%A3%BC%EA%B8%B0</link>
            <guid>https://velog.io/@bbrong_22/%EB%AC%B4%EB%B9%84%EC%8A%A4%ED%83%80-GET%EB%B3%B4%EC%97%AC%EC%A3%BC%EA%B8%B0</guid>
            <pubDate>Sat, 30 Apr 2022 14:49:54 GMT</pubDate>
            <description><![CDATA[<h1 id="api-만들고-사용하기">API 만들고 사용하기</h1>
<h2 id="영화인-조회-api-read-→-get">영화인 조회 API (Read → GET)</h2>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/5cf1fa97-bbaa-403e-8c97-4709acc2ff53/image.png" alt=""></p>
<hr>

<ol>
<li>클라이언트와 서버 연결 확인하기</li>
<li>서버부터 만들기</li>
<li>클라이언트 만들기</li>
<li>완성 확인하기</li>
</ol>
<hr>

<ol>
<li>클라이언트와 서버 연결 확인하기
서버에서 &#39;/api/list&#39;에&#39;GET&#39;
sample_give로 받고
msg로는 &#39;list 연결되었습니다!&#39;라고 내려주고
있다.
클라이언트에서는 showStar라는 함수로 요청하고 있고 로딩이되자마자 동작하게 되어있다.(조회)
GET에 &#39;/api/list?sample_give=샘플데이터&#39;</li>
</ol>
<p>브라우저에서 로딩하자마자 &#39;list 연결되었습니다!&#39;라는 msg가 뜬다.연결이 잘되어있다.</p>
<ol start="2">
<li>서버부터 만들기
서버에서 할 일
Robo3T에서 가져왔던 정보들을 쭉 클라이언트에 내려주면 된다.
나홀로메모장에서 articles 내려주듯이 내려주면 되는데 다른점은 <strong>like의 역순</strong>으로 내려줘야 한다.일단 전부 내려주는것 부터 해본다.
<code>movie_star = list(db.mystar.find({},{&#39;_id&#39;:False}))</code>
<code>return jsonify({&#39;movie_stars&#39;:movie_star})</code>
그다음 이제 정렬을 해줄건데,
pymongo에는 정렬을 해서 뽑는 기능이 있다.</li>
</ol>
<p>🔍🔍pymongo 정렬🔎🔎&gt;&gt;sort라는 단어가 나온다.
🔍🔍pymongo sort w3school🔎🔎
mydoc = mycol.find().sort(&quot;name&quot;)
예시를 보니 이름순(오름차순)대로 정렬된다.
mydoc = mycol.find().sort(&quot;name&quot;, -1)
예시를 보니 이름역순(내림차순)으로 정렬된다.</p>
<p>find()가 끝나는 지점에서 붙여주면 되겠다.
<code>movie_star = list(db.mystar.find({},{&#39;_id&#39;:False}).sort(&#39;like&#39;, -1))</code>
큰따옴표대신 작은따옴표로 대체해본다.</p>
<ol start="3">
<li>클라이언트 만들기
클라이언트에서 해야될 일은
서버에서 response에 이 &#39;movie_stars&#39; 내려줬던걸 확인해 봐야한다.<pre><code>let mystars = response[&#39;movie_stars&#39;]
                     console.log(mystars)</code></pre><img src="https://velog.velcdn.com/images/bbrong_22/post/fe03d872-20fb-4c8b-8220-933df077d707/image.png" alt="">
딕셔너리가 들어있는 리스트 형태로 순서대로 잘 찍혔다.</li>
</ol>
<p>이제 for문으로 돌려준다.
받아올 것은 (name,img_url,recent,url,like)다.
let 목록변수 = 받기로한 데이터의 변수[i][&#39;목록&#39;]
<img src="https://velog.velcdn.com/images/bbrong_22/post/4562882c-13b6-4388-8344-17f0b838d291/image.png" alt="">
<img src="https://velog.velcdn.com/images/bbrong_22/post/41abd193-4ab4-435e-83c9-97066c0b6c2d/image.png" alt="">
하나씩 목록마다 순서대로 꺼내졌다.</p>
<p>마지막으로 카드를 만들어서 붙여줘야하는데 </p>
<p>카드의 이미지,이름,좋아요 수,최신작들을 바꿔줘야 한다.
여기에 하나 더 숨겨져 있는데
카드 디브를 열어보면 onclick=&quot;likestar(&#39;김다미&#39;)&quot;에 이름을 넣게 되어있다.
위에가서 보면 likestar(name) 이름을 받는 함수 이다.
아래에 여러개의 이름이 더 있는데 빼먹지말고 <strong>같이 교체</strong>해주면 되겠다.
card div 전체를 복사해주고
let temp_html=<code>``</code>
에 넣어준다.
너무 기니까 접어주고 그 아래에
$(&#39;#id값&#39;).append(temp_html)
원래 있던 card div는 삭제해준다.</p>
<ol start="4">
<li>완성 확인하기
like의 역순으로 잘 나오는지 확인해야 한다.
아직 조회의 기능밖에 없으니까
Robo3T로 가서 mystar 컬렉션에서 아무나 like를 수정해준다.like목록 내용물 아무거나에서 오른쪽 버튼&gt;Edit Document&gt;like 1로 바꾸고 save
브라우저에서 리로딩해서 보면 바꾼 카드의 인물이 제일 위에 올라와 있다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[무비스타 (준비)]]></title>
            <link>https://velog.io/@bbrong_22/%EB%AC%B4%EB%B9%84%EC%8A%A4%ED%83%80-%EC%A4%80%EB%B9%84</link>
            <guid>https://velog.io/@bbrong_22/%EB%AC%B4%EB%B9%84%EC%8A%A4%ED%83%80-%EC%A4%80%EB%B9%84</guid>
            <pubDate>Sat, 30 Apr 2022 12:19:52 GMT</pubDate>
            <description><![CDATA[<p><a href="http://spartacodingclub.shop/moviestar">무비스타</a>
똑같이 만들기
좋아요 순대로 나열된다.
위로!버튼을 누르면 좋아요가 하나 올라가고
인물을 삭제 할 수도 있다.</p>
<hr>

<p>File&gt;New Project&gt;moviestar&gt;create
New&gt;Python File&gt;app.py
New&gt;Directory&gt;static/templates(&gt;html File&gt;index.html)
File&gt;setting&gt;flask/pymongo/bs4/requests</p>
<hr>

<h3 id="데이터-쌓기">데이터 쌓기</h3>
<p>데이터를 먼저 모아두고 그 데이터를 보여주는 작업
크롤링해서 원하는 정보를 긁어오는 것이다.
시간상 크롤링 코드 짜놓은걸 갖다 쓰겠다.
New&gt;python File&gt;init_db
붙여놓고 작동시켜준다.
자료들이 잘 들어갔는지 확인하기 위해서
robo3T를 써주겠다.
collections&gt;mystar 잘 들어갔다.</p>
<h3 id="뼈대-준비하기">뼈대 준비하기</h3>
<p>코드스니펫
app.py/index.html 복붙하기
데이터 쌓기 했던 파일은 삭제하기
app.py 구동하기&gt;localhost:5000
<img src="https://velog.velcdn.com/images/bbrong_22/post/a6b73db5-5df4-409c-8f5f-124c3e7ce1ff/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[나홀로메모장-GET (보여주기)]]></title>
            <link>https://velog.io/@bbrong_22/%EB%82%98%ED%99%80%EB%A1%9C%EB%A9%94%EB%AA%A8%EC%9E%A5-GET-%EB%B3%B4%EC%97%AC%EC%A3%BC%EA%B8%B0</link>
            <guid>https://velog.io/@bbrong_22/%EB%82%98%ED%99%80%EB%A1%9C%EB%A9%94%EB%AA%A8%EC%9E%A5-GET-%EB%B3%B4%EC%97%AC%EC%A3%BC%EA%B8%B0</guid>
            <pubDate>Sat, 23 Apr 2022 07:13:21 GMT</pubDate>
            <description><![CDATA[<h2 id="api-만들고-사용하기">API 만들고 사용하기</h2>
<h3 id="💾리스팅-api-read-→-get💻">💾리스팅 API (Read → <strong>GET</strong>)💻</h3>
<p>우리가 만들 API 두 가지</p>
<p>1️⃣ 포스팅API  - 카드 생성 (Create) : 클라이언트에서 받은 url, comment를 이용해서 페이지 정보를 찾고 저장하기 
<strong>2️⃣✔ 리스팅API - 저장된 카드 보여주기 (Read)</strong></p>
<hr>  

<p>1️⃣  클라이언트와 서버 연결 확인하기
2️⃣  서버부터 만들기
3️⃣  클라이언트 만들기
4️⃣  완성 확인하기</p>
<hr>

<h3 id="1️⃣✔-클라이언트와-서버-연결-확인하기">1️⃣✔ 클라이언트와 서버 연결 확인하기</h3>
<p>👩‍💼app.py에서 <strong>받는 형식 체크</strong>하기
🙋‍♀️showarticles 에서 <strong>주는 형식 체크</strong>
성공하면 app.py에서 어떤 msg 내려주는지 체크
<strong>showarticles는 로딩이되자마자</strong> 나오게 되어있다.
브라우저에서 로딩을 하자마자 <strong>&#39;GET 연결 되었습니다!&#39;</strong>라는 alert이 뜬다.</p>
<h3 id="2️⃣✔-서버부터-만들기">2️⃣✔ 서버부터 만들기</h3>
<p><strong>👨‍💼서버 쪽에서 할 일</strong>
저장된 정보를 모두 불러와서 그대로 클라이언트한테 줄거기 때문에 
클라이언트로부터 <strong>받을 데이터 없다.</strong>
same_ages = list(db.users.find({&#39;age&#39;:21},{&#39;_id&#39;:False}))
<strong>articles로 변수</strong>를 받겠다.
<strong>articles collection</strong>에서 데이터를 가져온다.
find에 <strong>조건없다.</strong>
<strong>articles = list(db.articles.find({}, {&#39;_id&#39;: False}))</strong></p>
<p>이제 msg를 내려줄게 아니라 <strong>articles 정보를 내려주면 된다.</strong>
<strong>&#39;all_articles&#39;라고 하고 내려줄것이다.</strong>
return jsonify({&#39;all_articles&#39;:<strong>articles</strong>})</p>
<h3 id="3️⃣✔-클라이언트-만들기">3️⃣✔ 클라이언트 만들기</h3>
<p>서버에서 준 데이터를 그대로 브라우저에 그려줄(붙여줄)것이기 때문에
<strong>🙋‍♀️데이터 가지고 가야할 것 없다.</strong>
 <strong>url: &quot;/memo&quot;,</strong>
그리고 <strong>서버에서 준 데이터들을 잘 받았는지 확인</strong>하기 위해,
<strong>(response)에 articles가 잘 내려오는지 확인</strong>하는게 먼저다.
먼저 let articles = response[&#39;&#39;]</p>
<p>app.py에서 return jsonify({<strong>&#39;all_articles&#39;</strong>:articles})
👉response에  <strong>all_articles로(=articles전체db)내려준다고 하였다.</strong>
let articles = response<strong>[&#39;all_articles&#39;]</strong>
console.log(articles)
브라우저에 리로딩하고 확인</p>
<p>이제 <strong>카드를 붙이려면 for문</strong>을 돌려야한다.
(console에 찍혀 있는 <strong>5개의 데이터</strong>를 가져와야한다.)
<strong>let 변수 = collection이름[에서의 i번째][&#39;가져올 목록&#39;]</strong>
순서대로 나열해준다</p>
<pre><code>for (let i = 0; i &lt; articles.length; i++) {
     let title = articles[i][&#39;title&#39;]
     let image = articles[i][&#39;image&#39;]
     let url = articles[i][&#39;url&#39;]
      let desc = articles[i][&#39;desc&#39;]
      let comment = articles[i][&#39;comment&#39;]

    console.log(title,image,url,desc,comment)</code></pre><p><img src="https://velog.velcdn.com/images/bbrong_22/post/4a78d630-44b5-467e-b70d-1473902b0f7e/image.png" alt="">
잘 찍혔다.</p>
<p>이제 붙여주겠다.
<strong>card-div를 하나 가져온다.</strong>
내용물에 붙여준다.
<img src="https://velog.velcdn.com/images/bbrong_22/post/8b852277-d2b7-48e1-a8e8-5cc43b7313bc/image.png" alt="">
temp_html 붙여줄건데 어디다 붙여주냐면 
id &quot;cards-box&quot;
에다 붙여준다.
<strong>$(&#39;#cards-box&#39;).append(temp_html)</strong></p>
<p>이제 처음 붙어있던 카드들을 삭제해줘도 될 것 같다.
있던 card div들을 삭제해준다.</p>
<h3 id="4️⃣✔--완성-확인하기">4️⃣✔  완성 확인하기</h3>
<p>붙여진 카드 url들어간다.
원하는 영화 들어가서
url을 따온 뒤에
포스팅박스 안에 url을 넣고 comment 써주기
기사저장 누르고 리로딩되면 방금 내가 작성한 카드가 붙는것을 확인 할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/46512de8-a1f4-4f05-819b-f8defbd93c5a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[나홀로메모장-POST (메모하기)]]></title>
            <link>https://velog.io/@bbrong_22/%EB%82%98%ED%99%80%EB%A1%9C%EB%A9%94%EB%AA%A8%EC%9E%A5-POST</link>
            <guid>https://velog.io/@bbrong_22/%EB%82%98%ED%99%80%EB%A1%9C%EB%A9%94%EB%AA%A8%EC%9E%A5-POST</guid>
            <pubDate>Sat, 23 Apr 2022 03:11:16 GMT</pubDate>
            <description><![CDATA[<p>나홀로메모장 app.py뼈대
나홀로메모장 index.html 
복붙
app.py run
localhost:5000</p>
<hr>

<h2 id="📢api-만들고-사용하기">📢API 만들고 사용하기</h2>
<h3 id="📀포스팅api-create-→-post💿">📀포스팅API (Create → POST)💿</h3>
<p> 우리가 만들 API 두 가지</p>
<p><strong>1️⃣✔ 포스팅API  - 카드 생성 (Create) : 클라이언트에서 받은 url, comment를 이용해서 페이지 정보를 찾고 저장하기</strong>
2️⃣ 리스팅API - 저장된 카드 보여주기 (Read)</p>
<hr>

<p>1️⃣ 클라이언트와 서버 연결 확인하기
2️⃣ 서버부터 만들기
3️⃣ 클라이언트 만들기 
4️⃣ 완성 확인하기</p>
<hr>

<h3 id="1️⃣✔--클라이언트와-서버-연결-확인하기">1️⃣✔  클라이언트와 서버 연결 확인하기</h3>
<p>app.py에서 먼저 볼 것은 어떤 형태인가.
<strong>/memo에 post</strong>형식이다.
<strong>&#39;sample_give&#39;</strong>형태로 받는다.
<strong>postarticle이라는 함수</strong>에서 <strong>비교확인</strong>을 한다.
확인을 다 했으면 postaticle이라는 <strong>함수가 붙어있는 쪽</strong>으로 간다.
<strong>기사 저장 부분에 붙어있다.</strong>
<strong>(순서)</strong>: 기사 저장을 누르면&gt;postaticle 함수가 불리고&gt;이게 불리면 ajax콜을 할 것이고&gt;
app.py(창구)에서 post /memo형식이 맞고 sample_give를 잘 받으면&gt;
msg로 &#39;POST 연결되었습니다!&#39;를 주면&gt;alert으로 그 msg를 띄워준다.</p>
<p><strong>기사저장을 누르니 POST 연결되었습니다!</strong>라는 문구가 뜬다.
잘 연결 되었다.</p>
<h3 id="2️⃣✔-서버부터-만들기">2️⃣✔ 서버부터 만들기</h3>
<p>👩‍💼첫째,<strong>url하고 코멘트를 받아야한다.</strong>
<del>(창구에서 민증 가져오라는 식)</del>
url_receive = request.args.get(&#39;url_give&#39;)
comment_receive = request.args.get(&#39;comment_give&#39;)</p>
<p>둘째, <strong>받은 url을 가지고</strong> 
타이틀,이미지,디스크립션 <strong>크롤링</strong> 해와야한다.</p>
<p><strong>크롤링코드 조각기능</strong>으로 짜놓은게 있다.
서버에 import되있는지 확인
<img src="https://velog.velcdn.com/images/bbrong_22/post/f53cd183-baab-4786-847f-c11a1de9e55c/image.png" alt=""></p>
<p><strong>탭</strong>으로 한 칸 띄워줘야 <strong>def listing</strong> 함수에 들어간다.</p>
<p>url_give로 받는 url_receive를
크롤링 해온 <strong>url주소 대신</strong>
url = <strong>url_receive</strong>로 바꿔치기 해도되지만
<img src="https://velog.velcdn.com/images/bbrong_22/post/9fd99683-c698-4708-b27a-75c3dea69097/image.png" alt="">
<strong>data</strong>에 있는 <strong>url대신 url_receive로</strong> 넣어준다.
<strong><del>(갖고온 url주소는 없애 버린다.)</del></strong>
url_receive 받아서 data에 들어가고 <strong>크롤링이 진행</strong>될 것이다.</p>
<p>그런데,지금은 print가 필요가 없다.
<strong>insert</strong>를 해줘야한다.(post니 정보를 받고있는 입장이다)
pythonprac폴더&gt;dbprac을 끌어다 놓는다.
import가 app.py에도 있는지 본다.</p>
<p>저장해줄 목록을 하나씩 적어준다.
<strong>doc={&#39;목록 이름&#39;:목록 내용물}</strong> 이런식
db.<strong>articles</strong>.insert_one(doc)
articles에 <strong>저장</strong>하기로 한다.
<img src="https://velog.velcdn.com/images/bbrong_22/post/eba590b1-a360-45c1-8469-92a21fd2c243/image.png" alt="">
저장이 완료 되면 msg로 띄워줄것은 대충 &#39;저장 완료!&#39;라고 해둔다.</p>
<h3 id="3️⃣✔-클라이언트-만들기">3️⃣✔ 클라이언트 만들기</h3>
<p><strong>url,comment</strong>를 가지고 app.py(창구)에 가야 한다.
<strong>let 가져가야할 것 = $(&#39;#해당 input-box id&#39;).val()</strong></p>
<pre><code>function postArticle() {
                let url = $(&#39;#post-url&#39;).val()
                let comment = $(&#39;#post-comment&#39;).val()
                $.ajax({</code></pre><p><strong>post랑 /memo</strong>형식 같고 
data: {sample_give:&#39;샘플데이터&#39;},만 바꿔주면 된다.
<strong>app.py(창구)에서 어떤 방식으로 가져오라고 했냐면</strong>
url_receive = request.form<strong>[&#39;url_give&#39;]</strong>
comment_receive = request.form<strong>[&#39;comment_give&#39;]</strong>
url_give랑 comment_give방식으로 가져오라고 했다.
<strong>👉data: {url_give:url,comment_give:comment},</strong></p>
<p>url,comment를 가져가서 app.py에서 잘 처리해주면
성공메시지로 <strong>저장완료!alert</strong> 띄우기</p>
<h3 id="4️⃣-완성-확인하기">4️⃣ 완성 확인하기</h3>
<p>브라우저에서 리로딩하고
포스팅박스열기&gt;url작성&gt;comment작성&gt;기사저장&gt;저장완료msg보기
그런데,저장완료!까지 떴는데 작성했던게 새로고침이 안됀다.<strong>새로고침을 해주자</strong>
<strong>alert아래에 window.location.reload()</strong> 작성해준다.
리로딩하고 다시작성 <strong>이제 기사저장하면 새로고침이 된다.</strong>
robo3T에서 확인해보기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[나홀로메모장-조각기능 구현해보기]]></title>
            <link>https://velog.io/@bbrong_22/%EB%82%98%ED%99%80%EB%A1%9C%EB%A9%94%EB%AA%A8%EC%9E%A5-%EC%A1%B0%EA%B0%81%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@bbrong_22/%EB%82%98%ED%99%80%EB%A1%9C%EB%A9%94%EB%AA%A8%EC%9E%A5-%EC%A1%B0%EA%B0%81%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Wed, 20 Apr 2022 15:13:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>이미지,제목,요약 등을 어디서 가져올까</strong>
API 설계를 했는데 어떤 기술이 필요한데 그 <strong>기술을 먼저 검증</strong>을 해봐야 한다.
프로젝트 시작하기 전에 <strong>테스트</strong>를 해본다.개인적으로 <strong>조각 기능이라 부른다</strong>한다.</p>
</blockquote>
<h2 id="❔❔이미지제목요약들을-어떻게-url만-갖고-크롤링을-해올까❔❔">❔❔이미지,제목,요약들을 어떻게 url만 갖고 크롤링을 해올까❔❔</h2>
<h3 id="📢meta태그를-이용해서-크롤링을-해볼-것이다">📢<strong>meta태그</strong>를 이용해서 크롤링을 해볼 것이다.</h3>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/88c2e7e6-a1eb-438f-bd82-b27bbaf436f6/image.png" alt=""></p>
<blockquote>
<p><code>&lt;head&gt;</code>안에 <code>&lt;meta&gt;</code>가 있는데 그 안에 <strong>og:title,og:image,og:description</strong>을 주목해봐야한다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/eb4bbed8-b55f-4d40-b2ba-0235fc273a44/image.png" alt=""></p>
<blockquote>
<p>카톡이나 페이스북 이런데 <strong>공유</strong> 했을때 자동으로 <strong>이미지,타이틀,요약</strong>이 나오는데
이런 거를 <strong>og:title,og:image,og:description</strong> 이라는 <strong>meta태그</strong>에다가 넣어놓으면
<strong>어느 사이트든 자동으로 긁어갈 수 있도록 조치</strong>를 취해논거다.</p>
</blockquote>
<p>많은 메신저들이 이 형태를 이용한다.
반대로 우리는 url을 이렇게 만드는 입장이라고 한다면 og:title,og:image,og:description을 잘 넣어놔야 공유할 때 저렇게 잘 뜬다.</p>
<h2 id="📢이제-ogtitleogimageogdescription을-스크래핑-해올-거다">📢이제 og:title,og:image,og:description을 <strong>스크래핑 해올 거다.</strong></h2>
<blockquote>
<p><strong>테스트 할 Python File</strong>을 만든다.<strong>실행이 잘되면 app.py에다가 필요한 부분은 갖다가 넣을것이다.</strong>
그러면 중간에 구현하지 못하는 기능이 있어서 <strong>스트레스 받을 일이 없다.</strong></p>
</blockquote>
<p>코드스니펫에서 <strong>크롤링 기본코드</strong>를 복붙한다.
print(soup)해서 html이 잘 찍히는지 확인 먼저 한다.</p>
<blockquote>
<p>title = soup.select_one(&#39;&#39;)
👉네이버 영화 그린북에서 element에서 meta태그안의 <strong>og:title그린북</strong>쪽에서 copyselector해서 넣는다.
print(title)하면
안나온다.</p>
</blockquote>
<h3 id="🎈meta태그의-순서">🎈meta태그의 순서</h3>
<p>왜냐면 사람이 직접 브라우저에서 <strong>element</strong>들어가서 확인한 <strong>meta태그의 순서</strong>와
<strong>파이썬 코드</strong>가 접속했을 때 나오는 <strong>meta태그의 순서가 다르기 때문이다.</strong>
괄호의 숫자를 바꿔가면서 찾아야하는데 너무 번거롭다.</p>
<blockquote>
<p>그래서 지금은 이 방법이 아니라 (&#39;meta[]&#39;)
👉meta 태그 중에서 [] 속성이 일치하는 애를 가지고 와라</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/842976b8-b075-42e3-8b57-971d7534111f/image.png" alt=""></p>
<blockquote>
<p>title = soup.select_one(&#39;meta[property=&quot;og:title&quot;]&#39;)
print(title)
▶</p>
</blockquote>
<p>  <img src="https://velog.velcdn.com/images/bbrong_22/post/f1ad4178-2712-48a9-88f1-941da5de8535/image.png" alt=""></p>
<blockquote>
<p>그 중에서도 이 content만 갖고 오면 된다.
print(title[&#39;content&#39;])
▶
그린북</p>
</blockquote>
<blockquote>
<p>이 print(title<strong>[&#39;content&#39;]</strong>)를
title = soup.select_one(&#39;meta[property=&quot;og:title&quot;]&#39;)<strong>[&#39;content&#39;]</strong>
여기다 두면 똑같다.</p>
</blockquote>
<p>마찬가지로 나머지도 복붙해서 데이터만 바꿔 끼워준다.</p>
<blockquote>
<p>ogtitle = soup.select_one(&#39;meta[property=&quot;og:title&quot;]&#39;)[&#39;content&#39;]
ogimage = soup.select_one(&#39;meta[property=&quot;og:image&quot;]&#39;)[&#39;content&#39;]
ogdesc = soup.select_one(&#39;meta[property=&quot;og:description&quot;]&#39;)[&#39;content&#39;]
print(ogtitle,ogimage,ogdesc)
▶</p>
</blockquote>
<blockquote>
<p>조각 기능을 완성 하였다.
app.py를 코딩하다가 조각 기능이 필요한 순간에 적절하게 갖다 붙히면 된다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[나홀로메모장 API 설계하기]]></title>
            <link>https://velog.io/@bbrong_22/%EB%82%98%ED%99%80%EB%A1%9C%EB%A9%94%EB%AA%A8%EC%9E%A5</link>
            <guid>https://velog.io/@bbrong_22/%EB%82%98%ED%99%80%EB%A1%9C%EB%A9%94%EB%AA%A8%EC%9E%A5</guid>
            <pubDate>Wed, 20 Apr 2022 11:16:46 GMT</pubDate>
            <description><![CDATA[<p><a href="http://spartacodingclub.shop/">나홀로메모장</a>
처럼 만들기</p>
<p>New project&gt;alonememo
app.py/templates/static
setting&gt;flask/pymongo/(url넣었을때 <strong>자동으로 정보가 가져와졌다.크롤링이 필요</strong> 크롤링을 위한)requests/bs4</p>
<blockquote>
<p>모든 프로젝트를 하기 전에는 <strong>API를 설계하는 일이 가장 처음에 해야될 일이다.</strong>
그래야 우리 서비스에 <strong>어떤 기능들이 필요로</strong>하고 <strong>그 기능은 어떤 순서로 구현</strong>을 할 건지
이런 계획하는 설계 일을 해야한다.</p>
</blockquote>
<blockquote>
<p>👉<strong>나홀로메모장</strong>을 기준으로 어떤 기능들이 필요한지 <strong>API를 먼저 설계</strong>를 해볼 것이다.
첫번째 기능은 <strong>url하고 코멘트</strong>를 서버 쪽에 보내줘서 서버에서 <strong><em>그 데이터</em></strong>를 <strong>저장 하는거(POST)</strong>
두번째 기능은 <strong>카드들을 보여 주는 것(GET)</strong>이다.
<strong>DB에 저장</strong>해야 할 것들은 <strong>이미지URL,제목,요약,코멘트</strong> 그리고 제목을 눌렀을 때 <strong>링크</strong>까지해서 <strong>5개</strong> 이다.</p>
</blockquote>
<h2 id="👩💼api-설계하기👩💻">👩‍💼API 설계하기👩‍💻</h2>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/3a60110e-2d54-4ba1-bf27-c01afaf80e59/image.png" alt=""></p>
<p><strong>받은 url</strong>을 가지고 <strong>제목,요약,이미지 주소 스크래핑</strong>
제목,요약,url,이미지url,코멘트<strong>(<em>그 데이터</em>)5개 정보를 모두 DB에 저장</strong>
다되면 <strong>success</strong></p>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/61e11e66-5b17-48ad-9768-4227f0aa512d/image.png" alt="">
클라이언트한테 <strong>받을 데이터 없다.</strong>왜냐하면 다 줄거기 때문에.
<strong>카드 만들어서 붙이면 끝</strong></p>
<p>🐾이 리스팅API는 클라이언트에서 언제 호출할까
로딩이 되자마자 바로 
<strong>기사저장 버튼</strong>에다가 <strong>로딩이 끝나면 바로 호출되는 Ajax콜</strong> 하나 만든다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[모두의책리뷰 GET (리뷰 보여주기)]]></title>
            <link>https://velog.io/@bbrong_22/%EB%AA%A8%EB%91%90%EC%9D%98%EC%B1%85%EB%A6%AC%EB%B7%B0-GET-%EB%A6%AC%EB%B7%B0-%EB%B3%B4%EC%97%AC%EC%A3%BC%EA%B8%B0</link>
            <guid>https://velog.io/@bbrong_22/%EB%AA%A8%EB%91%90%EC%9D%98%EC%B1%85%EB%A6%AC%EB%B7%B0-GET-%EB%A6%AC%EB%B7%B0-%EB%B3%B4%EC%97%AC%EC%A3%BC%EA%B8%B0</guid>
            <pubDate>Wed, 20 Apr 2022 10:18:04 GMT</pubDate>
            <description><![CDATA[<h2 id="📢api-만들고-사용하기">📢API 만들고 사용하기</h2>
<p> <strong>제목, 저자, 리뷰</strong> </p>
<h3 id="💾저장된-리뷰를-화면에-보여주기read-→-get💻">💾저장된 리뷰를 화면에 보여주기(Read → GET)💻</h3>
<p>1️⃣ 클라이언트와 서버 확인하기
2️⃣ 서버부터 만들기
3️⃣ 클라이언트 만들기
4️⃣ 완성 확인하기</p>
<h3 id="1️⃣✔-클라이언트와-서버-확인하기">1️⃣✔ 클라이언트와 서버 확인하기</h3>
<p>👩‍💼서버쪽 형태 <strong>/review, get</strong>
<strong>sample_give</strong>라는 이름으로 데이터를 받는다.
🙋‍♂️클라이언트 <strong>get type에 /review에 sample_give</strong> 이름으로 샘플데이터를 가져간다.
success되면 response로 잘 내려와서 alertd로 msg를 찍어줘라 되있다.
서버쪽에서 msg를 내려줄거는 <strong>&#39;이 요청은 GET!&#39;</strong>
클라이언트 <strong>showreview 함수</strong>가 언제 불리냐면</p>
<pre><code>$(document).ready(function () {
                showReview();
            });</code></pre><p><strong>로딩되자마자 불린다.</strong>
연결이 잘되었다.</p>
<h3 id="2️⃣✔-서버부터-만들기">2️⃣✔ 서버부터 만들기</h3>
<p><strong>👨‍💼서버쪽의 역할</strong> 
<strong>GET</strong>은 통상적으로 <strong>데이터 조회</strong>를 할때 쓴다 했다.<strong>데이터를 건들게 없고 조회만</strong> 해주기 때문에
클라이언트한테 어떤 <strong>데이터를 받을게 없다.</strong>
서버는 모든 리뷰를 DB에서 가져와서 그대로 내려주기만 하면 됀다.
<del><code>sample_receive = request.args.get(&#39;sample_give&#39;)
    print(sample_receive)</code></del> 
데이터 받아주는 코드 지우기</p>
<p>DB에서 리뷰 가지고 오는 코드를 붙여 넣는다.   </p>
<pre><code>same_ages = list(db.users.find({&#39;age&#39;:21},{&#39;_id&#39;:False}))</code></pre><p><strong>reviews라는 변수로 받을것</strong>이다.
collection의 <strong>bookreview에서 불러오고</strong>
찾는 <strong>조건은 없다.</strong>다 가져온다.</p>
<pre><code>reviews = list(db.bookreview.find({}, {&#39;_id&#39;: False}))</code></pre><p><del><code>return jsonify({&#39;msg&#39;: &#39;이 요청은 GET!&#39;})</code></del>
<strong>메세지를 내려줄 필요는 없다.</strong>
return jsonify({&#39;all_reviews&#39;: reviews})</p>
<h3 id="3️⃣✔-클라이언트-만들기">3️⃣✔ 클라이언트 만들기</h3>
<p>🙋‍
<strong>all_reviews</strong>가 잘 내려오면 
그거를 가지고 <strong>for문</strong>을 돌면서 리뷰들을 <strong>붙여주면 된다.</strong></p>
<p>url: &quot;/review<del>?sample_give=샘플데이터&quot;</del>,
데이터 조회이기 때문에 클라이언트가 
<strong>가져가야할 데이터는 없다.</strong>
👉url: &quot;/review&quot;,</p>
<p>만약에 잘 내려왔다면 response중에서 <strong>all_reviews 값만 일단 가져온다.</strong>
reviews라는 변수로 붙여주겠다.
let <strong>reviews</strong> = response[&#39;all_reviews&#39;]
잘 내려왔는지 확인하기 위해 
console.log(reviews)
잘 찍혔다.
이제 for문을 돌릴 것이다.
<del>(쌓을 데이터가 필요하면 브라우저에서 몇번 더 작성해 준다.)</del></p>
<pre><code>for (let i = 0; i &lt; reviews.length; i++ ) {
     let title = reviews[i][&#39;title&#39;]
     let author = reviews[i][&#39;author&#39;]
     let review = reviews[i][&#39;review&#39;]

     console.log(title,author,review)</code></pre><p>잘 찍힌다.
이제 찍어줄게 아니라 붙여줄 것이다.
<strong>let temp_html = ``</strong>
안에 뭘 붙여주냐면 브라우저 아래 테이블만들어 놓은곳에 <strong>제목저자리뷰</strong>의 내용물에 붙여줘야하기 때문에 아래 <strong>테이블</strong>의 내용물 <strong>reviews-box</strong>를 본다.
<strong>확실치 않으면 tr태그 전체를 복붙해서 본다.</strong>
맞으니까 <strong>ctrl+x로 가져온다.</strong></p>
<pre><code>let temp_html = ` &lt;tr&gt;
                    &lt;td&gt;${title}&lt;/td&gt;
                    &lt;td&gt;${author}&lt;/td&gt;
                    &lt;td&gt;${review}&lt;/td&gt;
                &lt;/tr&gt;` </code></pre><p>이렇게 보여줄 데이터 이름을 자리에 맞춰주고
이제 붙여줄 건데 어디다 붙여주냐면
<strong>id=&quot;reviews-box&quot;</strong>라는 곳에서 가져왔다.
<strong>$(&#39;#reviews-box&#39;).append(temp_html)</strong></p>
<h3 id="4️⃣✔-완성-확인하기">4️⃣✔ 완성 확인하기</h3>
<p>이제 브라우저에 가서 확인 해주면 아래에 잘 붙는걸 볼 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[모두의책리뷰 POST 연습(리뷰 저장)]]></title>
            <link>https://velog.io/@bbrong_22/%EB%AA%A8%EB%91%90%EC%9D%98%EC%B1%85%EB%A6%AC%EB%B7%B0-POST-%EC%97%B0%EC%8A%B5%EB%A6%AC%EB%B7%B0-%EC%A0%80%EC%9E%A5</link>
            <guid>https://velog.io/@bbrong_22/%EB%AA%A8%EB%91%90%EC%9D%98%EC%B1%85%EB%A6%AC%EB%B7%B0-POST-%EC%97%B0%EC%8A%B5%EB%A6%AC%EB%B7%B0-%EC%A0%80%EC%9E%A5</guid>
            <pubDate>Tue, 19 Apr 2022 16:18:43 GMT</pubDate>
            <description><![CDATA[<p>File&gt;New project&gt;bookreview생성&gt;app.py/static/templates&gt;index.html
File setting&gt;flask/pymongo</p>
<p>코드스니펫에서 app.py뼈대와 index.html 뼈대 복붙
app.py에서 ▶run&gt;브라우저에 localhost:5000 창 띄우기</p>
<h2 id="📢api-만들고-사용하기">📢API 만들고 사용하기</h2>
<p> <strong>제목, 저자, 리뷰</strong> </p>
<h3 id="💿정보-저장하기create-→-post📀">💿정보 저장하기(Create → POST)📀</h3>
<p>1️⃣ 클라이언트와 서버 확인하기
2️⃣ 서버부터 만들기
3️⃣ 클라이언트 만들기
4️⃣  완성 확인하기</p>
<h3 id="1️⃣✔-클라이언트와-서버-확인하기">1️⃣✔ 클라이언트와 서버 확인하기</h3>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/e783009d-60e3-4cb5-8312-0ace0f1c95e0/image.png" alt="">
<strong>👩‍💼app.py 창구에서</strong>
@app.route(&#39;/review&#39;, methods=[&#39;POST&#39;])
<strong>/review에 post</strong>타입이다.
<strong>sample_give</strong>라는 이름으로 데이터를 받고 있다.
주고받는 형태가 다 맞아떨어지면
msg를 <strong>&#39;이 요청은 post!&#39;</strong>라고 내려주고 있다.
<img src="https://velog.velcdn.com/images/bbrong_22/post/86df15d5-223f-407d-876d-176729470e7a/image.png" alt="">
<strong>🙋‍♂️index.html 클라이언트에서</strong>
<strong>ajax콜이 makereview라는 함수</strong>에서 불리고 있다.
<strong>post</strong> type에 ulr은 <strong>/review</strong> 로 요청을 한다.
<strong>sample_give</strong> 형태로 샘플데이터라는 데이터를 가져간다고 나온다.
요청이 됐고 가져가는 데이터도 잘 받았으면
response로 <strong>&#39;이 요청은 post!&#39;</strong>라는 msg를 받는다.
그것이 <strong>alert</strong>으로 되있고 리로드되면 뜬다.
<strong>makereview함수가 어디에 붙어있냐면</strong> 
<img src="https://velog.velcdn.com/images/bbrong_22/post/125b3b9b-0d34-4856-9c84-84b738092b89/image.png" alt="">
리뷰작성하기 버튼에 붙어있다.
👉<strong>브라우저에서 리뷰작성하기 버튼을 누르면 Ajax콜이 동작한다.</strong>
alert으로 &#39;이 요청은 post!&#39;라고 뜬다.연결이 잘 됐다</p>
<h3 id="2️⃣✔-서버부터-만들기">2️⃣✔ 서버부터 만들기</h3>
<p><strong>👨‍💼서버쪽 일 (창구 일)</strong>
클라이언트(고객에서)
제목,저자,리뷰 <strong>데이터가 들어오면</strong> 그것을 받아다가 <strong>DB에 저장해준다.</strong></p>
<p><strong>데이터 받을 준비를 한다.</strong>
   title_receive = request.form[&#39;title_give&#39;]
   author_receive = request.form[&#39;author_give&#39;]
   review_receive = request.form[&#39;review_give&#39;]</p>
<p>   (<del>print(sample_receive)</del>)지우기</p>
<p><strong>이제 DB 저장을 해야하는데</strong>
폴더&gt;pythonprac&gt;<strong>dbprac</strong>을 드래그해서 파이참에 끌어다 놓기
저장 <strong>코드 참고</strong>해서 만들기</p>
<p>딕셔너리 먼저 만들어주기</p>
<pre><code>doc = {
        &#39;title&#39;: title_receive,
        &#39;author&#39;: author_receive,
        &#39;review&#39;: review_receive
    }</code></pre><p><strong>bookreview에 저장하기</strong></p>
<pre><code>db.bookreview.insert_one(doc)</code></pre><p>데이터를 받고 저장이 다 완료되면 메세지로
    return jsonify({&#39;msg&#39;: &#39;저장 완료!&#39;})</p>
<h3 id="3️⃣✔-클라이언트-만들기">3️⃣✔ 클라이언트 만들기</h3>
<p><strong>🙋‍♂️클라이언트 쪽 일 (고객 일)</strong>
<strong>제목,저자,리뷰를 가져와서 보내주면 된다.</strong>
<strong>JQuery</strong>로 값을 가져와야한다.</p>
<pre><code>function makeReview() {</code></pre><p><strong>let 변수 = $(&#39;#각 inputbox id값&#39;).val()</strong></p>
<pre><code>    let title = $(&#39;#title&#39;).val()
    let author = $(&#39;#author&#39;).val()
    let review = $(&#39;#bookReview&#39;).val()</code></pre><p><strong>이걸 Ajax에 실어서 보내줘야 한다.</strong>
서버에서 받기로 한 이름 <strong>title_give</strong>
<del>data: {sample_give:&#39;샘플데이터&#39;}</del>이거를
👉<strong>data: {title_give:title,author_give:author,review_give:review}</strong></p>
<h3 id="4️⃣✔-완성-확인하기">4️⃣✔ 완성 확인하기</h3>
<p>브라우저에서
<strong>제목,저자,리뷰를 작성하고 리뷰작성하기를 누른다.</strong>
<strong>alert &#39;저장완료!&#39;</strong>를 확인한 뒤
<strong>robo3T</strong>로 가서 <strong>확인</strong>을 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flask-API 만들기]]></title>
            <link>https://velog.io/@bbrong_22/Flask-API-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@bbrong_22/Flask-API-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Tue, 19 Apr 2022 04:35:36 GMT</pubDate>
            <description><![CDATA[<p>코드스닛펫에서 만둘어둔 예제코드를 가져온다.
JQuery import를 써뒀다.</p>
<h2 id="📢-api란">📢 API란</h2>
<p><strong>은행이 고객을 받기 위해서</strong> 만들어 놓은 창구처럼 
<strong>서버도 클라이언트 요청</strong>을 받기 위해서 만들어놓는 <strong>창구</strong>이다.
은행도 창구에 어떤 <strong>규칙</strong>이 있다.
민증 지참,입금을 하려면 입출금 창구로 가세요 등 
마찬가지로,이 API도 규칙이 있다.그리고 <strong>그에 해당하는 주소가 존재한다.</strong>
그거를 하나하나 직접 만들어 보겠다.</p>
<p>API에서 우리가 배울 종류는 두가지이다.
<img src="https://velog.velcdn.com/images/bbrong_22/post/ff1f44d6-d02a-4501-bc7e-012036394e33/image.png" alt=""></p>
<h3 id="get은-통상적으로-데이터-조회를-요청할-때-쓴다">GET은 통상적으로 데이터 조회를 요청할 때 쓴다.</h3>
<p><strong>예를 들면</strong>,데이터를 내가 건들지 않고 예를 들면 어제 들어온 <strong>주문목록</strong> 갖고 올때</p>
<h3 id="post는-통상적으로-데이터를-바꿀-때">POST는 통상적으로 데이터를 바꿀 때</h3>
<p><strong>예를 들면</strong>,<strong>회원가입</strong> 할 때</p>
<p>하나씩 만들고 요청해보도록 하자.</p>
<p><strong>서버에 뭔가를 요청할 때</strong>는 <strong>ajax콜</strong>을 이용한다.
API만들기👉클라이언트에서 Ajax로 콜 해보기</p>
<h2 id="👩💼get-요청-창구에서-받을-준비">👩‍💼GET 요청 (창구에서 받을 준비)</h2>
<p>코드스니펫 GET 요청 API코드 복사해서
app.py파일</p>
<pre><code>@app.route(&#39;/&#39;)
def home():
   return render_template(&#39;index.html&#39;)</code></pre><p>이 코드 아래에 붙여 넣는다.</p>
<pre><code>@app.route(&#39;/test&#39;, methods=[&#39;GET&#39;])
def test_get():
   title_receive = **request**.args.get(&#39;title_give&#39;)
   print(title_receive)
   return **jsonify**({&#39;result&#39;:&#39;success&#39;, &#39;msg&#39;: &#39;이 요청은 GET!&#39;})</code></pre><p>그리고 기본코드에 request,jsonify를 더 추가 시켜준다.</p>
<pre><code>from flask import Flask, render_template,request,jsonify
app = Flask(__name__)   </code></pre><h2 id="🙋♂️get-요청-확인-고객에서-확인">🙋‍♂️GET 요청 확인 (고객에서 확인)</h2>
<p>이제 확인을 할것인데,GET 요청 Ajax코드를
(아까 서버에서 받은 html이 담긴)브라우저에가서 <strong>console창</strong>에 붙여넣는다.
(⭐어떻게보면 클라이언트 사이드다.)</p>
<pre><code>$.ajax({
    type: &quot;GET&quot;,
    url: &quot;/test?title_give=봄날은간다&quot;,
    data: {},
    success: function(response){
       console.log(response)
    }
  })</code></pre><p><code>{msg: &#39;이 요청은 GET!&#39;, result: &#39;success&#39;}</code>
이렇게 나오는데 console.log 때문에 msg로 적어둔게 찍혔다.
<strong>response는 서버에서 내려주는 값이다.</strong></p>
<p>서버에 가서 보면</p>
<pre><code>def test_get():
   title_receive = request.args.get(&#39;title_give&#39;)
   print(title_receive)
   return jsonify({&#39;result&#39;:&#39;success&#39;, &#39;msg&#39;: &#39;이 요청은 GET!&#39;})</code></pre><p>이렇게 되어있는데<code>&#39;result&#39;:&#39;success&#39;, &#39;msg&#39;: &#39;이 요청은 GET!&#39;</code>
이 내용물을 <strong>response에 담아와서 찍힌 것이다.</strong></p>
<p>app.py는 내가 만들어둔 창구이다.</p>
<h3 id="🙋♀️이제-고객에서-벌어지는-일">🙋‍♀️이제 고객에서 벌어지는 일</h3>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/c533ca31-fc85-4300-8e9c-2870bba2aacd/image.png" alt="">
<strong>type은 GET</strong>이고 <strong>url은 /test</strong>
<img src="https://velog.velcdn.com/images/bbrong_22/post/a14bc6a7-7a10-4190-90be-dd35c663d322/image.png" alt="">
url: &quot;/test<strong>?</strong>title_give=봄날은간다&quot;,
<strong>GET요청은 물음표로 데이터를 들고 간다.</strong>
👉<strong>title_give</strong>라는 이름으로 봄날은간다 라는<strong>값을 가져왔다.</strong></p>
<h3 id="👨💼창구에서-벌어지는-일">👨‍💼창구에서 벌어지는 일</h3>
<p>title_receive = request.args.get(&#39;<strong>title_give</strong>&#39;)
<strong>title_give로 갖고온 값을 가져와봐라</strong>는 뜻이다.
title_receive = &#39;<strong>봄날은 간다</strong>&#39; 라고 가져온다면
<strong>title_receive안에 들어올것이다.</strong>
<strong>print(title_receive)</strong>
그리고 그 변수가 프린트 된다.
그리고 그 프린트는
<img src="https://velog.velcdn.com/images/bbrong_22/post/5a6ed0a1-945e-4911-b51d-edc527cce6ab/image.png" alt="">
여기에 찍힌다.
그리고 나서
return jsonify({<strong>&#39;result&#39;:&#39;success&#39;, &#39;msg&#39;: &#39;이 요청은 GET!&#39;</strong>})
값을 내려준다.</p>
<p>🙋‍(고객)<strong>Ajax로 콜</strong>을 하면
👉Ajax로 가져온 <strong>값</strong>을
👉👨‍💼API(창구)에서 <strong>response(처리)</strong>를한다.
👉🙋‍고객이 response를 <strong>console.log로 확인</strong>을 한다.</p>
<h2 id="👨💼post-요청-창구에서-확인">👨‍💼POST 요청 (창구에서 확인)</h2>
<p>코드스니펫 POST요청 API코드를 GET 요청 API코드 아래에 붙여넣는다.
GET과 마찬가지의 과정으로 진행된다.</p>
<h3 id="❔❔값을-담아오는-이름을-바꾸면-어떻게-됄까❔❔">❔❔값을 담아오는 이름을 바꾸면 어떻게 됄까❔❔</h3>
<p>그런데,console창에서  data: { title_give<strong>2</strong>:&#39;봄날은간다&#39; },
로 바꾸면 어떻게 됄까.
(INTERNAL SERVER ERROR) <strong>서버쪽에서 에러</strong>가 났다는 뜻이다.
그러면 app.py에서 에러를 확인해보자.
werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
<strong>KeyError: &#39;title_give&#39;</strong>
<strong>분명 title_give로 값으로 뭔가를 찾으려고 했는데 title_give가 없다.</strong>
은행으로 따지면 <strong>주민등록번호가 없어요 라는 에러하고 똑같은 뜻이다.</strong>
그래서 <strong>둘의 이름을 꼭 맞춰줘야한다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[서버 만들기]]></title>
            <link>https://velog.io/@bbrong_22/%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@bbrong_22/%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 18 Apr 2022 09:25:25 GMT</pubDate>
            <description><![CDATA[<h2 id="📢앞으로-만들-서버">📢앞으로 만들 서버</h2>
<p>서버를 만들어 볼것이다.
이 전에는 html,css,자바스크립으로 뭔가를 했다.
서버를 만들어서 서버에 갖다줄 파일을 미리 만들어뒀다.</p>
<p>이제는 서버를 만들어서 <strong>요청을 받고 파일을 갖다주든지
DB에다 작업을 하든지
이런 서버를 만들어야 한다.</strong></p>
<p>서버는 이 컴퓨터에 돌아가고 있는 하나의 프로그램이다.
포토샵,파워포인트,엑셀 처럼.
<strong>한 컴퓨터 내에서 서버를 만들고 브라우저로 접속을 해본다.</strong>
<strong>👉로컬 개발 환경이다.</strong></p>
<p>서버의 결과물을 어떤 특정 컴퓨터를 사서 그쪽에다 올리는 작업을 할것이다.
내 컴퓨터를 24시간 켜놓지 않아도 구매한 <strong>특정 컴퓨터에서 24시간 켜놓음으로써 모든 사람이 접속을 할 수 있게 만드는 것이다.</strong></p>
<h2 id="🔥flask-시작하기">🔥Flask 시작하기</h2>
<p>File&gt;New project&gt;pythonprac&gt;prac&gt;New&gt;PythonFile&gt;app.py
이왕이면 <strong>서버를 돌아가게 만드는 파일 이름은 통상적으로 app.py</strong>라고 많이 짓는다.</p>
<p>서버에 <strong>프레임워크</strong>라고 하는 <strong>flask</strong> 패키지를 설치한다.
이번에도 남이 만들어놓은 패키지를 사용하는 것이다.</p>
<p><strong>프레임워크</strong>는 <strong>남이 짜둔 규칙이나 틀 안에서 내가 코딩을 자유롭게</strong> 해서 편하다.
<strong>라이브러리</strong>는 내가 마음대로 짜는데 <strong>남이 만들어 놓은 것을 중간에 자유롭게</strong> 갖다 쓰니까 편하다.
통상적으로 프레임워크는 <strong>하나의 프레임워크 안에서 내가 짠다.</strong>
그 안에서 라이브러리는 제한없이 갖다 쓸 수 있다.</p>
<p>flask시작 코드를 붙여넣는다.
▶
0.0.0:5000
까지 나오면 실행이 된거다.
브라우저에 localhost:5000이라 친다.
localhost:5000으로
이걸로 <strong>내 컴퓨터에서 내가 서버를 돌리고 있는것</strong>이다.
그리고 <strong>같은 컴퓨터에서 다른 브라우저를 열어서 접속</strong>한 것이다.
👉컴퓨터를 두대 살순 없으니까.</p>
<p>5000이라는 <strong>숫자는 포트</strong>라는 개념이다.
나라의 항구처럼 컴퓨터도 내가 인터넷 세상에다가 뚫어놓은 문의 번호들이 있다.</p>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/0d09ffc8-0593-4a5e-ae56-407b270a0d6c/image.png" alt=""></p>
<p>여기에 써있다.
숫자를 바꿔도 접속이 된다.
그런데 포트라는것은 바꿀 수도 있지만 거의 대부분 정해진 번호를 갖고 있다.괜히 건들였다간 컴퓨터에서 이미 돌아가고 있는 다른 번호들 하고 겹쳐서 원래 것이 안돌아가고 이럴 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/07959800-3d31-4815-a4b9-0c8cb028c11f/image.png" alt=""></p>
<h2 id="🏃🏊♀️🤸한-코드단안에서-페이지-오가기">🏃‍🏊‍♀️🤸‍한 코드단안에서 페이지 오가기</h2>
<p>위에거를 복사해서 아래 붙힌뒤
기본코드 <code>home()</code>위에랑 다르게 새로 생성한 아래는 <strong>mypage()</strong>라고 하고 <code>(&#39;/&#39;)</code>랑 다르게 <strong>(&#39;/mypage&#39;)</strong>라고 한다.
<strong>2개씩은 서로 달라야 한다.</strong>
아래 내용물은 <strong>&#39;mypage 입니다&#39;</strong>라고 한다.
▶
주소창에 <strong>/mypage</strong>를 붙이면 &#39;mypage 입니다&#39;라는 내용물이 담긴 <strong>mypage로 넘어간다.</strong></p>
<p>다시 <code>home()</code>내용물로 <code>&lt;button&gt;버튼이다&lt;/button&gt;</code>을 치고 그전 페이지로 돌아가면
<button>버튼이다</button>이 뜬다.</p>
<h3 id="🏄♀️앞으로-쓸-프레임워크란">🏄‍♀️앞으로 쓸 프레임워크란</h3>
<p>이처럼, 내용물에 html전체를 쓰면 페이지가 나오겠지만
너무 길고 복잡하다.
앞으로 쓸 프레임워크는 이런 불편함을 해소해줄 편리한 것들이 다 갖춰져있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹스크랩핑 결과 저장하기]]></title>
            <link>https://velog.io/@bbrong_22/%EC%9B%B9%EC%8A%A4%ED%81%AC%EB%9E%A9%ED%95%91-%EA%B2%B0%EA%B3%BC-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bbrong_22/%EC%9B%B9%EC%8A%A4%ED%81%AC%EB%9E%A9%ED%95%91-%EA%B2%B0%EA%B3%BC-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 17 Apr 2022 14:52:56 GMT</pubDate>
            <description><![CDATA[<p>그 전 크롤링 코드를 db에 저장 시켜보자.
db 기본코드를 넣고 시작 한다.</p>
<p>print를 지워주고 insert 기본코드를 넣고 데이터를 바꿔 끼운다.</p>
<pre><code> doc = {&#39;title&#39;: title,
        &#39;star&#39;: star,
        &#39;rank&#39;: rank}
         db.movies.insert_one(doc)</code></pre><p>👉돌때마다 이 데이터를 db에다 넣어줄 것이다.        </p>
<p><strong>Quiz</strong></p>
<p>1.&#39;매트릭스&#39;의 평점 가져오기
2.&#39;매트릭스&#39;의 평점과 같은 평점의 영화 제목들을 가져오기
3.&#39;매트릭스&#39; 영화의 평점을 0으로 만들기</p>
<p><strong>내가 한것</strong></p>
<ol>
<li><p>movies = db.movies.find_one({&#39;title&#39;:&#39;매트릭스&#39;},{&#39;_id&#39;:False})
print(movies)</p>
</li>
<li><p>same_star = list(db.movies.find({&#39;star&#39;:&#39;9.39&#39;},{&#39;_id&#39;:False}))
print(same_star)</p>
</li>
<li><p>db.movies.update_one({&#39;title&#39;:&#39;매트릭스&#39;},{&#39;$set&#39;:{&#39;star&#39;:&#39;0&#39;}})</p>
</li>
</ol>
<p><strong>선생님이 한것</strong></p>
<blockquote>
<p>1.<code>movie = db.movies.find_one({&#39;title&#39;:&#39;매트릭스&#39;})</code>
<code>print(movie[&#39;star&#39;])</code></p>
</blockquote>
<blockquote>
<p><code>movie = db.movies.find_one({&#39;title&#39;:&#39;매트릭스&#39;})</code>
<code>target_star= movie[&#39;star&#39;]</code>
👉<strong>target_star라는 변수</strong>를 만들고 <strong>movie[&#39;star&#39;] (매트릭스 평점)랑 같다</strong>는 정의를 내려준다.
2.<code>target_movies = list(db.movies.find({&#39;star&#39;:target_star},{&#39;_id&#39;:False}))</code>
👉<strong>target_movies라는 변수</strong>를 만들어주고 <strong>target_star를 찾아</strong> 넣어달라 한다.
print(target_movies)
👉하지만 얘는 <strong>리스트</strong> 안에 딕셔너리가 들어있는 유형이니까 하나씩 뽑아준다.</p>
</blockquote>
<pre><code>for target in target_movies:
    print(target)</code></pre><p>👉각자의 타이틀만 필요하니까
<code>print(target[&#39;title&#39;])</code></p>
<blockquote>
<p><code>db.movies.update_one({&#39;title&#39;:&#39;매트릭스&#39;},{&#39;$set&#39;:{&#39;star&#39;:0}})</code>
👉robo3T가면 0으로 됐지만 &quot;&quot;아이콘이 아니라 다른 아이콘이다
<strong>&quot;&quot;</strong>이 들어간건 <strong>문자열</strong>이다.나중에 찾을때 숫자로 찾으면 숫자로 입력한거만 나오고 문자열 따로 나올 것이다.이왕이면 통일해서 넣어주는 게 나중에 관리하기 편하다.
3.<code>db.movies.update_one({&#39;title&#39;:&#39;매트릭스&#39;},{&#39;$set&#39;:{&#39;star&#39;:&#39;0&#39;}})</code>
👉<strong>&#39;0&#39;</strong>따옴표를 붙여주자.어떤 형식으로 담겨있는지도 중요하다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[pymongo로 DB조작하기]]></title>
            <link>https://velog.io/@bbrong_22/pymongo%EB%A1%9C-DB%EC%A1%B0%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bbrong_22/pymongo%EB%A1%9C-DB%EC%A1%B0%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 17 Apr 2022 11:11:40 GMT</pubDate>
            <description><![CDATA[<h1 id="🧪파이썬으로-mongodb를-조작해보자">🧪파이썬으로 MongoDB를 조작해보자</h1>
<p><strong>pymongo</strong>라는 <strong>라이브러리로 조작</strong>을할 것이다.
만약에 파이썬으로 엑셀을 조작하려면
파이썬으로 엑셀을 조작할 수 있는 남이 만들어놓은 라이브러리를 이용하면 편할거 같다.
똑같이 파이썬으로 MongoDB를 조작하려고 하면 남이 만들어놓은 pymongo라는 라이브러리를 쓸거다.
setting에서 pymongo를 다운받자.
pythonprac에서 dbprac이라는 PythonFile을 만든다.
pymongo 기본코드를 갖다쓴다.</p>
<h2 id="💬pymongo를-이용하는-4가지">💬pymongo를 이용하는 4가지</h2>
<table>
<thead>
<tr>
<th></th>
<th align="left">insert</th>
<th align="center">find</th>
<th align="right">update</th>
<th align="right">delete</th>
</tr>
</thead>
<tbody><tr>
<td>row1</td>
<td align="left">데이터를 넣는거</td>
<td align="center">찾는거</td>
<td align="right">데이터 업데이트</td>
<td align="right">삭제</td>
</tr>
</tbody></table>
<p><strong>insert</strong>
doc = {&#39;name&#39;:&#39;bobby&#39;,&#39;age&#39;:21}
db.users.insert_one(doc)</p>
<p>▶run
하면 아무것도 안나온다.
👉robo3T를 가본다.
localDB를 refresh하면 dbsparta가 생겼다.
collections&gt;user&gt;오른쪽상단 두번째 아이콘 클릭
<img src="https://velog.velcdn.com/images/bbrong_22/post/d8f3d52e-a840-4ee2-8a58-b4c379220a09/image.png" alt=""></p>
<h2 id="🔥기본코드-해석하기">🔥기본코드 해석하기</h2>
<pre><code>from pymongo import MongoClient
client = MongoClient(&#39;localhost&#39;, 27017)
db = client.dbsparta</code></pre><p><code>from pymongo import MongoClient</code>
👉pymongo를 쓰겠다.
<code>client = MongoClient(&#39;localhost&#39;, 27017)</code>
👉내 컴퓨터에서 지금 돌아가고 있는 mongoDB에 접속할 것이다.
<code>db = client.dbsparta</code>
👉dbsparta라는 db이름으로 접속할 것이다.(없으면 자동으로 만들어진다.)
mongodb는 딕셔너리가 쌓이는 것이다.</p>
<p><code>doc = {&#39;name&#39;:&#39;bobby&#39;,&#39;age&#39;:21}</code>
👉딕셔너리를 만들어줬다.
<code>db.users.insert_one(doc)</code>
👉그 하나 딕셔너리(doc)를 users라는 collection에 넣겠다.</p>
<p>아무리 딕셔너리를 맘대로 쌓을 수 있다 해도 <strong>이왕이면 비슷한애들끼리</strong> 쌓는게 더 낫기 때문에 <strong>콜렉션</strong>이라는 개념이 존재한다.
👉db.users.insert_one(doc)
db안에 users라는 collection안에 insert해라
나머지 <strong>find/update/delete도 이런 식이다.</strong></p>
<h3 id="🍳insert로-데이터-쌓기">🍳insert로 데이터 쌓기</h3>
<p><strong>doc = {&#39;name&#39;:&#39;jane&#39;,&#39;age&#39;:21}
db.users.insert_one(doc)</strong></p>
<p>응용해서 4개의 딕셔너리를 하나씩 쌓아준다.
<img src="https://velog.velcdn.com/images/bbrong_22/post/32958741-2fef-4c69-8f04-3ddcbaea0288/image.png" alt=""></p>
<h3 id="🍠find로-데이터-찾기">🍠find로 데이터 찾기</h3>
<p><strong>same_ages = list(db.users.find({&#39;age&#39;:21},{&#39;_id&#39;:False}))</strong></p>
<p>뭔가를 <strong>찾아서 same_ages라는 변수에다 넣은것</strong>이다.
print(same_ages)
▶
<img src="https://velog.velcdn.com/images/bbrong_22/post/1bae5d96-291a-463b-bf20-484397026103/image.png" alt="">
리스트 안에 딕셔너리 2개가 들어와있는데 age가 21이다
{<strong>&#39;age&#39;:21</strong>}여기가 <strong>조건</strong>이다.
,{<strong>&#39;_id&#39;:False</strong>})의 <strong>_id</strong>는
<img src="https://velog.velcdn.com/images/bbrong_22/post/3a6cfe2a-0236-45f0-ac81-223bf3442250/image.png" alt=""></p>
<p>이 값인데,이값은 <strong>나타내지 말라는 뜻</strong>이다.
false를 거의 붙여주는데 이 조건을 없애버리면 _id까지 갖고와 버린다.
자동으로 생성되는 랜덤한 유니크 값이다.불필요하다.</p>
<p>조건없이 모든 document를 find 할 수도 있다.
(db.users.find({}, 중괄호를 비워두면 된다.</p>
<p><strong>여러개 가져올때는 이렇게 하고,</strong></p>
<h3 id="🧂하나만-가져올때는">🧂하나만 가져올때는</h3>
<p><strong>user = db.users.find_one({&#39;name&#39;:&#39;bobby&#39;})</strong>
print(user)
▶
bobby 딕셔너리 하나만 가져온다.
_id가져오고 싶지 않으면
user = db.users.find_one({&#39;name&#39;:&#39;bobby&#39;}<strong>,{&#39;_id&#39;:False}</strong>)
여러개 있어도 <strong>제일 위에 있는 아이 하나만</strong> 가져온다.</p>
<h3 id="🌮update로-데이터-내용물-바꾸기">🌮update로 데이터 내용물 바꾸기</h3>
<p><strong>db.users.update_one({&#39;name&#39;:&#39;bobby&#39;},{&#39;$set&#39;:{&#39;age&#39;:19}})</strong>
👉<strong>name이 bobby</strong>인 애를 찾아서 <strong>age를 19로 바꿔라.</strong>
▶하고 robo3T가면 바뀌어 있다.
💡collection이름(user)가 맞나 확인하고 run하면 된다.</p>
<p>db.users.update_many({&#39;name&#39;:&#39;bobby&#39;},{&#39;$set&#39;:{&#39;age&#39;:19}})
👉name이 bobby인 애를 <strong>모두</strong> 찾아서 age를 19로 바꿔라
⚠하지만 <strong>update_many는 잘 쓰지 않는다.</strong>한번에 다 바꾸는건 <strong>리스크가 크다.</strong>⚠</p>
<h3 id="delete🥞로-데이터-삭제하기">delete🥞로 데이터 삭제하기</h3>
<p><strong>db.users.delete_one({&#39;name&#39;:&#39;bobby&#39;})</strong>
▶robo3T가면 name이 bobby인 딕셔너리가 삭제되어있다.</p>
<p>db.users.delete_many({&#39;name&#39;:&#39;bobby&#39;})
⚠하지만 <strong>delete_many는 잘 쓰지 않는다.</strong>한번에 다 바꾸는건 <strong>리스크가 크다.</strong>⚠</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DB 개괄]]></title>
            <link>https://velog.io/@bbrong_22/DB-%EA%B0%9C%EA%B4%84</link>
            <guid>https://velog.io/@bbrong_22/DB-%EA%B0%9C%EA%B4%84</guid>
            <pubDate>Sun, 17 Apr 2022 08:24:21 GMT</pubDate>
            <description><![CDATA[<h3 id="❔❔데이터-베이스는-왜-쓸까❔❔">❔❔데이터 베이스는 왜 쓸까❔❔</h3>
<p>데이터를 잘 쌓으려기보단 <strong>데이터를 잘 갖다 쓰려고 쓰는게 목적</strong>이 더 강하다.
<strong>예를 들면 책장</strong>이라고 하면 책을 보관하는게 목적이면 아무대나 쌓아두면 그만인데 책장을 쓰는 이유는 나중에 잘 찾아서 뽑으려고다.잘 정돈된 책장은 순서에 맞게 정리되어 있다.
데이터 베이스도 마찬가지로 <strong>나중에 잘 찾기 위해 쓰는것</strong>이다.</p>
<p>그래서 데이터베이스 프로그램을 만드는 많은 회사들이 <strong>쌓는방식에 따라 상황별로 잘 가져갈 수 있다</strong>고 홍보를 한다.</p>
<h2 id="📢데이터베이스는-크게-두종류다">📢데이터베이스는 크게 두종류다</h2>
<p><strong>SQL/NoSQL(Not only SQL)</strong></p>
<h3 id="🎈sql은-엑셀에-좀더-가깝다">🎈SQL은 엑셀에 좀더 가깝다.</h3>
<p><strong>예를들면 출석체크</strong>를 할때 <strong>미리 칸</strong>을 만들어두고 이름,이메일,전화번호 등 그 칸에 맞게 채워나간다.
거기서 한 친구의 정보를 적을 때, 전화번호가 없다면 그 칸은 공란으로 둔다던지 정해진 틀이 있다.</p>
<p><strong>SQL은 열과 행을 미리 정해놔야한다.</strong>
예를 들면 1만개의 회원 DB가 있다 치자.
이제 회원들 집주소를 추가로 한번 받아보자.컬럼을 하나 더 만들어서 1만1번째 부터는 집 주소가 들어가겠지만 1만번째까지는 그 컬럼이 빈칸이 되어있다.<strong>👉중간에 바꾸기가 불편하다.</strong>
대신 <strong>정형화되어있는 데이터를 뽑아가는 방식은 최적화</strong>되어 있다.
<strong>데이터가 일관적이고 분석하기가 굉장히 빠르다.</strong>
대표적으로 <strong>MS-SQL,My-SQL,오라클 등</strong></p>
<h3 id="🎈nosql은-정해진-틀이-아니다">🎈NoSQL은 정해진 틀이 아니다.</h3>
<p>한줄 한줄이 <strong>딕셔너리 형태</strong>로 그냥 들어가는 것이다.</p>
<p>NoSQL은 데이터 하나하나마다 <strong>딕셔너리형태</strong>로 다 다르다.
똑같이 1만1번째부터 주소를 추가로 받을때 앞전처럼 그전 데이터를 <strong>공란으로 냅둘 필요가 없다.</strong>👉그래서 굉장히 <strong>유연</strong>하다.<strong>앞으로 바뀔 일이 많은 초기 스타트업</strong>이나 <strong>초기 서비스들</strong>에서 많이 채택하는 방식이다.
대표적으로 <strong>MongoDB</strong>가 있다.</p>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/26a95370-8957-4005-a475-917e5dbadc6f/image.png" alt=""></p>
<p>🎈<strong>데이터베이스도</strong> 마찬가지지만 서버라는 것은 <strong>컴퓨터의 역할</strong>이다.
DB도 포토샵,일러스트,파워포인트 처럼 프로그램 사서 쓰듯이 <strong>그냥 프로그램이자 역할</strong>이다.
<strong>한 컴퓨터 내에서 서버도 돌리고 크롤링도 하고 DB도 돌릴 수 있다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MongoDB 설치확인]]></title>
            <link>https://velog.io/@bbrong_22/MongoDB</link>
            <guid>https://velog.io/@bbrong_22/MongoDB</guid>
            <pubDate>Sat, 16 Apr 2022 15:48:59 GMT</pubDate>
            <description><![CDATA[<p><strong>db설치 됐는지 확인</strong>하는법
브라우저 검색 <strong>localhost:27017</strong></p>
<p>robo3t에 <strong>connect</strong>를 하면 <strong>데이터베이스에 접속</strong> 하는거다.</p>
<p>MongoDB는 데이터베이스다.
기본적으로 데이터를 쌓아둔다.
내 눈에 보이지 않게 켜진다.
Robo3T를 가지고 <strong>MongoDB의 데이터를 우리 눈으로 볼 수 있게 한다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[크롤링 연습]]></title>
            <link>https://velog.io/@bbrong_22/%ED%81%AC%EB%A1%A4%EB%A7%81-%EC%97%B0%EC%8A%B5</link>
            <guid>https://velog.io/@bbrong_22/%ED%81%AC%EB%A1%A4%EB%A7%81-%EC%97%B0%EC%8A%B5</guid>
            <pubDate>Thu, 14 Apr 2022 20:52:39 GMT</pubDate>
            <description><![CDATA[<h2 id="네이버-영화-평점에서">네이버 영화 평점에서</h2>
<p>랭킹,영화제목,평점 가져오기
<a href="https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&amp;date=20200303">네이버영화</a>
저번 시간에서 title가져오기 까지 했었다.</p>
<h3 id="내가-한것">내가 한것</h3>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/fe1eaaf3-0977-41ee-a3ac-5e6ab3a4ecdb/image.png" alt=""></p>
<p>알게된 점
위에서 순서 엉망으로 해도
print 할때,순서대로 적으면 순서대로 출력된다.</p>
<h3 id="선생님이-하는-방법">선생님이 하는 방법</h3>
<p>순위에서 오른쪽검사하면
<img src="https://velog.velcdn.com/images/bbrong_22/post/57db9b3b-39c1-4977-9ca1-437f331a829e/image.png" alt="">
<strong>순위</strong>표시인 <strong>alt값</strong>만 가져올것이다.
일단 copy selector한다</p>
<pre><code>for tr in trs:
    a_tag = tr.select_one(&#39;td.title &gt; div &gt; a&#39;)

    if a_tag is not None:
        title = a_tag.text
        rank = tr.select_one(&#39;td:nth-child(1) &gt; img&#39;)
        print(rank)</code></pre><p>rank를 한번 찍어본다.
<code>&lt;img alt=&quot;50&quot;</code>어쩌고가 나온다.
&#39;alt&#39;값이 제일 중요해 보인다.
print(rank[&#39;alt&#39;])
▶순위가 순서대로 쭉 나온다.</p>
<p>그런데 [&#39;alt&#39;]값이 <strong>print(rank[&#39;alt&#39;])</strong> 여기 있을 필요가 없다.
rank = tr.select_one(&#39;td:nth-child(1) &gt; img&#39;)<strong>[&#39;alt&#39;]</strong>
여기로 보내준다.<del>드래그하고 그대로 옮기면 옮겨진다.신기하다⭐</del>
같은 rank라서 가능하다.
그대로 ▶run하면 똑같이 나온다.</p>
<pre><code>star = tr.select_one(&#39;td.point&#39;)
        print(star.text)</code></pre><p>별점도 마찬가지로 copy selector 해준다.
역시나 .text가 여기있을 필요 없고
star = tr.select_one(&#39;td.point&#39;)<strong>.text</strong>
이렇게 둔다.</p>
<p>마무리로
<strong>print(rank,star,title)</strong>
하면 순서대로 나온다.</p>
<p>크롤링은 정답을 찾아가는 게 아니다.
되게 만드는게 크롤링이다.
같은 크롤링을 하더라도 사람마다 세운 전략이 다 다르다.
그래서 코드가 다 다를 수 있다.
결국은 뽑아내느냐가 중요하다.</p>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/0e5d9d2e-b12f-4c27-93ea-b998eca3ec76/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹스크래핑(크롤링)기초]]></title>
            <link>https://velog.io/@bbrong_22/%EC%9B%B9%EC%8A%A4%ED%81%AC%EB%9E%98%ED%95%91%ED%81%AC%EB%A1%A4%EB%A7%81%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@bbrong_22/%EC%9B%B9%EC%8A%A4%ED%81%AC%EB%9E%98%ED%95%91%ED%81%AC%EB%A1%A4%EB%A7%81%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Thu, 14 Apr 2022 19:04:17 GMT</pubDate>
            <description><![CDATA[<h2 id="📢준비">📢준비</h2>
<h4 id="📢저번에-이어서-이번엔-크롤링-패키지를-이용해보겠다">📢저번에 이어서 이번엔 크롤링 패키지를 이용해보겠다.</h4>
<p><a href="https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&amp;date=20200303">https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&amp;date=20200303</a>
<strong>여기서 순위나 영화제목,평점 이런것들을 내가 갖고오는 것</strong></p>
<p>크롤링이라는 단어 자체는 구글의 검색 엔진이나 네이버의 검색 엔진이
내 사이트를 퍼가는 그 행위를 크롤링이라고 한다.
그 전 행위는 스크래핑이라고 하긴 하는데, 둘 다 혼용해서 많이 쓴다.
하지만,지금 할 것을 크롤링이라 부르겠다.</p>
<h4 id="🎈순위영화명별점을-가지고-올-것이다">🎈순위,영화명,별점을 가지고 올 것이다.</h4>
<p>그 전에 크롤링에 필요한 beautifulsoup4(bs4)라는 <strong>패키지를 다운</strong>받아보겠다.
File&gt;Settings&gt;pythonprac&gt;interpreter&gt;+&gt;BS4&gt;Install
<strong>크롤링 기본세팅:</strong>
(import requests from bs4 import BeautifulSoup  headers = {&#39;User-Agent&#39; : &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36&#39;} data = requests.get(&#39;<a href="https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&amp;date=20200303&#39;,headers=headers">https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&amp;date=20200303&#39;,headers=headers</a>)  soup = BeautifulSoup(data.text, &#39;html.parser&#39;)  # 코딩 시작)</p>
<h3 id="❔❔크롤링이-가능한-이유가-뭘까❔❔">❔❔크롤링이 가능한 이유가 뭘까❔❔</h3>
<p>기본적인 이유는 <strong>인터넷과 상관이 없는데</strong>,내가 <strong>받아온 페이지에서 솎아내는게 크롤링</strong>이다.
크롤링을 할 때는 기술적으로 딱 <strong>두가지</strong>가 중요하다.</p>
<p>첫번째는 <strong>코드 단에서</strong> <strong>브라우저를 켜지 않고,요청</strong>을 하는것.
🌠<strong>requests</strong>가지고 한다.🌠</p>
<p>두번째는 요청돼서 가져 온 것(예를 들면 검사를 눌러서 이렇게 보면 Elements에 있는 html들 중에) <strong>내가 원하는 정보를 잘 솎아내는 것</strong>
🌠<strong>BS4</strong>가지고 한다.🌠
잘 솎아내는게 beautifulsoup4의 역할이다.
예를들면 페이지에서 &#39;그린 북&#39;의 코드를 전체코드에서 솎아내려고 하면
매우 힘들기 때문에 BS4가 필요하다.</p>
<h4 id="👉그래서-크롤링-기본코드를-붙여놓고-시작을-해야한다">👉그래서 크롤링 기본코드를 붙여놓고 시작을 해야한다.</h4>
<p>제일 처음 할 일은
<strong>print(soup)</strong>
▶프린트 해보면 페이지의 <strong>html 전체</strong>가 그대로 나온다.</p>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/a58f4956-6fc2-4681-958a-f9f1b76f4d30/image.png" alt="">
<strong>🎈기본 코드 뜻</strong>
첫째줄은 <strong>import</strong>하는 것이고
<strong>headers</strong>는 왜 붙이는 것이냐면 코드 단에서 이렇게 요청을 했을 때
그런 기본적인 요청은 막아둔 사이트들이 많다.
그래서 <strong>내가 브라우저에서 엔터 친 것 마냥</strong> 효과를 내어주는 거다.
headers= <strong>그다음에 url</strong> 들어가고
<strong>data로 요청을 받아오면</strong>
soup = BeautifulSoup(data.text, &#39;html.parser&#39;)
그거를 가지고 <strong>솎아내기 좋은 BeautifulSoup</strong> 형태로 만들어서
<strong>print(soup)</strong>
찍어준것이다.</p>
<h2 id="📢bs4의-사용-방법은-크게-두-가지-있다">📢BS4의 사용 방법은 크게 두 가지 있다.</h2>
<p>select_one /select
<strong>select_one은 하나</strong> 나오는것이고 <strong>select는 리스트로 여러개</strong> 나온다.</p>
<h3 id="🎈select_one-하나-가져오는-방법">🎈select_one 하나 가져오는 방법</h3>
<p>title = soup.select_one(&#39;&#39;)
페이지의 &#39;그린 북&#39; 오른쪽 클릭 &gt; copy &gt; <strong>copy selector</strong>
그리고 (&#39;&#39;)여기에 붙여 넣는다.
selector는 <strong>선택자</strong>이다.
얘가 타고타고 들어가서 얘가 <strong>정확히 어디 있는지 알려준다.</strong>
print(title)</p>
<pre><code>&lt;a href=&quot;/movie/bi/mi/basic.naver?code=171539&quot; title=&quot;그린 북&quot;&gt;그린 북&lt;/a&gt;</code></pre><p>이 출력된다.</p>
<p>이것도 사용법인데 <strong>두 가지</strong>이다.</p>
<h4 id="🎈첫번째-사용법">🎈첫번째 사용법</h4>
<p>태그와 태그 안에 있는 <strong>그린북 텍스트</strong>를 가지고 오고 싶다면 <strong>.text</strong>하면 된다
<strong>print(title.text)</strong>
▶그린북</p>
<h4 id="🎈두번째-사용법">🎈두번째 사용법</h4>
<p>print(title)했을때 찍혀나온 
&lt;a href=<strong>&quot;/movie/bi/mi/basic.naver?code=171539&quot;</strong>title=&quot;그린북&quot;&gt;그린북</a>
즉,
<strong><code>&lt;a&gt;</code>태그의 속성</strong>을 가져오고 싶다.
<strong>print(title[&#39;href&#39;])</strong> 
▶/movie/bi/mi/basic.naver?code=171539
a href의 속성이 나온다.
이 방법들은 하나를 가져오는 방법 이었고,  </p>
<h3 id="🎈select-여러개의-리스트를-가져오는-방법">🎈select 여러개의 리스트를 가져오는 방법</h3>
<p>그린북이 어디있나 봤을 때,<strong>오른쪽 버튼 검사</strong>해서 위아래로 훑어본다.
그러면 가로로 길게 줄이 표시되는데
우리가 전략을 짤 때 <strong>한 줄</strong>을 가져와서 거기서 <strong>순위,이름,평점</strong>을 가지고 오고 또 그 아랫줄 가져와서 통으로 가져오는게 편할거 같다.
<img src="https://velog.velcdn.com/images/bbrong_22/post/b86370ef-40a3-4a74-85c0-ce80e31db3a8/image.png" alt="">
한 줄을 가져와서 <strong>copy selector</strong>로 붙여넣는다.
그리고 그 <strong>밑에줄도</strong> 가져와서 붙여넣는다.
<img src="https://velog.velcdn.com/images/bbrong_22/post/83b4be30-aa50-4fd5-bc83-c1f187b30a75/image.png" alt="">
나머지는 같고 <strong>:nth-child(4)이 부분이 다르다.제거</strong>한다.</p>
<p>그러면 <strong>#old_content &gt; table &gt; tbody &gt; tr **
이것에 **해당하는 애들이 다 나온다.</strong>
한줄이었던<code>&lt;tr&gt;..&lt;/tr&gt;</code>들이 다 나온다.
보아하니 :nth-child(3) 얘는 3번째만 딱 특정한 거고 하니
그전 겹치는 코드만 가져온다.</p>
<p>tr들을 가져올거니까 trs로 하고
<strong>trs = soup.select(&#39;#old_content &gt; table &gt; tbody &gt; tr&#39;)</strong>
💡select는 여러개 가져오는거라서 결과가 <strong>리스트</strong>로 나온다.
for문을 돌려준다.</p>
<pre><code>for tr in trs:
  print(tr)</code></pre><p>▶tr들이 하나씩 나온다.</p>
<h3 id="🎈그-중에-타이틀만-솎아보자">🎈그 중에 타이틀만 솎아보자.</h3>
<p>for문이니까 print(tr)에서 여러가지 찾으면 된다.
그린북에서 copy selector를 해온다.
<code>#old_content &gt; table &gt; tbody &gt; tr:nth-child(2) &gt; td.title &gt; div &gt; a</code>
tr:nth-child(2) 까지는 찾았었다.
나머지 td.title &gt; div &gt; a 를
<strong>a_tag = tr.select_one(&#39;td.title &gt; div &gt; a&#39;)</strong>
👉a_tag = <strong>tr중에서 하나를 찾는데 내용물</strong>은 &#39;<strong>td.title &gt; div &gt; a</strong>&#39;
print(a_tag)
기존 tr까지 찾은 데서 추가한 것까지 찾는다.
이번엔 여러개 가져와서 솎아낼 필요 없다 title은 하나밖에 없으니까.
▶title들이 나온다.</p>
<p>그런데,중간에 None이라는것이 찍혀 나온다.
<img src="https://velog.velcdn.com/images/bbrong_22/post/0b8eb776-b3a9-484f-a1cb-490239db63e7/image.png" alt="">
&quot;줄&quot;들이다.
크롤링이라는 거는 <strong>사이트의 모양새마다</strong> 다 다르기 때문에
사이트마다 <strong>전략을 다 다르게</strong> 가져가야 한다.
👉이런 줄 안에서 얘를 가지고 오려면 에러가 나겠구나.
🧪에러가 나는지 확인해보자.
print(a_tag.text)
▶AttributeError: &#39;NoneType&#39; object has no attribute &#39;text&#39;
에러가 난다.
👉None에다가 .text 하지마라</p>
<pre><code>if a_tag is not None:
    print(a_tag)</code></pre><p>▶None이 사라졌다.</p>
<pre><code>if a_tag is not None:
    title = a_tag.text
    print(title)</code></pre><p>각 text가 title에들어가서 
print 내용물로
타이틀들만 하나씩 나온다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[패키지 사용해보기]]></title>
            <link>https://velog.io/@bbrong_22/%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@bbrong_22/%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Thu, 14 Apr 2022 14:08:47 GMT</pubDate>
            <description><![CDATA[<p>어떻게 써먹는지에 대한 것
requests 패키지의 documentation을 보면 써있다.
python requests package 구글링
<img src="https://velog.velcdn.com/images/bbrong_22/post/b2189468-fbff-4c89-b458-fe52b27fbbad/image.png" alt="">
이렇게 보면 읽기 어려우니 python requests 패키지 구글링하면
한국사람들이 올린것들이 많다.파이썬 ??? 패키지라고 구글링 이용 해보자.</p>
<h3 id="🎈request-import">🎈request import:</h3>
<p>(import requests # requests 라이브러리 설치 필요  r = requests.get(&#39;<a href="http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99&#39;">http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99&#39;</a>) rjson = r.json()  print(rjson[&#39;RealtimeCityAir&#39;][&#39;row&#39;][0][&#39;NO2&#39;]))</p>
<p><img src="https://velog.velcdn.com/images/bbrong_22/post/7aaece74-1c6e-4fdd-9c12-f58329f313dc/image.png" alt=""></p>
<p>url을 복사해서 주소에 쳐주면 저번에 한 RealtimeCityAir가 나온다.
print(rjson)
▶
ajax에서 했던것과 유사하게 나온다.
👉거의 두 줄만에 한 거다.
rjson = r.json()
👉json을 프린트할 수 있게 변형한 거다.</p>
<p>중구의 IDEX_MVL값을 찍어보겠다.
print(rjson)의 json은 전체이다.
print(rjson[&#39;RealtimeCityAir&#39;][&#39;row&#39;][0][&#39;MSRSTE_NM&#39;])
▶중구</p>
<h3 id="🎈반복문-활용">🎈반복문 활용</h3>
<p>구들만 뽑아보겠다.
<strong>gus</strong> = rjson[&#39;RealtimeCityAir&#39;][&#39;row&#39;]
for gu in <strong>gus</strong> :
    print(gu)
<del>💡전에 말했듯이 꼭 sum이 아니어도 된다가 적용됐다.</del>
▶row 내용물이 하나씩 출력이 됐다.</p>
<h3 id="🎈이건-리스트니까-for문을-활용해-본다">🎈이건 리스트니까 for문을 활용해 본다.</h3>
<pre><code>for gu in gus :
    gu_name = gu[&#39;MSRSTE_NM&#39;]
    gu_mise = gu[&#39;IDEX_MVL&#39;]
    print(gu_name,gu_mise)</code></pre><p>▶구의 이름과 미세먼지 값이 하나씩 출력이 된다.</p>
<h3 id="🎈if문을-활용해-보자">🎈if문을 활용해 보자.</h3>
<pre><code>    if (gu_mise &gt; 55) :
        print(gu_name, gu_mise)</code></pre><p>미세먼지가 55이상인것만 출력이 된다.
💡print가 :친 이후부터 if문에서 tab이 안되어 있으면
if문의 내용물이 아니다 tab주의
💡if (gu_mise &gt; 55) :의 괄호는 있어도 되고 없어도 된다.</p>
]]></description>
        </item>
    </channel>
</rss>