<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ddabong-dochi.log</title>
        <link>https://velog.io/</link>
        <description>비전공자 직장인 개발일지😆</description>
        <lastBuildDate>Sat, 14 May 2022 08:26:43 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ddabong-dochi.log</title>
            <url>https://velog.velcdn.com/images/ddabong-dochi/profile/3338e04d-213e-4019-ae30-baa7d82df021/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ddabong-dochi.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ddabong-dochi" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[웹개발 종합반 5주차_25일 (완료)]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A825%EC%9D%BC-%EC%99%84%EB%A3%8C</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A825%EC%9D%BC-%EC%99%84%EB%A3%8C</guid>
            <pubDate>Sat, 14 May 2022 08:26:43 GMT</pubDate>
            <description><![CDATA[<h3 id="도메인-연결하기">도메인 연결하기</h3>
<p>✍️<a href="https://dns.gabia.com/">가비아 접속하기</a></p>
<h4 id="도메인-구입연결">도메인 구입/연결</h4>
<p>도메인을 구매한다는 것은, 네임서버를 운영해주는 업체에 IP와 도메인 메칭 유지비를 내는 것이다. 한국 또는 글로벌 업체 어디든 상관 없지만, 우리는 한국의 &#39;가비아&#39;라는 회사에서 구입해 보자!</p>
<ul>
<li>DNS 설정 클릭 → 호스트 이름에 @, IP 주소에 IP 주소를 입력
<img src="https://velog.velcdn.com/images/ddabong-dochi/post/7bd968ae-a832-4931-a3ad-83b7b1ff41bb/image.png" alt=""></li>
<li>약간의 시간을 가진 후 내 도메인으로 접근하면 접속이 된다!</li>
</ul>
<h3 id="og-태그">og 태그</h3>
<h4 id="og-태그-만들기">og 태그 만들기</h4>
<pre><code>&lt;meta property=&quot;og:title&quot; content=&quot;내 사이트의 제목&quot; /&gt;
&lt;meta property=&quot;og:description&quot; content=&quot;보고 있는 페이지의 내용 요약&quot; /&gt;
&lt;meta property=&quot;og:image&quot; content=&quot;이미지URL&quot; /&gt;</code></pre><h3 id="서버에-올려놓은-파일-수정해-보기">서버에 올려놓은 파일 수정해 보기</h3>
<p><strong>1. 일단 작동하는 서버 중지시키기</strong>
터미널에 아래 코드 입력하기</p>
<pre><code>ps -ef | grep &#39;python app.py&#39; | awk &#39;{print $2}&#39; | xargs kill</code></pre><p><strong>2. FileZilla에 올려 놓은 파일 지우고 새로 올리기</strong>
static, templates, app.py
<strong>3. 다시 서버 실행시키기</strong></p>
<pre><code>nohup python app.py &amp;</code></pre><p><strong>4. 작동 확인하기</strong>
<img src="https://velog.velcdn.com/images/ddabong-dochi/post/e2490157-6407-42ff-a16c-1fa16581e059/image.png" alt="">
❗️참고) 이미지를 바꿨는데 이전 og image가 그대로 나와요!
그 이유는 페이스북/카카오톡 등에서 처음 것을 한동안 저장해놓기 때문</p>
<blockquote>
<p>페이스북 og 태그 초기화 하기: <a href="https://developers.facebook.com/tools/debug/">https://developers.facebook.com/tools/debug/</a>
카카오톡 og 태그 초기화 하기: <a href="https://developers.kakao.com/tool/clear/og">https://developers.kakao.com/tool/clear/og</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 5주차_24일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A824%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A824%EC%9D%BC</guid>
            <pubDate>Fri, 13 May 2022 10:57:15 GMT</pubDate>
            <description><![CDATA[<h3 id="nohup-설정하기">nohup 설정하기</h3>
<ul>
<li>현재 상황
Git bash 또는 맥의 터미널을 종료하면(=즉, SSH 접속을 끊으면) 프로세스가 종료되면서 서버가 돌아가지 않고 있다. 그러나 우리가 원격 접속을 끊어도 서버는 계속 동작해야겠지?<blockquote>
<p>❗️터미널에서 재접속할 때 하나하나 다시 칠 필요 없다. 화살표 위 ↑ 버튼 누르면 이전 꺼 입력한거 그대로 나옴</p>
</blockquote>
</li>
<li>원격 접속을 종료하더라도 서버가 계속 돌아가게 하기<pre><code># 아래의 명령어로 실행하면 된다
nohup python app.py &amp;</code></pre></li>
<li>서버 종료하기 - 강제종료하는 방법<pre><code>ps -ef | grep &#39;python app.py&#39; | awk &#39;{print $2}&#39; | xargs kill</code></pre></li>
<li>브라우저에서 접속하기<pre><code>http://내AWS아이피/</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 5주차_23일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A823%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A823%EC%9D%BC</guid>
            <pubDate>Thu, 12 May 2022 11:29:22 GMT</pubDate>
            <description><![CDATA[<h3 id="서버-세팅하기">서버 세팅하기</h3>
<h4 id="✍️서버-환경-통일하기">✍️서버 환경 통일하기</h4>
<p>우리는 지금 막! 컴퓨터를 구매한 상태이다. 여기에 이런저런 세팅들(업그레이드, DB설치, 명령어 통일 등)을 해줘야 본격적으로 이용할 때 편리하다.</p>
<ul>
<li>EC2 한방에 세팅하기<pre><code># python3 명령어를 python으로 사용할 수 있게 하는 명령어
# python3 -&gt; python
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
</code></pre></li>
</ul>
<h1 id="1-pip3-설치-2-pip3-명령어를-pip으로-사용할-수-있게-하는-명령어">1) pip3 설치 2) pip3 명령어를 pip으로 사용할 수 있게 하는 명령어</h1>
<h1 id="pip3---pip">pip3 -&gt; pip</h1>
<p>sudo apt-get update
sudo apt-get install -y python3-pip
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1</p>
<h1 id="80포트로-들어오는-요청을-5000포트로-넘겨주는-명령어">80포트로 들어오는 요청을 5000포트로 넘겨주는 명령어</h1>
<h1 id="port-forwarding">port forwarding</h1>
<p>sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000</p>
<pre><code>#### filezilla를 이용해서 간단한 python 파일을 올려본다.
![](https://velog.velcdn.com/images/ddabong-dochi/post/a2de72c5-77f7-4c19-8173-28f5ebd6ac24/image.png)
Host에는 내 EC2서버의 퍼블릭 IPv4 주소를 복사해서 넣는다. ip // User: ubuntu로 입력
![](https://velog.velcdn.com/images/ddabong-dochi/post/2902f102-49d5-4dfd-8e4a-ac6ebe212457/image.png)
마우스로 드래그 해서 파일을 업로드/다운로드하면 된다.

### Flask 서버를 실행해보기
- filezilla에서 homework 폴더 째로 드래그 드롭으로 EC2 인스턴스의 home/ubuntu폴더에 업로드한다.
- pip로 패키지 설치</code></pre><p>pip install flask
pip install pymongo
pip install dnspython</p>
<pre><code>- flask 서버 실행해보기
&gt; 아래 명령어로 flask 서버를 실행한다.
python app.py
서버 실행이 되면, 크롬에서 접속을 해본다.
크롬 브라우저 창에 아래와 같이 입력한다.
http://[내 EC2 IP]:5000/
- AWS에서 5000포트를 열어주기
EC2서버(=가상의 내 컴퓨터)에서 포트를 따로 설정하는 것 외에도 AWS EC2에서도 자체적으로 포트를 열고/닫을 수 있게 관리를 하고 있다. 그래서 AWS EC2 Security Group에서 인바운드 요청 포트를 열어줘야 한다.
일단 EC2 관리 콘솔로 들어간다. 그리고 보안그룹(영문: Security Group)을 눌러 들어간다. launch-wizard-1이라고 쓰여 있다.
![](https://velog.velcdn.com/images/ddabong-dochi/post/6b00f355-a0f2-4713-98ce-d4bb4adaae9e/image.png)
해당 보안그룹을 클릭한다.
Edit inbound rules를 선택한다.(인바운드 규칙 편집)
✔️두 가지 포트를 추가해보자. Anywhere-IPv4를 클릭한다.
![](https://velog.velcdn.com/images/ddabong-dochi/post/5c40c3d1-d1ff-422d-8482-0ed1360f69c2/image.png)
&gt; 80포트: HTTP 접속을 위한 기본 포트
5000포트: flask 기본 포트

#### 어떻게 되는걸까? 포트 번호 없애기 기본 개념
지금은 5000포트에서 웹서비스가 실행되고 있다. 그래서 매번 :5000이라고 뒤에 붙여줘야 한다. 뒤에 붙는 포트 번호를 없애려면 어떻게 해야 할까?
http 요청에서는 80포트가 기본이기 때문에 굳이 :80을 붙이지 않아도 자동으로 연결이 된다.
포트 번호를 입력하지 않아도 자동으로 접속되기 위해 우리는 80포트로 오는 요청을 5000포트로 전달하게 하는 포트포워딩(port forwarding)을 사용한다.
![](https://velog.velcdn.com/images/ddabong-dochi/post/d1d2acae-381e-48b9-a334-f29c99debdf9/image.png)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 5주차_22일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A822%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A822%EC%9D%BC</guid>
            <pubDate>Wed, 11 May 2022 11:30:18 GMT</pubDate>
            <description><![CDATA[<h3 id="💕내-프로젝트를-서버에-올리기">💕내 프로젝트를 서버에 올리기</h3>
<h4 id="웹서비스-런칭에-필요한-개념-소개">&#39;웹서비스 런칭&#39;에 필요한 개념 소개</h4>
<blockquote>
<p>배포는 누구나 내 서비스를 사용할 수 있게 하기 위한 작업들이다. 웹서비스를 런칭하는 것!</p>
</blockquote>
<ul>
<li>웹 서비스를 런칭하기 위해 클라이언트의 요청에 항상 응답해줄 수 있는 서버에 프로젝트를 실행시켜줄 거다!</li>
<li>언제나 요청에 응답하려면, 
1) 컴퓨터가 <em><strong>항상</strong> _켜져있고 프로그램이 실행되어 있어야하고, 
2) 모두가 접근할 수 있는 공개 주소인 공개 IP 주소(Public IP Address)로 나의 웹 서비스에 _<strong>접근할 수 있도록</strong></em> 해야해요.</li>
<li>서버는 그냥 컴퓨터라는거 기억나시죠? 외부 접속이 가능하게 설정한 다음에 내 컴퓨터를 서버로 사용할 수도 있어요.</li>
<li>그러나 이 수업에서는 AWS 라는 클라우드 서비스에서 편하게 서버를 관리하기 위해서 항상 켜 놓을 수 있는 컴퓨터인 EC2 사용권을 구입해 서버로 사용할 예정!</li>
</ul>
<h3 id="☘️aws서버-구매하기">☘️AWS서버 구매하기</h3>
<h4 id="ec2-서버-구매하기">EC2 서버 구매하기</h4>
<p>✍️AWS EC2 서버 사기(준비 상식)
클릭 만으로 내가 원하는 서버(컴퓨터)의 설정을 정하고, 거기에 컴퓨터를 실행시키기 위한 운영체제(OS)를 설치할 거다.
이 수업에서는 OS로 리누스의 Ubuntu를 설치한다. 윈도우와 같이, OS도 여러개 존재한다. 리눅스도 그 중의 하나이며 오픈소스로 발전되는 OS이다.
<a href="https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2">EC2 콘솔페이지</a></p>
<h4 id="구매-화면들-따라하기">구매 화면들 따라하기</h4>
<ul>
<li>인스턴스-인스턴스 시작</li>
<li>Ubuntu Server 18.04 또는 20.04 버전을 구매</li>
<li>키 페어 생성-새 키페어 생성</li>
<li>인스턴스 보기-인스턴스 상태(실행 중)
인스턴스 중지 : 컴퓨터 끔
인스턴스 종료 : 컴퓨터 반납 (무료기간 1년 후 결제가 되기 전에 종료하자. 인스턴스에 마우스 우클릭&gt;&#39;인스턴스 상태&#39;클릭</li>
</ul>
<h4 id="ec2에-접속하기">EC2에 접속하기</h4>
<p>✍️AWS EC2에 접속하기 (준비 상식 편)</p>
<blockquote>
<p>SSH(Secure Shell Protocol)
다른 컴퓨터에 접속할 때 쓰는 프로그램이다. 다른 것들 보다 보안이 상대적으로 뛰어나다. 접속할 컴퓨터가 22번 포트가 열려있어야 접속 가능하다. AWS EC2의 경우, 이미 22번 포트가 열려있다. 확인해보자!</p>
</blockquote>
<p>❗️Mac OS: Mac은 ssh가 있어서 명령어로 바로 접근 가능!
터미널 열기(spotlight에 terminal 입력)
방금 받은 내 Keypair의 접근 권한 바꿔주기</p>
<pre><code>sudo chmod 400 받은키페어를끌어다놓기 </code></pre><p>SSH로 접속하기</p>
<pre><code>ssh -i 받은키페어를끌어다놓기 ubuntu@AWS에 적힌 퍼블릭 IPv4 주소</code></pre><h4 id="간단한-리눅스-명령어-연습하기">간단한 리눅스 명령어 연습하기</h4>
<p>리눅스는 윈도우 같지 않아서 &#39;쉘 명령어&#39;를 통해 OS를 조작한다.(일종의 마우스 역할)
팁! 리눅스 커널에서 윗화살표를 누르면 바로 전에 썼던 명령어가 나옴</p>
<pre><code>ls: 내 위치의 모든 파일을 보여준다.

pwd: 내 위치(폴더의 경로)를 알려준다.

mkdir: 내 위치 아래에 폴더를 하나 만든다.

cd [갈 곳]: 나를 [갈 곳] 폴더로 이동시킨다.

cd .. : 나를 상위 폴더로 이동시킨다.

cp -r [복사할 것] [붙여넣기 할 것]: 복사 붙여넣기

rm -rf [지울 것]: 지우기

sudo [실행 할 명령어]: 명령어를 관리자 권한으로 실행한다.
sudo su: 관리가 권한으로 들어간다. (나올때는 exit으로 나옴)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 5주차_21일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A821%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A821%EC%9D%BC</guid>
            <pubDate>Tue, 10 May 2022 11:20:11 GMT</pubDate>
            <description><![CDATA[<h3 id="🔥버킷리스트---get연습보여주기">🔥버킷리스트 - GET연습(보여주기)</h3>
<p><img src="https://velog.velcdn.com/images/ddabong-dochi/post/9e49ab53-cb1c-484f-a059-0bd2de608a0c/image.png" alt=""></p>
<ul>
<li>API 만들고 사용하기 : 버킷리스트 조회 API(Read→ GET)<blockquote>
<p>a. 요청 정보 :  URL= /bucket, 요청 방식 = GET
b. 클라(ajax) → 서버(flask) : (없음)
c. 서버(flask) → 클라(ajax) : 전체 버킷리스트를 보여주기</p>
</blockquote>
</li>
</ul>
<p>리스트를 보여주는 역할까지만이지 아직 &#39;완료&#39; 버튼을 누르면 지워지는건 아니다.</p>
<ul>
<li><p>서버부터 만들기</p>
<pre><code>@app.route(&quot;/bucket&quot;, methods=[&quot;GET&quot;])
def bucket_get():
  buckets_list = list(db.bucket.find({},{&#39;_id&#39;:False}))
  return jsonify({&#39;buckets&#39;:buckets_list})</code></pre></li>
<li><p>클라이언트 만들기</p>
<pre><code>function show_bucket(){
  $(&#39;#bucket-list&#39;).empty()
  $.ajax({
      type: &quot;GET&quot;,
      url: &quot;/bucket&quot;,
      data: {},
      success: function (response) {
          let rows = response[&#39;buckets&#39;]
          for (let i = 0; i &lt; rows.length; i++) {
              let bucket = rows[i][&#39;bucket&#39;]
              let num = rows[i][&#39;num&#39;]
              let done = rows[i][&#39;done&#39;]

              let temp_html = ``
              if (done == 0) {
                  temp_html = `&lt;li&gt;
                                  &lt;h2&gt;✅ ${bucket}&lt;/h2&gt;
                                  &lt;button onclick=&quot;done_bucket(${num})&quot; type=&quot;button&quot; class=&quot;btn btn-outline-primary&quot;&gt;완료!&lt;/button&gt;
                              &lt;/li&gt;`
              } else {
                  temp_html = `&lt;li&gt;
                                  &lt;h2 class=&quot;done&quot;&gt;✅ ${bucket}&lt;/h2&gt;
                              &lt;/li&gt;`
              }
              $(&#39;#bucket-list&#39;).append(temp_html)
          }
      }
  });
}</code></pre><h3 id="🔥버킷리스트---post연습완료하기">🔥버킷리스트 - POST연습(완료하기)</h3>
</li>
<li><p>API 만들고 사용하기 : 버킷리스트 완료 API (Update→ POST)</p>
<blockquote>
<p>a. 요청 정보 :  URL= /bucket/done, 요청 방식 = POST
b. 클라(ajax) → 서버(flask) : num (버킷 넘버)
c. 서버(flask) → 클라(ajax) : 메시지를 보냄 (버킷 완료!)</p>
</blockquote>
</li>
<li><p>서버부터 만들기
버킷 번호를 받아서 업데이트를 하면 된다. 그런데 num_receive는 문자열로 들어오니까, 숫자로 바꿔주는 것이 중요하다.
<img src="https://velog.velcdn.com/images/ddabong-dochi/post/07ec8894-6b33-427e-9944-87767919e2b9/image.png" alt=""></p>
<pre><code>@app.route(&quot;/bucket/done&quot;, methods=[&quot;POST&quot;])
def bucket_done():
  num_receive = request.form[&quot;num_give&quot;]
  db.bucket.update_one({&#39;num&#39;: int(num_receive)}, {&#39;$set&#39;: {&#39;done&#39;: 1}})
  return jsonify({&#39;msg&#39;: &#39;버킷 완료!&#39;})</code></pre></li>
<li><p>클라이언트 만들기
버킷 넘버를 보여주면 된다. 버킷넘버는? HTML이 만들어질 때 적히게 된다. 바로 아래와 같이🖐</p>
<pre><code>function done_bucket(num){
  $.ajax({
      type: &quot;POST&quot;,
      url: &quot;/bucket/done&quot;,
      data: {&#39;num_give&#39;:num},
      success: function (response) {
          alert(response[&quot;msg&quot;])
          window.location.reload()
      }
  });
}</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 5주차_20일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A820%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-5%EC%A3%BC%EC%B0%A820%EC%9D%BC</guid>
            <pubDate>Mon, 09 May 2022 11:51:45 GMT</pubDate>
            <description><![CDATA[<h3 id="🔥사전-세팅하기">🔥사전 세팅하기</h3>
<p><strong>1. <a href="https://filezilla-project.org/download.php">Filezilla 설치</a>하기</strong></p>
<ul>
<li>파일을 보낼 수 있는 프로그램</li>
<li>다운로드 클릭 후 가장 기본 버전 설치하기</li>
</ul>
<p><strong>2. <a href="https://www.gabia.com">가비아 가입</a>하기 &amp; 도메인 구입하기</strong></p>
<ul>
<li>현재 .shop 도메인이 500원/1년 할인 행사중이니 무통장입금으로 구입하기(1,000원 이하는 카드 결제 안됨)</li>
</ul>
<h3 id="☘️버킷리스트-만들기">☘️<a href="http://spartacodingclub.shop/web/bucket">버킷리스트</a> 만들기</h3>
<ol>
<li>프로젝트 세팅</li>
</ol>
<ul>
<li>flask 폴더 구조 만들기 : static, templates 폴더 + app.py 만들기</li>
<li>패키지 설치 : flask, pymongo, dnspython</li>
</ul>
<ol start="2">
<li>뼈대 준비하기</li>
<li>POST연습(기록하기)<blockquote>
<p>a. 요청 정보 :  URL= /bucket, 요청 방식 = POST
b. 클라(ajax) → 서버(flask) : bucket
c. 서버(flask) → 클라(ajax) : 메시지를 보냄 (기록 완료!)
단! 서버에서 한 가지 일을 더 해야한다.
→ 번호를 만들어 함께 넣어주는 것. 그래야 업데이트가 가능함!</p>
</blockquote>
</li>
</ol>
<ul>
<li><p>서버 만들기(클라이언트는 쉬워서 별도로 기재 안함)</p>
<blockquote>
<p><code>bucket</code> 정보를 받아서, 저장하면 되겠죠? 단, 한 가지 일이 더 있다. → 버킷 <strong>번호</strong> 와 <strong>완료여부</strong> 를 함께 넣어주는 것!
❗️번호를 부여하는 이유는 버킷리스트에 같은 항목, 예를 들어 &#39;여행가기&#39;가 2번 있다면 이걸 인식하기 위해 번호를 붙임. 그리고 완료 여부는 아래 화면에 체크하기 위해서 부여.</p>
</blockquote>
<pre><code>@app.route(&quot;/bucket&quot;, methods=[&quot;POST&quot;])
def bucket_post():
  bucket_receive = request.form[&#39;bucket_give&#39;]

  bucket_list = list(db.buckets.find({},{&#39;_id&#39;:False}))
  count = len(bucket_list)+1

  doc = {
      &#39;num&#39;:count,
      &#39;bucket&#39;: bucket_receive,
      &#39;done&#39;:0
  }
  db.buckets.insert_one(doc)

  return jsonify({&#39;msg&#39;: &#39;등록 완료!&#39;})</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 4주차_19일(2) 팬명록 완성하기]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%984%EC%A3%BC%EC%B0%A8-19%EC%9D%BC2-%ED%8C%AC%EB%AA%85%EB%A1%9D-%EC%99%84%EC%84%B1%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%984%EC%A3%BC%EC%B0%A8-19%EC%9D%BC2-%ED%8C%AC%EB%AA%85%EB%A1%9D-%EC%99%84%EC%84%B1%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 08 May 2022 05:08:35 GMT</pubDate>
            <description><![CDATA[<p><a href="http://spartacodingclub.shop/web/homework">💕팬명록 완성하기</a>
<img src="https://velog.velcdn.com/images/ddabong-dochi/post/16552ae6-9481-4217-99de-10e2ff403ebb/image.png" alt=""></p>
<h4 id="1-팬명록의-apppy-코드">1. 팬명록의 app.py 코드</h4>
<pre><code>from flask import Flask, render_template, request, jsonify
app = Flask(__name__)

from pymongo import MongoClient
client = MongoClient(&#39;mongodb+srv://아이디:비밀번호@cluster0.wu00c.mongodb.net/Cluster0?retryWrites=true&amp;w=majority&#39;)
db = client.dbsparta

@app.route(&#39;/&#39;)
def home():
    return render_template(&#39;index.html&#39;)

@app.route(&quot;/homework&quot;, methods=[&quot;POST&quot;])
def homework_post():
    name_receive = request.form[&#39;name_give&#39;]
    comment_receive = request.form[&#39;comment_give&#39;]

    doc = {
        &#39;name&#39;: name_receive,
        &#39;comment&#39;: comment_receive
    }
    db.listing.insert_one(doc)

    return jsonify({&#39;msg&#39;: &#39;응원 완료!&#39;})

@app.route(&quot;/homework&quot;, methods=[&quot;GET&quot;])
def homework_get():
    fan_list = list(db.listing.find({},{&#39;_id&#39;:False}))
    return jsonify({&#39;fans&#39;: fan_list})

if __name__ == &#39;__main__&#39;:
    app.run(&#39;0.0.0.0&#39;, port=1000, debug=True)</code></pre><h4 id="2-팬명록의-indexhtml-코드">2. 팬명록의 index.html 코드</h4>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;

    &lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;
          integrity=&quot;sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC&quot; crossorigin=&quot;anonymous&quot;&gt;
    &lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js&quot;
            integrity=&quot;sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM&quot;
            crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

    &lt;title&gt;초미니홈피 - 팬명록&lt;/title&gt;

    &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Noto+Serif+KR:wght@200;300;400;500;600;700;900&amp;display=swap&quot;
          rel=&quot;stylesheet&quot;&gt;
    &lt;style&gt;
        * {
            font-family: &#39;Noto Serif KR&#39;, serif;
        }

        .mypic {
            width: 100%;
            height: 300px;

            background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url(&#39;http://thepublic.kr/news/data/20211211/p1065572405381876_990_thum.jpg&#39;);
            background-position: center 10%;
            background-size: cover;

            color: white;

            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
        }

        .mypost {
            width: 95%;
            max-width: 500px;
            margin: 20px auto 20px auto;

            box-shadow: 0px 0px 3px 0px black;
            padding: 20px;
        }

        .mypost &gt; button {
            margin-top: 15px;
        }

        .mycards {
            width: 95%;
            max-width: 500px;
            margin: auto;
        }

        .mycards &gt; .card {
            margin-top: 10px;
            margin-bottom: 10px;
        }
    &lt;/style&gt;
    &lt;script&gt;
        $(document).ready(function () {
            set_temp()
            show_comment()
        });

        function set_temp() {
            $.ajax({
                type: &quot;GET&quot;,
                url: &quot;http://spartacodingclub.shop/sparta_api/weather/seoul&quot;,
                data: {},
                success: function (response) {
                    $(&#39;#temp&#39;).text(response[&#39;temp&#39;])
                }
            })
        }

        function save_comment() {
            let name = $(&#39;#name&#39;).val()
            let comment = $(&#39;#comment&#39;).val()

            $.ajax({
                type: &#39;POST&#39;,
                url: &#39;/homework&#39;,
                data: {name_give:name, comment_give:comment},
                success: function (response) {
                    alert(response[&#39;msg&#39;])
                    window.location.reload()
                }
            })
        }

        function show_comment() {
            $.ajax({
                type: &quot;GET&quot;,
                url: &quot;/homework&quot;,
                data: {},
                success: function (response) {
                    let rows = response[&#39;fans&#39;]
                    for (let i=0; i&lt;rows.length; i++){
                        let comment = rows[i][&#39;comment&#39;]
                        let name = rows[i][&#39;name&#39;]

                        let temp_html =`&lt;div class=&quot;card&quot;&gt;
                                            &lt;div class=&quot;card-body&quot;&gt;
                                                &lt;blockquote class=&quot;blockquote mb-0&quot;&gt;
                                                    &lt;p&gt;${comment}&lt;/p&gt;
                                                    &lt;footer class=&quot;blockquote-footer&quot;&gt;${name}&lt;/footer&gt;
                                                &lt;/blockquote&gt;
                                            &lt;/div&gt;
                                        &lt;/div&gt;`
                        $(&#39;#comment-list&#39;).append(temp_html)
                    }
                }
            });
        }
    &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class=&quot;mypic&quot;&gt;
    &lt;h1&gt;십센치(10cm) 팬명록&lt;/h1&gt;
    &lt;p&gt;현재기온: &lt;span id=&quot;temp&quot;&gt;36&lt;/span&gt;도&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;mypost&quot;&gt;
    &lt;div class=&quot;form-floating mb-3&quot;&gt;
        &lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;name&quot; placeholder=&quot;url&quot;&gt;
        &lt;label for=&quot;floatingInput&quot;&gt;닉네임&lt;/label&gt;
    &lt;/div&gt;
    &lt;div class=&quot;form-floating&quot;&gt;
&lt;textarea class=&quot;form-control&quot; placeholder=&quot;Leave a comment here&quot; id=&quot;comment&quot;
          style=&quot;height: 100px&quot;&gt;&lt;/textarea&gt;
        &lt;label for=&quot;floatingTextarea2&quot;&gt;응원댓글&lt;/label&gt;
    &lt;/div&gt;
    &lt;button onclick=&quot;save_comment()&quot; type=&quot;button&quot; class=&quot;btn btn-dark&quot;&gt;응원 남기기&lt;/button&gt;
&lt;/div&gt;
&lt;div class=&quot;mycards&quot; id=&quot;comment-list&quot;&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h3 id="🔥웹개발-종합반-4주차-후기🔥">🔥웹개발 종합반 4주차 후기🔥</h3>
<p>화성땅 공동구매, 스파르타피디아 자체 코드로 복사+붙여넣기 한 후 몇 가지만 수정만 하면 되기에 크게 어렵지 않았다. 4주차를 이렇게 일찍 끝낼 맘이 없었는데 중간에 끊어서 하기에는 애매한 강좌가 있어서 한꺼번에 듣게 되었다. 5주차 마지막만 남았는데 어찌 엄청 일찍 끝나는 느낌?
다음주도 기대해 본다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 4주차_19일(1) 스파르타피디아]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%984%EC%A3%BC%EC%B0%A8-19%EC%9D%BC-%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%ED%94%BC%EB%94%94%EC%95%84</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%984%EC%A3%BC%EC%B0%A8-19%EC%9D%BC-%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%ED%94%BC%EB%94%94%EC%95%84</guid>
            <pubDate>Sun, 08 May 2022 04:28:05 GMT</pubDate>
            <description><![CDATA[<p>💕<a href="http://spartacodingclub.shop/web/movie">스파르타피디아 완성작</a></p>
<h3 id="1-프로젝트-세팅">1. 프로젝트 세팅</h3>
<ul>
<li>flask 폴더 구조 만들기 : static, templates 폴더 + app.py만들기</li>
<li>패키지 설치 : flask, pymongo, dnspython, bs4, requests</li>
</ul>
<h3 id="2-조각-기능-구현해보기">2. 조각 기능 구현해보기</h3>
<ul>
<li>URL에서 페이지 정보 가져오기(meta태그 스크래핑)</li>
<li>어떤 부분에 스크래핑이 필요한가? URL만 입력했는데 자동으로 불러와지는 부분들이 있다. 바로 &#39;제목&#39;, &#39;썸네일 이미지&#39;, &#39;내용&#39;이다. 이 부분은 meta 태그를 크롤링 함으로써 얻을 수 있다.<blockquote>
<p>메타 태그는 head 태그에 들어가는, 눈으로 보이는 것(body) 외에 사이트의 속성을 설명해주는 태그들이다.
예) 구글 검색 시 표시 될 설명문, 사이트 제목, 카톡 공유 시 표시 될 이미지 등
✍️우리는 그 중 og:image / og:title / og:description 을 크롤링 할 예정</p>
</blockquote>
</li>
<li>(연습) 크롤링 기본 코드<pre><code>import requests
from bs4 import BeautifulSoup
</code></pre></li>
</ul>
<p>url = &#39;<a href="https://movie.naver.com/movie/bi/mi/basic.naver?code=191597&#39;">https://movie.naver.com/movie/bi/mi/basic.naver?code=191597&#39;</a></p>
<p>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(url,headers=headers)</p>
<p>soup = BeautifulSoup(data.text, &#39;html.parser&#39;)</p>
<h1 id="아래와-같이-코딩을-해서-meta-tag를-가져온다">아래와 같이 코딩을 해서 meta tag를 가져온다.</h1>
<p>title = soup.select_one(&#39;meta[property=&quot;og:title&quot;]&#39;)[&#39;content&#39;]
img = soup.select_one(&#39;meta[property=&quot;og:image&quot;]&#39;)[&#39;content&#39;]
desc = soup.select_one(&#39;meta[property=&quot;og:description&quot;]&#39;)[&#39;content&#39;]
print(title, img, desc)</p>
<pre><code>
### 3. 뼈대 준비하기

### 4. POST 연습(포스팅하기)
- API 만들고 사용하기 - 포스팅API(Create→ POST)
&gt; a. 요청 정보 :  URL= /movie, 요청 방식 = POST
b. 클라(ajax) → 서버(flask) : url, star, comment
c. 서버(flask) → 클라(ajax) : 메시지를 보냄 (포스팅 완료!)

### 5. GET 연습(보여주기)
- API 만들고 사용하기 - 보여주기API(Read→GET)
&gt; a. 요청 정보 :  URL= /movie, 요청 방식 = GET
b. 클라(ajax) → 서버(flask) : (없음)
c. 서버(flask) → 클라(ajax) : 전체 영화를 보내주기

### 6. 완성 코드
- 클라이언트 index.html</code></pre><!doctype html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<pre><code>&lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;
      integrity=&quot;sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC&quot; crossorigin=&quot;anonymous&quot;&gt;
&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js&quot;
        integrity=&quot;sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM&quot;
        crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

&lt;title&gt;스파르타 피디아&lt;/title&gt;

&lt;link href=&quot;https://fonts.googleapis.com/css2?family=Gowun+Dodum&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;

&lt;style&gt;
    * {
        font-family: &#39;Gowun Dodum&#39;, sans-serif;
    }

    .mytitle {
        width: 100%;
        height: 250px;

        background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url(&#39;https://movie-phinf.pstatic.net/20210715_95/1626338192428gTnJl_JPEG/movie_image.jpg&#39;);
        background-position: center;
        background-size: cover;

        color: white;

        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
    }

    .mytitle &gt; button {
        width: 200px;
        height: 50px;

        background-color: transparent;
        color: white;

        border-radius: 50px;
        border: 1px solid white;

        margin-top: 10px;
    }

    .mytitle &gt; button:hover {
        border: 2px solid white;
    }

    .mycomment {
        color: gray;
    }

    .mycards {
        margin: 20px auto 0px auto;
        width: 95%;
        max-width: 1200px;
    }

    .mypost {
        width: 95%;
        max-width: 500px;
        margin: 20px auto 0px auto;
        padding: 20px;
        box-shadow: 0px 0px 3px 0px gray;

        display: none;
    }

    .mybtns {
        display: flex;
        flex-direction: row;
        align-items: center;
        justify-content: center;

        margin-top: 20px;
    }
    .mybtns &gt; button {
        margin-right: 10px;
    }
&lt;/style&gt;
&lt;script&gt;
    $(document).ready(function(){
      listing();
    });

    function listing() {
        $(&#39;#cards-box&#39;).empty()
        $.ajax({
            type: &#39;GET&#39;,
            url: &#39;/movie&#39;,
            data: {},
            success: function (response) {
                let rows = response[&#39;movies&#39;]
                for(let i = 0; i &lt; rows.length; i++) {
                    let image = rows[i][&#39;image&#39;]
                    let title = rows[i][&#39;title&#39;]
                    let desc = rows[i][&#39;desc&#39;]
                    let star = rows[i][&#39;star&#39;]
                    let comment = rows[i][&#39;comment&#39;]

                    let star_image = &#39;⭐&#39;.repeat(star)

                    let temp_html = `&lt;div class=&quot;col&quot;&gt;
                                        &lt;div class=&quot;card h-100&quot;&gt;
                                            &lt;img src=&quot;${image}&quot;
                                                 class=&quot;card-img-top&quot;&gt;
                                            &lt;div class=&quot;card-body&quot;&gt;
                                                &lt;h5 class=&quot;card-title&quot;&gt;${title}&lt;/h5&gt;
                                                &lt;p class=&quot;card-text&quot;&gt;${desc}&lt;/p&gt;
                                                &lt;p&gt;${star_image}&lt;/p&gt;
                                                &lt;p class=&quot;mycomment&quot;&gt;${comment}&lt;/p&gt;
                                            &lt;/div&gt;
                                        &lt;/div&gt;
                                    &lt;/div&gt;`

                    $(&#39;#cards-box&#39;).append(temp_html)
                }
            }
        })
    }

    function posting() {
        let url = $(&#39;#url&#39;).val()
        let star = $(&#39;#star&#39;).val()
        let comment = $(&#39;#comment&#39;).val()

        $.ajax({
            type: &#39;POST&#39;,
            url: &#39;/movie&#39;,
            data: {url_give: url, star_give: star, comment_give: comment},
            success: function (response) {
                alert(response[&#39;msg&#39;])
                window.location.reload()
            }
        });
    }

    function open_box(){
        $(&#39;#post-box&#39;).show()
    }
    function close_box(){
        $(&#39;#post-box&#39;).hide()
    }
&lt;/script&gt;</code></pre></head>

<body>
<div class="mytitle">
    <h1>내 생애 최고의 영화들</h1>
    <button onclick="open_box()">영화 기록하기</button>
</div>
<div class="mypost" id="post-box">
    <div class="form-floating mb-3">
        <input id="url" type="email" class="form-control" placeholder="name@example.com">
        <label>영화URL</label>
    </div>
    <div class="input-group mb-3">
        <label class="input-group-text" for="inputGroupSelect01">별점</label>
        <select class="form-select" id="star">
            <option selected>-- 선택하기 --</option>
            <option value="1">⭐</option>
            <option value="2">⭐⭐</option>
            <option value="3">⭐⭐⭐</option>
            <option value="4">⭐⭐⭐⭐</option>
            <option value="5">⭐⭐⭐⭐⭐</option>
        </select>
    </div>
    <div class="form-floating">
        <textarea id="comment" class="form-control" placeholder="Leave a comment here"></textarea>
        <label for="floatingTextarea2">코멘트</label>
    </div>
    <div class="mybtns">
        <button onclick="posting()" type="button" class="btn btn-dark">기록하기</button>
        <button onclick="close_box()" type="button" class="btn btn-outline-dark">닫기</button>
    </div>
</div>
<div class="mycards">
    <div class="row row-cols-1 row-cols-md-4 g-4" id="cards-box">
        <div class="col">
            <div class="card h-100">
                <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
                     class="card-img-top">
                <div class="card-body">
                    <h5 class="card-title">영화 제목이 들어갑니다</h5>
                    <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
                    <p>⭐⭐⭐</p>
                    <p class="mycomment">나의 한줄 평을 씁니다</p>
                </div>
            </div>
        </div>
        <div class="col">
            <div class="card h-100">
                <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
                     class="card-img-top">
                <div class="card-body">
                    <h5 class="card-title">영화 제목이 들어갑니다</h5>
                    <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
                    <p>⭐⭐⭐</p>
                    <p class="mycomment">나의 한줄 평을 씁니다</p>
                </div>
            </div>
        </div>
        <div class="col">
            <div class="card h-100">
                <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
                     class="card-img-top">
                <div class="card-body">
                    <h5 class="card-title">영화 제목이 들어갑니다</h5>
                    <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
                    <p>⭐⭐⭐</p>
                    <p class="mycomment">나의 한줄 평을 씁니다</p>
                </div>
            </div>
        </div>
        <div class="col">
            <div class="card h-100">
                <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
                     class="card-img-top">
                <div class="card-body">
                    <h5 class="card-title">영화 제목이 들어갑니다</h5>
                    <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
                    <p>⭐⭐⭐</p>
                    <p class="mycomment">나의 한줄 평을 씁니다</p>
                </div>
            </div>
        </div>
    </div>
</div>
</body>

</html>
```
- 서버 app.py
```
from flask import Flask, render_template, request, jsonify
app = Flask(__name__)

<p>from pymongo import MongoClient
client = MongoClient(&#39;내 URL&#39;)
db = client.dbsparta</p>
<p>import requests
from bs4 import BeautifulSoup</p>
<p>@app.route(&#39;/&#39;)
def home():
   return render_template(&#39;index.html&#39;)</p>
<p>@app.route(&quot;/movie&quot;, methods=[&quot;POST&quot;])
def movie_post():
    url_receive = request.form[&#39;url_give&#39;]
    star_receive = request.form[&#39;star_give&#39;]
    comment_receive = request.form[&#39;comment_give&#39;]</p>
<pre><code>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(url_receive, headers=headers)

soup = BeautifulSoup(data.text, &#39;html.parser&#39;)

og_image = soup.select_one(&#39;meta[property=&quot;og:image&quot;]&#39;)
og_title = soup.select_one(&#39;meta[property=&quot;og:title&quot;]&#39;)
og_description = soup.select_one(&#39;meta[property=&quot;og:description&quot;]&#39;)

image = og_image[&#39;content&#39;]
title = og_title[&#39;content&#39;]
description = og_description[&#39;content&#39;]

doc = {
    &#39;image&#39;:image,
    &#39;title&#39;:title,
    &#39;desc&#39;:description,
    &#39;star&#39;:star_receive,
    &#39;comment&#39;:comment_receive
}

db.movies.insert_one(doc)

return jsonify({&#39;msg&#39;:&#39;POST 연결 완료!&#39;})</code></pre><p>@app.route(&quot;/movie&quot;, methods=[&quot;GET&quot;])
def movie_get():
    movies_list = list(db.movies.find({},{&#39;_id&#39;:False}))
    return jsonify({&#39;movies&#39;:movies_list})</p>
<p>if <strong>name</strong> == &#39;<strong>main</strong>&#39;:
   app.run(&#39;0.0.0.0&#39;, port=5000, debug=True)
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 4주차_18일(2) 화성땅 공동구매]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%984%EC%A3%BC%EC%B0%A8-18%EC%9D%BC2-%ED%99%94%EC%84%B1%EB%95%85-%EA%B3%B5%EB%8F%99%EA%B5%AC%EB%A7%A4</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%984%EC%A3%BC%EC%B0%A8-18%EC%9D%BC2-%ED%99%94%EC%84%B1%EB%95%85-%EA%B3%B5%EB%8F%99%EA%B5%AC%EB%A7%A4</guid>
            <pubDate>Sat, 07 May 2022 07:41:41 GMT</pubDate>
            <description><![CDATA[<p>💕<a href="http://spartacodingclub.shop/web/mars">화성땅 공동구매</a></p>
<h3 id="1-프로젝트-세팅">1. 프로젝트 세팅</h3>
<p>폴더구조 : static, templates 폴더 + app.py 만들기
패키지 설치 : flask, pymongo, dnspython</p>
<h3 id="2-뼈대-준비하기">2. 뼈대 준비하기</h3>
<p>index.html 파일은 templates 폴더 안에 만들기</p>
<h3 id="3-post-연습주문-저장">3. POST 연습(주문 저장)</h3>
<p>✔️<strong>API 만들고 사용하기</strong> - 이름, 주소, 평수 저장하기(Create→POST)</p>
<blockquote>
<p>a. 요청 정보 :  URL= /mars, 요청 방식 = POST
b. 클라(ajax) → 서버(flask) : name, address, size
c. 서버(flask) → 클라(ajax) : 메시지를 보냄 (주문 완료!)</p>
</blockquote>
<p>✔️<strong>클라이언트와 서버 연결 확인하기</strong></p>
<p>&lt;서버 코드-app.py&gt;</p>
<pre><code>@app.route(&quot;/mars&quot;, methods=[&quot;POST&quot;])
def mars_post():
    sample_receive = request.form[&#39;sample_give&#39;]
    print(sample_receive)
    return jsonify({&#39;msg&#39;: &#39;POST 연결 완료!&#39;})</code></pre><p>&lt;클라이언트 코드-index.html&gt;</p>
<pre><code>function save_order() {
    $.ajax({
        type: &#39;POST&#39;,
        url: &#39;/mars&#39;,
        data: { sample_give:&#39;데이터전송&#39; },
        success: function (response) {
            alert(response[&#39;msg&#39;])
        }
    });
}

&lt;button onclick=&quot;save_order()&quot; type=&quot;button&quot; class=&quot;btn btn-warning mybtn&quot;&gt;주문하기&lt;/button&gt;</code></pre><p>✔️<strong>서버부터 만들기</strong>
name, address, size 정보를 받아서 저장하자.</p>
<pre><code>@app.route(&quot;/mars&quot;, methods=[&quot;POST&quot;])
def mars_post():
    name_receive = request.form[&#39;name_give&#39;]
    address_receive = request.form[&#39;address_give&#39;]
    size_receive = request.form[&#39;size_give&#39;]

    doc = {
        &#39;name&#39;: name_receive,
        &#39;address&#39;: address_receive,
        &#39;size&#39;: size_receive
    }

    db.orders.insert_one(doc)

    return jsonify({&#39;msg&#39;: &#39;주문 완료!&#39;})</code></pre><p>✔️<strong>클라이언트 만들기</strong>
이번에는 name, address, size 정보를 보내주자.</p>
<pre><code>function save_order() {
    let name = $(&#39;#name&#39;).val()
    let address = $(&#39;#address&#39;).val()
    let size = $(&#39;#size&#39;).val()

    $.ajax({
        type: &#39;POST&#39;,
        url: &#39;/mars&#39;,
        data: { name_give:name, address_give:address, size_give:size },
        success: function (response) {
            alert(response[&#39;msg&#39;])
            window.location.reload()
        }
    });
}</code></pre><p><strong>✔️DB에 잘 들어갔는지 확인하기</strong></p>
<h3 id="4-get-연습주문-보여주기">4. GET 연습(주문 보여주기)</h3>
<p>✔️<strong>API 만들고 사용하기</strong> - 저장된 주문을 화면에 보여주기(Read→GET)</p>
<blockquote>
<p>a. 요청 정보 :  URL= /mars, 요청 방식 = GET
b. 클라(ajax) → 서버(flask) : (없음)
c. 서버(flask) → 클라(ajax) : 전체 주문을 보내주기</p>
</blockquote>
<p>✔️<strong>서버부터 만들기</strong>
받을 것 없이 orders에 주문 정보를 담아서 내려주기만 하면 된다.</p>
<h3 id="5-전체-완성-코드">5. 전체 완성 코드</h3>
<ul>
<li>코드 - 서버 app.py<pre><code>from flask import Flask, render_template, request, jsonify
app = Flask(__name__)
</code></pre></li>
</ul>
<p>from pymongo import MongoClient
client = MongoClient(&#39;내 URL&#39;)
db = client.dbsparta</p>
<p>@app.route(&#39;/&#39;)
def home():
   return render_template(&#39;index.html&#39;)</p>
<p>@app.route(&quot;/mars&quot;, methods=[&quot;POST&quot;])
def mars_post():
    name_receive = request.form[&#39;name_give&#39;]
    address_receive = request.form[&#39;address_give&#39;]
    size_receive = request.form[&#39;size_give&#39;]</p>
<pre><code>doc = {
    &#39;name&#39;: name_receive,
    &#39;address&#39;: address_receive,
    &#39;size&#39;: size_receive
}

db.orders.insert_one(doc)

return jsonify({&#39;msg&#39;: &#39;주문 완료!&#39;})</code></pre><p>@app.route(&quot;/mars&quot;, methods=[&quot;GET&quot;])
def mars_get():
    orders_list = list(db.orders.find({},{&#39;_id&#39;:False}))
    return jsonify({&#39;orders&#39;:orders_list})</p>
<p>if <strong>name</strong> == &#39;<strong>main</strong>&#39;:
   app.run(&#39;0.0.0.0&#39;, port=5000, debug=True)</p>
<pre><code>- 코드-클라이언트 index.html</code></pre><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

<pre><code>&lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;
    integrity=&quot;sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC&quot; crossorigin=&quot;anonymous&quot;&gt;
&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js&quot;
    integrity=&quot;sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM&quot;
    crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

&lt;link href=&quot;https://fonts.googleapis.com/css2?family=Gowun+Batang:wght@400;700&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;

&lt;title&gt;선착순 공동구매&lt;/title&gt;

&lt;style&gt;
    * {
        font-family: &#39;Gowun Batang&#39;, serif;
        color: white;
    }

    body {
        background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url(&#39;https://cdn.aitimes.com/news/photo/202010/132592_129694_3139.jpg&#39;);
        background-position: center;
        background-size: cover;
    }

    h1 {
        font-weight: bold;
    }

    .order {
        width: 500px;
        margin: 60px auto 0px auto;
        padding-bottom: 60px;
    }

    .mybtn {
        width: 100%;
    }

    .order &gt; table {
        margin : 40px 0;
        font-size: 18px;
    }

    option {
        color: black;
    }
&lt;/style&gt;
&lt;script&gt;
    $(document).ready(function () {
        show_order();
    });
    function show_order() {
        $(&#39;#order-box&#39;).empty()
        $.ajax({
            type: &#39;GET&#39;,
            url: &#39;/mars&#39;,
            data: {},
            success: function (response) {
                let rows = response[&#39;orders&#39;]
                for (let i = 0; i &lt; rows.length; i++) {
                    let name = rows[i][&#39;name&#39;]
                    let address = rows[i][&#39;address&#39;]
                    let size = rows[i][&#39;size&#39;]

                    let temp_html = `&lt;tr&gt;
                                        &lt;td&gt;${name}&lt;/td&gt;
                                        &lt;td&gt;${address}&lt;/td&gt;
                                        &lt;td&gt;${size}&lt;/td&gt;
                                      &lt;/tr&gt;`
                    $(&#39;#order-box&#39;).append(temp_html)
                }

            }
        });
    }
    function save_order() {
        let name = $(&#39;#name&#39;).val()
        let address = $(&#39;#address&#39;).val()
        let size = $(&#39;#size&#39;).val()

        $.ajax({
            type: &#39;POST&#39;,
            url: &#39;/mars&#39;,
            data: { name_give:name, address_give:address, size_give:size },
            success: function (response) {
                alert(response[&#39;msg&#39;])
                window.location.reload()
            }
        });
    }
&lt;/script&gt;</code></pre></head>
<body>
    <div class="mask"></div>
    <div class="order">
        <h1>화성에 땅 사놓기!</h1>
        <h3>가격: 평 당 500원</h3>
        <p>
            화성에 땅을 사둘 수 있다고?<br/>
            앞으로 백년 간 오지 않을 기회. 화성에서 즐기는 노후!
        </p>
        <div class="order-info">
            <div class="input-group mb-3">
                <span class="input-group-text">이름</span>
                <input id="name" type="text" class="form-control">
            </div>
            <div class="input-group mb-3">
                <span class="input-group-text">주소</span>
                <input id="address" type="text" class="form-control">
            </div>
            <div class="input-group mb-3">
                <label class="input-group-text" for="size">평수</label>
                <select class="form-select" id="size">
                  <option selected>-- 주문 평수 --</option>
                  <option value="10평">10평</option>
                  <option value="20평">20평</option>
                  <option value="30평">30평</option>
                  <option value="40평">40평</option>
                  <option value="50평">50평</option>
                </select>
              </div>
              <button onclick="save_order()" type="button" class="btn btn-warning mybtn">주문하기</button>
        </div>
        <table class="table">
            <thead>
              <tr>
                <th scope="col">이름</th>
                <th scope="col">주소</th>
                <th scope="col">평수</th>
              </tr>
            </thead>
            <tbody id="order-box">
              <tr>
                <td>홍길동</td>
                <td>서울시 용산구</td>
                <td>20평</td>
              </tr>
              <tr>
                <td>임꺽정</td>
                <td>부산시 동구</td>
                <td>10평</td>
              </tr>
              <tr>
                <td>세종대왕</td>
                <td>세종시 대왕구</td>
                <td>30평</td>
              </tr>
            </tbody>
          </table>
    </div>
</body>
</html>
```]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 4주차_18일(1)]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%984%EC%A3%BC%EC%B0%A8-18%EC%9D%BC1</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%984%EC%A3%BC%EC%B0%A8-18%EC%9D%BC1</guid>
            <pubDate>Sat, 07 May 2022 02:48:14 GMT</pubDate>
            <description><![CDATA[<h3 id="flask-시작하기---본격-api-만들기">Flask 시작하기 - 본격 API 만들기</h3>
<ul>
<li>들어가기 전에: GET, POST 요청타입<blockquote>
<p>❗️은행의 창구가 API와 같다는 것을 기억하시나요?
같은 예금 창구에서도 개인 고객이냐 기업 고객이냐에 따라 처리하는 것이 다른 것처럼, 클라이언트가 요청 할 때에도, &quot;방식&quot;이 존재함
HTTP 라는 통신 규약을 따른다는 거 잊지 않으셨죠? 클라이언트는 요청할 때 HTTP request method(요청 메소드)를 통해, 어떤 요청 종류인지 응답하는 서버 쪽에 정보를 알려줌</p>
</blockquote>
</li>
<li>GET, POST 방식
여러 방식(링크)이 존재하지만 우리는 가장 많이 쓰이는 GET, POST 방식에 대해 다루겠습니다. 
✔️GET→통상적으로! 데이터 조회(Read)를 요청할 때
예) 영화 목록 조회<pre><code>            →     데이터 전달 : URL 뒤에 물음표를 붙여 key=value로 전달                   →     예: google.com?q=북극곰</code></pre>✔️POST     →      통상적으로! 데이터 생성(Create), 변경(Update), 삭제(Delete) 요청 할 때<pre><code>                     예) 회원가입, 회원탈퇴, 비밀번호 수정
            →     데이터 전달 : 바로 보이지 않는 HTML body에 key:value 형태로 전달</code></pre></li>
</ul>
<h4 id="✍️-get-post-요청에서-클라이언트의-데이터를-받는-방법">✍️ GET, POST 요청에서 클라이언트의 데이터를 받는 방법</h4>
<ul>
<li>GET 요청 확인 Ajax코드<pre><code>$.ajax({
  type: &quot;GET&quot;,
  url: &quot;/test?title_give=봄날은간다&quot;,
  data: {},
  success: function(response){
     console.log(response)
  }
})</code></pre>/test라는 창구에서 title_give(=주민등록증)라는 이름으로 &#39;봄남은간다&#39;라는 데이터(=주민등록증 번호)를 내가 가지고 갈게!</li>
<li>GET 요청 API코드<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></li>
<li>POST 요청 Ajax 코드<pre><code>$.ajax({
type: &quot;POST&quot;,
url: &quot;/test&quot;,
data: { title_give:&#39;봄날은간다&#39; },
success: function(response){
console.log(response)
}
})</code></pre></li>
<li>POST 요청 API코드<pre><code>@app.route(&#39;/test&#39;, methods=[&#39;POST&#39;])
def test_post():
title_receive = request.form[&#39;title_give&#39;]
print(title_receive)
return jsonify({&#39;result&#39;:&#39;success&#39;, &#39;msg&#39;: &#39;이 요청은 POST!&#39;})</code></pre>/test라는 창구는 같은데 GET, POST에 따라 나눠짐</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 4주차_17일(2)]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%984%EC%A3%BC%EC%B0%A8-17%EC%9D%BC2</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%984%EC%A3%BC%EC%B0%A8-17%EC%9D%BC2</guid>
            <pubDate>Thu, 05 May 2022 08:37:47 GMT</pubDate>
            <description><![CDATA[<h4 id="☘️html과-mongodb까지-연동해서-서버를-만들어-보자"><strong>☘️HTML과 mongoDB까지 연동해서 서버를 만들어 보자!</strong></h4>
<p><img src="https://velog.velcdn.com/images/ddabong-dochi/post/2bb12fa3-99ee-4221-af00-1c64421aaa18/image.png" alt="">우리는 컴퓨터가 한 대니까....같은 컴퓨터에다가 서버도 만들고 요청도 할거다. 즉, 클라이언트=서버
이것을 바로 &quot;로컬 개발환경&quot;이라고 한다.</p>
<h3 id="⭐️flask-시작하기---서버만들기">⭐️Flask 시작하기 - 서버만들기</h3>
<h4 id="1-flask-기초-기본-실행">1. Flask 기초: 기본 실행</h4>
<ul>
<li>Python에서 Flask 패키지 설치하기
Flask 프레임워크: 서버를 구동시켜주는 편한 코드 모음. 서버를 구동하려면 필요한 복잡한 일들을 쉽게 가져다 쓸 수 있습니다.
(예시) 프레임워크를 쓰지 않으면 태양초를 빻아서 고추장을 만드는 격! 프레임워크는 3분 요리/소스 세트라고 생각하자.</li>
<li>app.py 파이썬 파일을 만들어 아래 코드를 붙여넣기: 이름은 아무거나 해도 상관없지만 통상적으로 flask 서버를 돌리는 파일은 app.py라고 이름 지음<pre><code># Flask 시작 코드
</code></pre></li>
</ul>
<p>from flask import Flask
app = Flask(<strong>name</strong>)</p>
<p>@app.route(&#39;/&#39;)
def home():
   return &#39;This is Home!&#39;</p>
<p>if <strong>name</strong> == &#39;<strong>main</strong>&#39;:<br>   app.run(&#39;0.0.0.0&#39;,port=5000,debug=True)</p>
<pre><code>- 이제 크롬에서 http://localhost:5000/ 으로 접속하면 화면에 This is Home!이라는 메시지가 보이게 된다.
#### 2. Flask 기초: URL 나눠보기</code></pre><p>from flask import Flask
app = Flask(<strong>name</strong>)</p>
<p>@app.route(&#39;/&#39;)
def home():
   return &#39;This is Home!&#39;</p>
<p>@app.route(&#39;/mypage&#39;)
def mypage():<br>   return &#39;This is My Page!&#39;</p>
<p>if <strong>name</strong> == &#39;<strong>main</strong>&#39;:<br>   app.run(&#39;0.0.0.0&#39;,port=5000,debug=True)</p>
<pre><code>- URL 별로 함수명이 같거나 route(&#39;/&#39;)내의 주소가 같으면 안됨

### ⭐️Flask 시작하기 - HTML 파일 주기
- 기본 폴더구조를 항상 이렇게 세팅하고 시작해야 한다.
&gt; 프로젝트 폴더 안에,
 ㄴstatic 폴더 (이미지, css파일을 넣어둡니다)
 ㄴtemplates 폴더 (html파일을 담아두고 불러옴)
 ㄴapp.py 파일
 ❗️폴더와 파일은 다르니 구별하기
 - html파일 불러오기
 Flask 내장 함수 render_template를 이용한다.
</code></pre><p>from flask import Flask, render_template
app = Flask(<strong>name</strong>)</p>
<h1 id="url-별로-함수명이-같거나">URL 별로 함수명이 같거나,</h1>
<h1 id="route-등의-주소가-같으면-안됩니다">route(&#39;/&#39;) 등의 주소가 같으면 안됩니다.</h1>
<p>@app.route(&#39;/&#39;)
def home():
   return render_template(&#39;index.html&#39;)</p>
<p>if <strong>name</strong> == &#39;<strong>main</strong>&#39;:
   app.run(&#39;0.0.0.0&#39;, port=5000, debug=True)
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 3주차_17일(1)]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%983%EC%A3%BC%EC%B0%A8-17%EC%9D%BC1</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%983%EC%A3%BC%EC%B0%A8-17%EC%9D%BC1</guid>
            <pubDate>Thu, 05 May 2022 02:53:59 GMT</pubDate>
            <description><![CDATA[<h4 id="☘️지니뮤직의-150위-곡을-스크래핑-해보자">☘️지니뮤직의 1~50위 곡을 스크래핑 해보자!</h4>
<p><img src="https://velog.velcdn.com/images/ddabong-dochi/post/528d6af7-b55e-4bd1-acf1-93c11a241c44/image.png" alt=""></p>
<ul>
<li><a href="https://www.genie.co.kr/chart/top200?ditc=M&amp;rtm=N&amp;ymd=20210701">지니뮤직 사이트</a></li>
<li>순위 / 곡 제목 / 가수를 스크래핑 해보자!</li>
<li>👻힌트<blockquote>
<p>1) 출력 할 때는 print(rank, title, artist) 사용
2) 앞에서 두 글자만 끊기! text[0:2] 를 사용하기
3) 순위와 곡제목이 깔끔하게 나오지 않을 거다. 옆에 여백이 있다던가, 다른 글씨도 나온다던가.. 파이썬 내장 함수인 strip() 구글링 해보기</p>
</blockquote>
</li>
</ul>
<h4 id="🔥-내가-작성한-코드--생각">🔥 내가 작성한 코드 &amp; 생각</h4>
<pre><code>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;https://www.genie.co.kr/chart/top200?ditc=M&amp;rtm=N&amp;ymd=20210701&#39;,headers=headers)

soup = BeautifulSoup(data.text, &#39;html.parser&#39;)

songs = soup.select(&#39;#body-content &gt; div.newest-list &gt; div &gt; table &gt; tbody &gt; tr&#39;)

for song in songs:
    rank = song.select_one(&#39;td.number&#39;).text[0:2].rstrip()
    title = song.select_one(&#39;td.info &gt; a.title.ellipsis&#39;).text.lstrip()
    artist = song.select_one(&#39;td.info &gt; a.artist.ellipsis&#39;).text

    if &quot;19금&quot; in title:
        print(rank, title.strip(&quot;19금&quot;).lstrip(), artist)
    else:
        print(rank, title, artist)</code></pre><ol>
<li>일단 크롬에 사이트 켜놓고 어떤 태그가 사용됐고, 어디까지인지 확인했다.</li>
<li>rank를 text로 가져오니 순위 외에 뒤에 &#39;20위 상승&#39; 등의 덧붙는 글자들이 있어서 text[0:2]로 삭제함</li>
<li>title과 artist는 같은 td.info에 있으나 클래스가 달라서 선택자에서 차이가 난다.</li>
<li>print할 시 여백이 매우 존재하기 때문에 rstrip, lstrip로 제거해줬다. 공백 제거하는거 같은데 r이 오른쪽이겠지</li>
</ol>
<p>❗️여기까지 해줬는데 노래 중 Justin Bieber에 Peaches가 앞에 &quot;19금&quot; 단어가 붙어서 제거해 줘야 한다.</p>
<p>이거 하나만 그런 거라서 text[]로 해보자니 안 될 것 같아서 if 문을 써봤다. title 내에 &quot;19금&quot; 글자가 있으면 제거 하고 공백을 조정하라는...일단 요기까지 내가 해봤는데 잘 된다.</p>
<p><strong>과연 숙제 답안 코드로 올라온 것과 차이가 얼마나 날까?</strong>
✔️ 3주차 숙제 답안 코드</p>
<pre><code>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;https://www.genie.co.kr/chart/top200?ditc=M&amp;rtm=N&amp;ymd=20210701&#39;,headers=headers)

soup = BeautifulSoup(data.text, &#39;html.parser&#39;)

trs = soup.select(&#39;#body-content &gt; div.newest-list &gt; div &gt; table &gt; tbody &gt; tr&#39;)

for tr in trs:
    title = tr.select_one(&#39;td.info &gt; a.title.ellipsis&#39;).text.strip()
    rank = tr.select_one(&#39;td.number&#39;).text[0:2].strip()
    artist = tr.select_one(&#39;td.info &gt; a.artist.ellipsis&#39;).text
    print(rank, title, artist)</code></pre><p>이때는 peaches가 없었나; 별 다른 내용이 없네
곡 순위 리스트 중에 제일 좋아하는 노래로 머리를 쓴 게 아이러니🫠</p>
<h4 id="웹개발-종합반-3주차-소감💕">웹개발 종합반 3주차 소감💕</h4>
<p>파이썬 패키지를 통한 크롤링과 mongoDB 연결을 배웠다. 1~2주차가 프론트엔드라고 하면 3주차는 백엔드인건가? 구분이 맞나? 암튼 4주차부터 2개가 합쳐진다는데 어떻게 연결하고 진행되는지 궁금하다!
암튼 여기까지는 할만했음😙</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 3주차_16일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A816%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A816%EC%9D%BC</guid>
            <pubDate>Tue, 03 May 2022 13:30:28 GMT</pubDate>
            <description><![CDATA[<h4 id="1-웹스크래핑-결과-저장하기-결과를-db에-저장">1. 웹스크래핑 결과 저장하기 (결과를 DB에 저장)</h4>
<ul>
<li>네이버 영화에서 순위, 영화 제목, 평점을 가져와 DB에 저장해 보자.<pre><code>import requests
from bs4 import BeautifulSoup
</code></pre></li>
</ul>
<p>from pymongo import MongoClient
client = MongoClient(&#39;mongodb+srv://test:<a href="mailto:sparta@cluster0.55vah.mongodb.net">sparta@cluster0.55vah.mongodb.net</a>/Cluster0?retryWrites=true&amp;w=majority&#39;)
db = client.dbsparta</p>
<h1 id="url을-읽어서-html를-받아오고">URL을 읽어서 HTML를 받아오고,</h1>
<p>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.naver?sel=pnt&amp;date=20210829&#39;,headers=headers">https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&amp;date=20210829&#39;,headers=headers</a>)</p>
<h1 id="html을-beautifulsoup이라는-라이브러리를-활용해-검색하기-용이한-상태로-만듦">HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦</h1>
<p>soup = BeautifulSoup(data.text, &#39;html.parser&#39;)</p>
<h1 id="select를-이용해서-tr들을-불러오기">select를 이용해서, tr들을 불러오기</h1>
<p>movies = soup.select(&#39;#old_content &gt; table &gt; tbody &gt; tr&#39;)</p>
<h1 id="movies-tr들-의-반복문을-돌리기">movies (tr들) 의 반복문을 돌리기</h1>
<p>for movie in movies:
    # movie 안에 a 가 있으면,
    a_tag = movie.select_one(&#39;td.title &gt; div &gt; a&#39;)
    if a_tag is not None:
        rank = movie.select_one(&#39;td:nth-child(1) &gt; img&#39;)[&#39;alt&#39;] # img 태그의 alt 속성값을 가져오기
        title = a_tag.text                                      # a 태그 사이의 텍스트를 가져오기
        star = movie.select_one(&#39;td.point&#39;).text                # td 태그 사이의 텍스트를 가져오기
        print(rank,title,star)</p>
<pre><code>
#### 2. (연습_Quiz) 웹스크래핑 결과 이용하기
** (1) 영화제목 &#39;가버나움&#39;의 평점을 가져오기**
 ✍️내가 써 본 코드</code></pre><p>from pymongo import MongoClient
client = MongoClient(&#39;mongodb+srv://test:<a href="mailto:sparta@cluster0.wu00c.mongodb.net">sparta@cluster0.wu00c.mongodb.net</a>/Cluster0?retryWrites=true&amp;w=majority&#39;)
db = client.dbsparta</p>
<p>movie = db.movies.find_one({&#39;title&#39;:&#39;가버나움&#39;})
print(movie[&#39;score&#39;])</p>
<pre><code>DB에서 pymongo로 찾는건데 논점 파악 못 하고 bs4로 찾고 있었네...🥹

** (2) &#39;가버나움&#39;의 평점과 같은 평점의 영화 제목들을 가져오기**
 ✍️내가 써 본 코드</code></pre><p>from pymongo import MongoClient
client = MongoClient(&#39;mongodb+srv://test:<a href="mailto:sparta@cluster0.wu00c.mongodb.net">sparta@cluster0.wu00c.mongodb.net</a>/Cluster0?retryWrites=true&amp;w=majority&#39;)
db = client.dbsparta</p>
<p>all_movies = list(db.movies.find({},{&#39;_id&#39;:False}))
gover = db.movies.find_one({&#39;title&#39;: &#39;가버나움&#39;})[&#39;score&#39;]</p>
<p>for movie in all_movies:
    if gover == movie[&#39;score&#39;]:
        print(movie[&#39;title&#39;])</p>
<pre><code>나는 가버나움의 평점을 변수 gover로 지정하고 for 문 안에서 만약 저 평점과 같은게 있으면 title을 찾아내! 이렇게 썼다.
_🔥아래는 완성 코드로 제시된 코드_</code></pre><p>target_movie = db.movies.find_one({&#39;title&#39;:&#39;가버나움&#39;})
target_star = target_movie[&#39;star&#39;]</p>
<p>movies = list(db.movies.find({&#39;star&#39;:target_star}))</p>
<p>for movie in movies:
    print(movie[&#39;title&#39;])</p>
<pre><code>완성 코드는 내가 해석한 바에 따르면 아예 if문 그런거 없이 가버나움의 평점과 같은 평점을 변수로 아예 지정한 것 같다.

** (3) &#39;가버나움&#39; 영화의 평점을 0으로 만들기**
 ✍️내가 써 본 코드</code></pre><p>from pymongo import MongoClient
client = MongoClient(&#39;mongodb+srv://test:<a href="mailto:sparta@cluster0.wu00c.mongodb.net">sparta@cluster0.wu00c.mongodb.net</a>/Cluster0?retryWrites=true&amp;w=majority&#39;)
db = client.dbsparta</p>
<p>db.movies.update_one({&#39;title&#39;: &#39;가버나움&#39;}, {&#39;$set&#39;: {&#39;score&#39;: 0}})</p>
<p>```
오 쉽다 이러고 바로 바꿨는데 영상 보니 주의할점! 이러면서 바꿀 부분을 설명해주네;; 저렇게 쓰면 score가 0으로 입력되어서 &#39;숫자&#39;로 입력된다.
❗️그런데 데이터 저장된 거 보면
<img src="https://velog.velcdn.com/images/ddabong-dochi/post/b2119063-3458-4f47-8a98-cc8efdd126e4/image.png" alt="">
따옴표 있고 <em><strong>모두 &#39;문자열&#39;로 저장되어져 있다.</strong></em> 그러니까 우리도 문자열로 저장하기!!</p>
<h4 id="짤막-16일차-후기">짤막 16일차 후기</h4>
<p>퇴근하고 공부하다가 중간에 밖에서 밥 먹고 다시 와서 하자니 벌써 10시 30분...이 됐다. 그래도 안 빠뜨리고 하루에 조금씩 공부하다니! 대단해😎...그런데 오늘 퀴즈 영상은 5분짜리인데 나는 한 20~30분 한 듯...분발하자</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 3주차_15일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A815%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A815%EC%9D%BC</guid>
            <pubDate>Mon, 02 May 2022 11:37:48 GMT</pubDate>
            <description><![CDATA[<h4 id="1-mongodb-연결하기">1. mongoDB 연결하기</h4>
<ul>
<li>pymongo : mongoDB라는 프로그램을 파이썬 내에서 조작하려면 설치가 필요한 라이브러리</li>
<li>패키지 설치 2개 : pymongo, dnspython</li>
<li>pymongo로 조작하기(기본 코드)<pre><code>from pymongo import MongoClient
client = MongoClient(&#39;여기에 URL 입력&#39;)
db = client.dbsparta</code></pre>❗️&#39;여기에 URL 입력&#39; 은 어떤 URL이냐면 아래 mongoDB 화면에서 가져와야 한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/ddabong-dochi/post/f8a71994-a758-4595-ba2f-8055f221a363/image.png" alt=""></p>
<ul>
<li>mongoDB Atlas 화면에서 Connect your application 클릭 (Driver: python, Version: 3.6 or later</li>
<li>이미지에 적힌 code 내용 중 myFirstDatabase 이 부분은 이미지 상단에 적힌 &#39;Connet to Cluster0&#39; 중 Cluster0으로 변경</li>
</ul>
<p><strong>🔥아래 코드를 입력해서 데이터를 넣어보자!</strong></p>
<pre><code>doc = {
    &#39;name&#39;:&#39;bob&#39;,
    &#39;age&#39;:27
}

db.users.insert_one(doc)</code></pre><p>그럼 이 데이터는 <em>어디에 어떻게</em> 저장되는 것일까?
<img src="https://velog.velcdn.com/images/ddabong-dochi/post/bb4101da-9728-4fb7-8724-297d4b8367f9/image.png" alt=""><img src="https://velog.velcdn.com/images/ddabong-dochi/post/a0745cb6-bd7d-4300-b5ee-b186fc030c0a/image.png" alt=""></p>
<p><em>왼쪽에 있는 저 users는 뭘까?</em>
db.users.insert_one(doc)
위의 코드 작성할 때 적은 부분이다. 컬렉션이라고 부른다. 아무리 데이터를 막 집어 넣을 수 있다고 하더라도 좀 비슷한 애들끼리 모아놓아야 되지 않겠습니까!</p>
<h4 id="2-pymongo로-db-조작하기">2. pymongo로 DB 조작하기</h4>
<pre><code>db.users.update_one({&#39;name&#39;:&#39;bobby&#39;},{&#39;$set&#39;:{&#39;age&#39;:19}})</code></pre><ul>
<li>users라는 데에 가서 업데이트를 하는데 조건이 뭐냐면 name이 bobby인 애를 찾아 가지고 age를 19로 만들어라!</li>
</ul>
<p><strong>☘️ pymongo 코드 요약</strong></p>
<pre><code># 저장 - 예시
doc = {&#39;name&#39;:&#39;bobby&#39;,&#39;age&#39;:21}
db.users.insert_one(doc)

# 한 개 찾기 - 예시
user = db.users.find_one({&#39;name&#39;:&#39;bobby&#39;})

# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{&#39;_id&#39;:False}))
    # for user in all_users :
    #     print(user)

# 바꾸기 - 예시
db.users.update_one({&#39;name&#39;:&#39;bobby&#39;},{&#39;$set&#39;:{&#39;age&#39;:19}})

# 지우기 - 예시
db.users.delete_one({&#39;name&#39;:&#39;bobby&#39;})</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 3주차_14일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A814%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A814%EC%9D%BC</guid>
            <pubDate>Sun, 01 May 2022 11:13:43 GMT</pubDate>
            <description><![CDATA[<h3 id="db개괄">DB개괄</h3>
<h4 id="1-db는-왜-쓰는-것일까">1. DB는 왜 쓰는 것일까?</h4>
<p>= 우리가 방 정리를 하는 이유는 무엇일까?
🔥<strong>바로 나중에 잘 찾기 위해서. 잘 뽑아 쓰기 위해서</strong>
❗️교보문고에 가서 책을 찾는다고 하면?
꽂혀진 방법대로 찾아야 쉽게 찾을 수 있음(섹션→출판사→책제목)
우리 눈에 보이진 않지만 사실 DB에는 Index라는 순서로 데이터들이 정렬되어 있음</p>
<h4 id="2-db의-두-가지-종류">2. DB의 두 가지 종류</h4>
<p><img src="https://velog.velcdn.com/images/ddabong-dochi/post/01f59111-e2d3-42d9-924f-3d58aacdfe03/image.png" alt=""></p>
<ul>
<li><p>RDBMS(SQL)</p>
<blockquote>
<p>행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사함. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것임. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이함
❗️초기 스타트업 같은 경우는 회사의 아직 체계도 안 잡혀 있고 성장해 나가는 시기이기에 그럴 때마다 유연하게 대처가 어려울 수 있음. 중간 중간에 수정하기가 어려우니까!
ex) MS-SQL, My-SQL 등</p>
</blockquote>
</li>
<li><p>No-SQL</p>
<blockquote>
<p>딕셔너리 형태로 데이터를 저장해두는 DB. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됨. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족함.
ex) MongoDB</p>
</blockquote>
</li>
</ul>
<h4 id="3-db의-실체에-관하여">3. DB의 실체에 관하여</h4>
<p><strong>✍️ DB는 무엇일까? 특별한 컴퓨터인가?</strong>
간단하게 말하면 우리가 쓰는 프로그램과 같은 것. 데이터를 잘 쌓고 잘 가져오는 그런 프로그램. 그런데 요새는 클라우드 형태로 제공해주는 곳들이 많음(요새 트렌드임)
유저가 몰리거나 / DB를 백업해야 하거나 / 모니터링 하기가 아주 용이하기 때문!</p>
<h4 id="4-mongodb-시작하기">4. MongoDB 시작하기</h4>
<ul>
<li><a href="https://account.mongodb.com/account/register">가입하기</a> : 구글로 로그인하고 Accept Privacy..Service에 체크→Submit</li>
<li>preferred language로 Python 선택</li>
<li>Shared를 클릭하고 넘어가기</li>
<li><em>- 연결 준비하기*</em>
1) Allow Access from Anywhere 클릭 → Add IP address 클릭
2) Username, Password를 아래와 같이 입력 → Create Database User 클릭
3) Choose a connection method 클릭</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 3주차_13일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A813%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A813%EC%9D%BC</guid>
            <pubDate>Sat, 30 Apr 2022 05:37:53 GMT</pubDate>
            <description><![CDATA[<h4 id="1-웹스크래핑크롤링-해보기-영화-제목">1. 웹스크래핑(크롤링) 해보기-영화 제목</h4>
<ul>
<li><p><a href="https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&amp;date=20210829">어떤 걸 스크래핑 할 건지?</a>
패키지 추가 설치하기 : bs4 (beautifulsoap4)</p>
<blockquote>
<p>크롤링을 하려면 2가지 일을 해야 되는데 첫번째는 요청해서 해당 html을 가져오는거(그거는 request 라이브러리로 해결), 두번째는 그 안에서 영화 제목을 찾는 거(이게 bs4가 도와줄 부분)</p>
</blockquote>
</li>
<li><p><strong>크롤링 기본 세팅</strong></p>
<pre><code>import requests
from bs4 import BeautifulSoup
</code></pre></li>
</ul>
<h1 id="타겟-url을-읽어서-html를-받아오고">타겟 URL을 읽어서 HTML를 받아오고,</h1>
<p>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.naver?sel=pnt&amp;date=20210829&#39;,headers=headers">https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&amp;date=20210829&#39;,headers=headers</a>)</p>
<h1 id="html을-beautifulsoup이라는-라이브러리를-활용해-검색하기-용이한-상태로-만듦">HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦</h1>
<h1 id="soup이라는-변수에-파싱-용이해진-html이-담긴-상태가-됨">soup이라는 변수에 &quot;파싱 용이해진 html&quot;이 담긴 상태가 됨</h1>
<h1 id="이제-코딩을-통해-필요한-부분을-추출하면-된다">이제 코딩을 통해 필요한 부분을 추출하면 된다.</h1>
<p>soup = BeautifulSoup(data.text, &#39;html.parser&#39;)</p>
<p>#############################</p>
<h1 id="입맛에-맞게-코딩">(입맛에 맞게 코딩)</h1>
<p>#############################</p>
<pre><code>headers는 우리가 코드에서 콜을 날리는데 그게 마치 우리가 브라우저에서 콜을 날린 것처럼, 사람인 것 처럼 해주려고 쓰는 것.
✔️url만 필요할 때마다 바꿔서 사용한다.

#### 2. beautifulsoup을 사용하는 방법
- 태그 안의 텍스트를 찍고 싶을 때 → 태그.text
태그 안의 속성을 찍고 싶을 때 → 태그[&#39;속성&#39;]</code></pre><h1 id="선택자를-사용하는-방법-copy-selector">선택자를 사용하는 방법 (copy selector)</h1>
<p>soup.select(&#39;태그명&#39;)
soup.select(&#39;.클래스명&#39;)
soup.select(&#39;#아이디명&#39;)</p>
<p>soup.select(&#39;상위태그명 &gt; 하위태그명 &gt; 하위태그명&#39;)
soup.select(&#39;상위태그명.클래스명 &gt; 하위태그명.클래스명&#39;)</p>
<h1 id="태그와-속성값으로-찾는-방법">태그와 속성값으로 찾는 방법</h1>
<p>soup.select(&#39;태그명[속성=&quot;값&quot;]&#39;)</p>
<h1 id="한-개만-가져오고-싶은-경우">한 개만 가져오고 싶은 경우</h1>
<p>soup.select_one(&#39;위와 동일&#39;)</p>
<pre><code>- chrome에서 영화 제목 부분에 오른쪽 버튼-검사-해당 부분 오른쪽 버튼-Copy &gt; Copy selector (선택자 복사)
&gt; 그린북☘️ : #old_content &gt; table &gt; tbody &gt; tr:nth-child(3) &gt; td.title &gt; div &gt; a
가버나움👊 : #old_content &gt; table &gt; tbody &gt; tr:nth-child(4) &gt; td.title &gt; div &gt; a

아하! 둘의 Copy selector에서 어떤 부분은 같고 어디는 다르구나!
- ![](https://velog.velcdn.com/images/ddabong-dochi/post/86fe2aaf-9ffd-43e4-b5d6-5505bf846347/image.png)
</code></pre><p>import requests
from bs4 import BeautifulSoup</p>
<h1 id="url을-읽어서-html를-받아오고">URL을 읽어서 HTML를 받아오고,</h1>
<p>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.naver?sel=pnt&amp;date=20210829&#39;,headers=headers">https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&amp;date=20210829&#39;,headers=headers</a>)</p>
<h1 id="html을-beautifulsoup이라는-라이브러리를-활용해-검색하기-용이한-상태로-만듦-1">HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦</h1>
<p>soup = BeautifulSoup(data.text, &#39;html.parser&#39;)</p>
<h1 id="select를-이용해서-tr들을-불러오기">select를 이용해서, tr들을 불러오기</h1>
<p>movies = soup.select(&#39;#old_content &gt; table &gt; tbody &gt; tr&#39;)</p>
<h1 id="movies-tr들-의-반복문을-돌리기">movies (tr들) 의 반복문을 돌리기</h1>
<p>for movie in movies:
    # movie 안에 a 가 있으면,
    a_tag = movie.select_one(&#39;td.title &gt; div &gt; a&#39;)
    if a_tag is not None:
        # a의 text를 찍어본다.
        print (a_tag.text)</p>
<pre><code>#### 3. (연습) 웹스크래핑 더 해보기 (순위, 제목, 별점)
**😘 아래와 같이 보이면 완성!**
![](https://velog.velcdn.com/images/ddabong-dochi/post/e9628c74-1cd7-4b3e-beef-0ab260a2df95/image.png)
**✍️ 바로 영상 보지 않고 혼자 해보기**
- 스스로 해본 코드다. 하다가 어려웠던 부분이 img 태그에서 alt 속성만 나타내기.</code></pre><p>import requests
from bs4 import BeautifulSoup</p>
<p>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.naver?sel=pnt&amp;date=20210829&#39;,headers=headers">https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&amp;date=20210829&#39;,headers=headers</a>)</p>
<p>soup = BeautifulSoup(data.text, &#39;html.parser&#39;)</p>
<p>movies = soup.select(&#39;#old_content &gt; table &gt; tbody &gt; tr&#39;)</p>
<p>for movie in movies :
    rank = movie.select_one(&#39;img&#39;)
    title = movie.select_one(&#39;td.title &gt; div &gt; a&#39;)
    score = movie.select_one(&#39;td.point&#39;)</p>
<pre><code># 중간에 영화제목 구분선으로 &#39;가로선&#39;이 있어서 none으로 나오기 때문에 if문을 한번 거침
if rank != None :
    print(rank[&#39;alt&#39;], title.text,score.text)</code></pre><p>```
위 코드 중에서 img로만 선택자 했는데 그거 보다는     rank = movie.select_one(&#39;td:nth-child(1) &gt; img&#39;) 이렇게 하는게 더 정확한 것 같다.(Copy selector 사용)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 3주차_12일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A812%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A812%EC%9D%BC</guid>
            <pubDate>Fri, 29 Apr 2022 12:15:11 GMT</pubDate>
            <description><![CDATA[<h4 id="1-파이썬-기초-문법">1. 파이썬 기초 문법</h4>
<ul>
<li>변수&amp;기본연산</li>
<li>자료형<pre><code>is_number = True # True 또는 False -&gt; &quot;Boolean&quot;형이 들어갈 수도 있습니다.
</code></pre></li>
</ul>
<p>a_list = []
a_list.append(1)     # 리스트에 값을 넣는다
a_list.append([2,3]) # 리스트에 [2,3]이라는 리스트를 다시 넣는다</p>
<h1 id="a_list의-값은-123">a_list의 값은? [1,[2,3]]</h1>
<h1 id="a_list0의-값은-1">a_list[0]의 값은? 1</h1>
<h1 id="a_list1의-값은-23">a_list[1]의 값은? [2,3]</h1>
<h1 id="a_list10의-값은-2">a_list[1][0]의 값은? 2</h1>
<p>a_dict = {}
a_dict = {&#39;name&#39;:&#39;bob&#39;,&#39;age&#39;:21}
a_dict[&#39;height&#39;] = 178</p>
<p>people = [{&#39;name&#39;:&#39;bob&#39;,&#39;age&#39;:20},{&#39;name&#39;:&#39;carry&#39;,&#39;age&#39;:38}]</p>
<h1 id="people0name의-값은-bob">people[0][&#39;name&#39;]의 값은? &#39;bob&#39;</h1>
<h1 id="people1name의-값은-carry">people[1][&#39;name&#39;]의 값은? &#39;carry&#39;</h1>
<pre><code>- 함수 : 이름은 마음대로 정할 수 있음!</code></pre><h1 id="수학문제에서">수학문제에서</h1>
<p>f(x) = 2*x+3
y = f(2)
y의 값은? 7</p>
<h1 id="참고-자바스크립트에서는">참고: 자바스크립트에서는</h1>
<p>function f(x) {
    return 2*x+3
}</p>
<h1 id="파이썬에서">파이썬에서</h1>
<p>def f(x):
    return 2*x+3</p>
<p>y = f(2)
y의 값은? 7</p>
<pre><code>- 조건문 : if/else로 구성!</code></pre><p>def is_adult(age):
    if age &gt; 20:
        print(&#39;성인입니다&#39;)    # 조건이 참이면 성인입니다를 출력
    else:
        print(&#39;청소년이에요&#39;)  # 조건이 거짓이면 청소년이에요를 출력</p>
<p>is_adult(30)</p>
<h1 id="무엇이-출력될까요">무엇이 출력될까요?</h1>
<pre><code>- 반복문 : 파이썬에서의 반복문은, 리스트의 요소들을 하나씩 꺼내쓰는 형태</code></pre><p>fruits = [&#39;사과&#39;,&#39;배&#39;,&#39;배&#39;,&#39;감&#39;,&#39;수박&#39;,&#39;귤&#39;,&#39;딸기&#39;,&#39;사과&#39;,&#39;배&#39;,&#39;수박&#39;]</p>
<p>count = 0
for fruit in fruits:
    if fruit == &#39;사과&#39;:
        count += 1</p>
<p>print(count)</p>
<h1 id="사과의-갯수를-세어-보여줍니다">사과의 갯수를 세어 보여줍니다.</h1>
<pre><code>
#### 2. 파이썬 크롤링하기
- 파이썬 패키지 설치하기
&gt; ✔️ 남들이 만들어 놓은 라이브러리를 사용해야 하며, 이걸 패키지라고 부름(일종의 기능 묶음)
✔️ 가상환경(virtual environmenet)란? 프로젝트별로 패키지들을 담을 공구함. 라이브러리를 모아두는 곳!
✔️ 패키지 설치 = 외부 라이브러리 설치
- requests 라이브러리 설치하기(일종의 Ajax 같은 역할을 함)
&gt; 파이참 - 파일 - 설정에서 project interpreter 화면에서 + 버튼을 눌러 패키지 설치하기

#### 3. 파이썬 requests 패키지 써보기
- 미세먼지 OpenAPI로 60 이상인 구와 수치 나타내기(확실히 Ajax 때 썼던 것보다 쉬움)</code></pre><p>import requests # requests 라이브러리 설치 필요</p>
<p>r = requests.get(&#39;<a href="http://spartacodingclub.shop/sparta_api/seoulair&#39;">http://spartacodingclub.shop/sparta_api/seoulair&#39;</a>)
rjson = r.json()</p>
<p>rows = rjson[&#39;RealtimeCityAir&#39;][&#39;row&#39;]</p>
<p>for row in rows:
    gu_name=row[&#39;MSRSTE_NM&#39;]
    gu_mise=row[&#39;IDEX_MVL&#39;]</p>
<pre><code>if gu_mise &lt; 50 :
    print(gu_name, gu_mise)</code></pre><pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 3주차_11일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A811%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-3%EC%A3%BC%EC%B0%A811%EC%9D%BC</guid>
            <pubDate>Thu, 28 Apr 2022 12:34:35 GMT</pubDate>
            <description><![CDATA[<p>🔥<a href="http://spartacodingclub.shop/web/movie">3주차 시작 전 연습 겸 복습-스파르타피디아에 OpenAPI 붙여보기</a></p>
<ul>
<li>javascript 로딩 후 바로 실행<pre><code>$(document).ready(function(){
  listing();
});
</code></pre></li>
</ul>
<p>function listing() {
    console.log(&#39;화면 로딩 후 잘 실행되었습니다&#39;);
}</p>
<p>```</p>
<ul>
<li>API 데이터를 각각 가져오는 변수까지는 만들었는데 그 이후부터 카드에 어떻게 적용할 지를 잘 모르겠다. 현재 막힌 부분임. (1)div 태그 어디에 id 선택자를 넣어 지정할 지 이 부분이 ?? 상태 (2)받아오는 숫자 데이터에 따라 별을 표시해야 하는데 어떻게 할 지.<blockquote>
<p>✍️ 위 질문에 관한 고찰 사항
(1) div 태그가 어디 범위를 나타내고 있는지 console로 확인하고 선택자를 지정하는게 좋을 것 같다.
(2) let star = rows[i][&#39;star&#39;]
star 변수를 만들어 데이터 값을 받아온 후
let star_image = &#39;⭐️&#39;.repeat(star)
위 처럼 image 관련 변수를 생성하여 처리함.</p>
</blockquote>
</li>
<li>아래 사진은 &#39;스파르타피디아&#39; 화면에서 div 보는 모습이다.
<img src="https://velog.velcdn.com/images/ddabong-dochi/post/d4d89569-1712-4d2b-86fd-a94c2617386d/image.png" alt=""></li>
</ul>
<p><strong>👉 파이썬을 설치한다는 것의 의미</strong>
일종의 번역팩을 설치한다고 생각하면 된다. 컴퓨터는 101010001과 같은 언어만 알아듣는다고 했지? 파이썬 문법으로 된 것을 101010001로 변환해줄 수 있도록, 번역 패키지를 설치하는 것.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 2주차_10일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-2%EC%A3%BC%EC%B0%A810%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-2%EC%A3%BC%EC%B0%A810%EC%9D%BC</guid>
            <pubDate>Wed, 27 Apr 2022 12:19:21 GMT</pubDate>
            <description><![CDATA[<h2 id="🔥팬명록에-날씨-정보-추가하기">🔥팬명록에 날씨 정보 추가하기</h2>
<ul>
<li>웹개발 종합반 2주차 숙제를 마무리하며 복습의 시간으로 배운 것 정리 및 궁금한 점 기록하기<pre><code>&lt;!doctype html&gt;
&lt;html lang=&quot;en&quot;&gt;
</code></pre></li>
</ul>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<pre><code>&lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;
integrity=&quot;sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC&quot; crossorigin=&quot;anonymous&quot;&gt;
&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js&quot;
integrity=&quot;sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM&quot;
crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

&lt;title&gt;국내가수 팬명록 전문 사이트&lt;/title&gt;
&lt;link href=&quot;https://fonts.googleapis.com/css2?family=Nanum+Myeongjo&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;

&lt;style&gt;
    * {
        font-family: &#39;Nanum Myeongjo&#39;, serif;
    }
    .mytitle {
        height: 250px;
        width: 100%;
        background-image : linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url(&quot;http://thepublic.kr/news/data/20211211/p1065572405381876_990_thum.jpg&quot;);
        background-position: center 10%;
        background-size: cover;

        color: white;

        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
    }
    .mypost {
        max-width: 500px;
        width: 95%;
        margin: 20px auto 0px auto;
        box-shadow: 0px 0px 3px 0px gray;
        padding: 20px;
    }
    .last-button {
        margin-top: 15px;
    }
    .card{
        max-width: 500px;
        width: 95%;
        margin: 20px auto 0px auto;
    }
&lt;/style&gt;
&lt;script&gt;
    $(document).ready(function () {
        $.ajax({
            type: &quot;GET&quot;,
            url: &quot;http://spartacodingclub.shop/sparta_api/weather/seoul&quot;,
            data: {},
            success: function (response) {
                let temp = response[&#39;temp&#39;]
                $(&#39;#temp&#39;).text(temp);
            }
        })
    });
&lt;/script&gt;</code></pre></head>

<body>
    <div class="mytitle">
        <h1>십센치(10cm) 팬명록</h1>
        <p>현재기온 : <span id="temp">00.0</span>도</p>
    </div>
    <div class="mypost">
        <div class="form-floating mb-3">
            <input type="email" class="form-control" id="floatingInput" placeholder="name@example.com">
            <label for="floatingInput">닉네임</label>
        </div>
        <div class="form-floating">
            <textarea class="form-control" placeholder="Leave a comment here" id="floatingTextarea2" style="height: 100px"></textarea>
            <label for="floatingTextarea2">응원댓글</label>
        </div>
        <div class="last-button">
            <button type="button" class="btn btn-dark">응원 남기기</button>
        </div>
    </div>
    <div class="card">
        <div class="card-body">
            <blockquote class="blockquote mb-0">
                <p>새로운 앨범 너무 멋져요!</p>
                <footer class="blockquote-footer">호빵맨<cite title="Source Title"></cite>
                </footer>
            </blockquote>
        </div>
    </div>
    <div class="card">
        <div class="card-body">
            <blockquote class="blockquote mb-0">
                <p>새로운 앨범 너무 멋져요!</p>
                <footer class="blockquote-footer">호빵맨<cite title="Source Title"></cite>
                </footer>
            </blockquote>
        </div>
    </div>
    <div class="card">
        <div class="card-body">
            <blockquote class="blockquote mb-0">
                <p>새로운 앨범 너무 멋져요!</p>
                <footer class="blockquote-footer">호빵맨<cite title="Source Title"></cite>
                </footer>
            </blockquote>
        </div>
    </div>
</body>

</html>
```
> **1 . HTML : 뼈대**
**2. CSS : 꾸미기**
    - head>style 에서 사용
    - 선택자 : class로 꾸미기 적용
    - [bootstrap](https://getbootstrap.com/docs/5.0/getting-started/introduction/) : 예쁜 CSS 꾸러미. (❗️준비)Gettig started에서 CSS, Bundle 복사해서 head 태그 내 붙여 넣기
**3. Javascript : 브라우저가 알아들을 수 있는 언어**
    - [jQuery](https://www.w3schools.com/jquery/jquery_get_started.asp) : 편리한 Javascript를 미리 작성해둔 것. 라이브러리! 전문 개발자들이 짜둔 코드를 잘 가져와서 사용하는 것이기에 '임포트'해야 함 (❗️준비)Google CDN에서 복사 후 head 태그 내 붙여 넣기. jQuery에서는 선택자로 id 사용.
    - [Ajax](https://devyj.tistory.com/1) (1) Javascript를 이용해 서버와 브라우저가 비동기 방식으로 데이터를 교환할 수 있는 통신 기능. 전체 페이지를 새로 고지지 않고도 페이지의 일부만을 위한 데이터를 로드하는 기법 (2) jQuery를 임포트한 페이지에서만 동작 가능

<p><strong>☘️Ajax 기본 골격</strong></p>
<pre><code>$.ajax({
  type: &quot;GET&quot;,
  url: &quot;여기에URL을입력&quot;,
  data: {},
  success: function(response){
    console.log(response)
  }
})</code></pre><p>✍️** <a href="https://blog.naver.com/ouo_hy/222681697892">위 코드 중 &quot;현재 기온&quot; 글자에서 사용된 span 태그는 무엇일까?</a>**
div, p 태그는 block level element고, span 태그는 inline level elemenet이다. p 태그는 문단을 이뤄서 줄바꿈+문단을 이루는 줄이 통째로 선택된다. span 태그는 설정한 span 태그마다 다른 기능을 지정해 줄 수 있다.</p>
<h2 id="💕-웹개발-종합반-2주차-마무리-후기">💕 웹개발 종합반 2주차 마무리 후기</h2>
<p>현재까지는 코딩이 매우 재밌다! 쉬운 것만 해서 그런지 아직까지는 흥미있게 하고 있음. 항상 코딩 공부하면서 이걸 다 외워야 하나, 다 이해해야 하나 하는 생각이 있어서 &#39;완벽&#39;을 추구했다. 막상 영상 보니 정리만 잘 해둔 후 가져다만 쓰면 OK인 것 같다. 짜깁기는 또 내가 잘 하지..😎
html, css, bootstrap 등 개념 정리하며 복습 마무리 끝!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹개발 종합반 2주차_9일]]></title>
            <link>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-2%EC%A3%BC%EC%B0%A89%EC%9D%BC</link>
            <guid>https://velog.io/@ddabong-dochi/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EC%A2%85%ED%95%A9%EB%B0%98-2%EC%A3%BC%EC%B0%A89%EC%9D%BC</guid>
            <pubDate>Tue, 26 Apr 2022 12:08:38 GMT</pubDate>
            <description><![CDATA[<h4 id="1-✍️서울시-openapi실시간-따릉이-현황을-이용하기">1. ✍️서울시 OpenAPI(실시간 따릉이 현황)을 이용하기</h4>
<ul>
<li><a href="http://spartacodingclub.shop/ajaxquiz/02_1">Ajax 퀴즈(1)</a> 실시간 따릉이 현황 업데이트</li>
<li><a href="http://spartacodingclub.shop/ajaxquiz/02_2">Ajax 퀴즈(2) </a>따릉이 대수가 5대 미만인 곳은 빨갛게 표시하자!<pre><code>&lt;!doctype html&gt;
&lt;html lang=&quot;ko&quot;&gt;
</code></pre></li>
</ul>
<head>
    <meta charset="UTF-8">
    <title>jQuery 연습하고 가기!</title>
    <!-- jQuery를 import 합니다 -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<pre><code>&lt;style type=&quot;text/css&quot;&gt;
    div.question-box {
        margin: 10px 0 20px 0;
    }

    table {
        border: 1px solid;
        border-collapse: collapse;
    }

    td,
    th {
        padding: 10px;
        border: 1px solid;
    }

    .urgent {
        color: red;
        font-weight: bold;
    }
&lt;/style&gt;

&lt;script&gt;
    function q1() {
        $(&#39;#names-q1&#39;).empty();
        $.ajax({
            type: &quot;GET&quot;,
            url: &quot;http://spartacodingclub.shop/sparta_api/seoulbike&quot;,
            data: {},
            success: function (response) {
                let rows = response[&quot;getStationList&quot;][&quot;row&quot;];
                for (let i = 0; i &lt; rows.length; i++) {
                    let rack_name = rows[i][&#39;stationName&#39;];
                    let rack_cnt = rows[i][&#39;rackTotCnt&#39;];
                    let bike_cnt = rows[i][&#39;parkingBikeTotCnt&#39;];
                    let temp_html = &#39;&#39;;
                    if (bike_cnt &lt; 5) {
                        temp_html = `&lt;tr class=&quot;urgent&quot;&gt;
                            &lt;td&gt;${rack_name}&lt;/td&gt;
                            &lt;td&gt;${rack_cnt}&lt;/td&gt;
                            &lt;td&gt;${bike_cnt}&lt;/td&gt;
                          &lt;/tr&gt;`
                    } else {
                        temp_html = `&lt;tr&gt;
                            &lt;td&gt;${rack_name}&lt;/td&gt;
                            &lt;td&gt;${rack_cnt}&lt;/td&gt;
                            &lt;td&gt;${bike_cnt}&lt;/td&gt;
                          &lt;/tr&gt;`
                    }
                    $(&#39;#names-q1&#39;).append(temp_html);
                }
            }
        })
    }
&lt;/script&gt;</code></pre></head>

<body>
    <h1>jQuery+Ajax의 조합을 연습하자!</h1>

<pre><code>&lt;hr /&gt;

&lt;div class=&quot;question-box&quot;&gt;
    &lt;h2&gt;2. 서울시 OpenAPI(실시간 따릉이 현황)를 이용하기&lt;/h2&gt;
    &lt;p&gt;모든 위치의 따릉이 현황을 보여주세요&lt;/p&gt;
    &lt;p&gt;업데이트 버튼을 누를 때마다 지웠다 새로 씌여져야 합니다.&lt;/p&gt;
    &lt;button onclick=&quot;q1()&quot;&gt;업데이트&lt;/button&gt;
    &lt;table&gt;
        &lt;thead&gt;
            &lt;tr&gt;
                &lt;td&gt;거치대 위치&lt;/td&gt;
                &lt;td&gt;거치대 수&lt;/td&gt;
                &lt;td&gt;현재 거치된 따릉이 수&lt;/td&gt;
            &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody id=&quot;names-q1&quot;&gt;
        &lt;/tbody&gt;
    &lt;/table&gt;
&lt;/div&gt;</code></pre></body>

</html>
```
#### 2. ✍️랜덤 르탄이 API를 이용하기
- [Ajax 퀴즈 예시](http://spartacodingclub.shop/ajaxquiz/08)
> 👊힌트
이미지 바꾸기 : $("#아이디값").attr("src", 이미지URL);
텍스트 바꾸기 : $("#아이디값").text("바꾸고 싶은 텍스트");
```
<!doctype html>
<html lang="ko">
  <head>
    <meta charset="UTF-8">
    <title>JQuery 연습하고 가기!</title>
    <!-- JQuery를 import 합니다 -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<pre><code>&lt;style type=&quot;text/css&quot;&gt;
  div.question-box {
    margin: 10px 0 20px 0;
  }
  div.question-box &gt; div {
    margin-top: 30px;
  }

&lt;/style&gt;

&lt;script&gt;
  function q1() {
    $.ajax({
      type: &quot;GET&quot;,
      url: &quot;http://spartacodingclub.shop/sparta_api/rtan&quot;,
      data: {},
      success: function(response){
          let imgurl = response[&#39;url&#39;];
          $(&quot;#img-rtan&quot;).attr(&quot;src&quot;, imgurl);

          let msg = response[&#39;msg&#39;];
          $(&quot;#text-rtan&quot;).text(msg);
        }
      })
  }
&lt;/script&gt;</code></pre>  </head>
  <body>
    <h1>JQuery+Ajax의 조합을 연습하자!</h1>

<pre><code>&lt;hr/&gt;

&lt;div class=&quot;question-box&quot;&gt;
  &lt;h2&gt;3. 르탄이 API를 이용하기!&lt;/h2&gt;
  &lt;p&gt;아래를 르탄이 사진으로 바꿔주세요&lt;/p&gt;
  &lt;p&gt;업데이트 버튼을 누를 때마다 지웠다 새로 씌여져야 합니다.&lt;/p&gt;
  &lt;button onclick=&quot;q1()&quot;&gt;르탄이 나와&lt;/button&gt;
  &lt;div&gt;
    &lt;img id=&quot;img-rtan&quot; width=&quot;300&quot; src=&quot;http://spartacodingclub.shop/static/images/rtans/SpartaIcon11.png&quot;/&gt;
    &lt;h1 id=&quot;text-rtan&quot;&gt;나는 ㅇㅇㅇ하는 르탄이!&lt;/h1&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre>  </body>
</html>
```
#### 3. ☘️2개의 퀴즈 후기
- 첫번째 따릉이는 temp_html에 td 태그만 3개 넣었더니 행 구분 없이 열로 쭉 붙어 있었다. 그래서 tr 태그도 같이 가져와야 하는구나 하고 수정했더니 잘 돌아갔다. 그리고 처음에 row, rows 오타 나서 작동 안 했는데 다시 천천히 보고 찾아서 고쳤다.
- 두번째는 의외로 쉬웠다. 받아오는 response만 key, value만 구분 잘 하고 정리만 하면 됐다.]]></description>
        </item>
    </channel>
</rss>