<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>root@hfairy:~$</title>
    <link>https://ryd-gmswjr.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 11 May 2026 05:53:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>hfairy</managingEditor>
    <item>
      <title>[Bandit] Level 4 - Level 5</title>
      <link>https://ryd-gmswjr.tistory.com/17</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Bandit Level 4 -&amp;gt; Level 5&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1315&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N0zTo/dJMcaajDLzo/zRpPe1UEtEuk75s8DuKW8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N0zTo/dJMcaajDLzo/zRpPe1UEtEuk75s8DuKW8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N0zTo/dJMcaajDLzo/zRpPe1UEtEuk75s8DuKW8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN0zTo%2FdJMcaajDLzo%2FzRpPe1UEtEuk75s8DuKW8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1315&quot; height=&quot;291&quot; data-origin-width=&quot;1315&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5단계로 넘어갈 수 있는 패스워드는 'inhere' 디렉토리 내에 있는 파일 중 읽을 수 있는 파일에 저장되어 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY4j20/dJMcahQBoxQ/8hFEgN1ssrl7MzTsgNCRK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY4j20/dJMcahQBoxQ/8hFEgN1ssrl7MzTsgNCRK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY4j20/dJMcahQBoxQ/8hFEgN1ssrl7MzTsgNCRK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY4j20%2FdJMcahQBoxQ%2F8hFEgN1ssrl7MzTsgNCRK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;89&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 문제들과 동일하게 일단 'inhere' 디렉토리로 이동해 저장되어 있는 파일을 출력해 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'-file00'부터 '-file09'까지 총 10개의 파일이 저장되어 있음을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lPXBg/dJMcaiBVe9Y/AuKbxDQotB8WKJFa5AxqY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lPXBg/dJMcaiBVe9Y/AuKbxDQotB8WKJFa5AxqY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lPXBg/dJMcaiBVe9Y/AuKbxDQotB8WKJFa5AxqY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlPXBg%2FdJMcaiBVe9Y%2FAuKbxDQotB8WKJFa5AxqY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;390&quot; height=&quot;37&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 맨 뒤의 파일을 'cat'을 이용해 열어보았는데 딱 봐도 읽을 수 없는 내용이었다..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjVB0Q/dJMcabpiYRG/qiTKhLbvJNf0jZ275IbfK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjVB0Q/dJMcabpiYRG/qiTKhLbvJNf0jZ275IbfK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjVB0Q/dJMcabpiYRG/qiTKhLbvJNf0jZ275IbfK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjVB0Q%2FdJMcabpiYRG%2FqiTKhLbvJNf0jZ275IbfK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;286&quot; height=&quot;180&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 'file' 명령어를 사용해 파일 유형을 확인하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 파일들과 달리 '-file07'은 파일 유형이 아스키 텍스트로 나타나는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7495K/dJMcacPhWt9/yJudM89U47vR68FMrQn66K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7495K/dJMcacPhWt9/yJudM89U47vR68FMrQn66K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7495K/dJMcacPhWt9/yJudM89U47vR68FMrQn66K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7495K%2FdJMcacPhWt9%2FyJudM89U47vR68FMrQn66K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;325&quot; height=&quot;37&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'-file07'을 읽으면 레벨5로 넘어가기 위한 패스워드를 읽을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;번외&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY4j20/dJMcahQBoxQ/8hFEgN1ssrl7MzTsgNCRK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY4j20/dJMcahQBoxQ/8hFEgN1ssrl7MzTsgNCRK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY4j20/dJMcahQBoxQ/8hFEgN1ssrl7MzTsgNCRK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY4j20%2FdJMcahQBoxQ%2F8hFEgN1ssrl7MzTsgNCRK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;69&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 문제의 경우 파일 개수가 많지 않기 때문에 하나하나 열어보고 확인할 수 있다. 물론 이 방법엔 한계가 있지만 전혀 모르겠을 땐 이렇게라도..ㅎㅎ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/15cfq/dJMcadN8AzZ/gG4JX0VKq8NeZzaN3KmSA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/15cfq/dJMcadN8AzZ/gG4JX0VKq8NeZzaN3KmSA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/15cfq/dJMcadN8AzZ/gG4JX0VKq8NeZzaN3KmSA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F15cfq%2FdJMcadN8AzZ%2FgG4JX0VKq8NeZzaN3KmSA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;508&quot; height=&quot;68&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 뒤에서부터 열어보았더니 세번만에 찾을 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>워게임/Bandit</category>
      <category>Bandit</category>
      <category>Linux</category>
      <author>hfairy</author>
      <guid isPermaLink="true">https://ryd-gmswjr.tistory.com/17</guid>
      <comments>https://ryd-gmswjr.tistory.com/17#entry17comment</comments>
      <pubDate>Wed, 31 Dec 2025 19:04:41 +0900</pubDate>
    </item>
    <item>
      <title>[Bandit] Level 3 - Level 4 / [linux] hidden file</title>
      <link>https://ryd-gmswjr.tistory.com/16</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;리눅스 숨김파일&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스에서 숨김파일(hidden file)의 경우, 파일명 앞에 온점(.)이 표기되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 단순히 'ls' 명령어로 파일명을 확인할 수는 없고 '-a' 라는 옵션을 달면 숨김파일까지 모두 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) ls -a&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 문제 풀이에서 사용방법과 결과를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Bandit Level 3 -&amp;gt; Level 4&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhP4KC/dJMcaiBVd9A/lLTqbvqWuj2VUWu6i0Brc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhP4KC/dJMcaiBVd9A/lLTqbvqWuj2VUWu6i0Brc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhP4KC/dJMcaiBVd9A/lLTqbvqWuj2VUWu6i0Brc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhP4KC%2FdJMcaiBVd9A%2FlLTqbvqWuj2VUWu6i0Brc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;275&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 레벨의 패스워드는 'inhere'라는 디렉토리 내의 숨김 파일에 저장되어 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBaYao/dJMcaf6jCN9/PPslCXUW1uTooZBV6s04bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBaYao/dJMcaf6jCN9/PPslCXUW1uTooZBV6s04bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBaYao/dJMcaf6jCN9/PPslCXUW1uTooZBV6s04bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBaYao%2FdJMcaf6jCN9%2FPPslCXUW1uTooZBV6s04bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;281&quot; height=&quot;105&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ls 명령어로 파일 및 디렉토리를 확인한다. 'inhere'라는 디렉토리를 확인할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;cd 명령어로 'inhere'로 경로를 변경했다.&lt;/li&gt;
&lt;li&gt;ls 명령어로 'inhere' 내에 저장된 파일을 확인했지만 아무것도 출력되지 않았다.&lt;/li&gt;
&lt;li&gt;문제에서 숨김파일에 패스워드를 저장했다고 했으니 '-a' 옵션을 넣어 다시 명령어를 입력했다.&lt;/li&gt;
&lt;li&gt;'...Hiding-From-You'라는 이름의 숨김파일이 저장되어 있는 것을 확인했다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;43&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boEaQI/dJMcadm4zg3/DLZ6nYfDespa14IrSQHeHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boEaQI/dJMcadm4zg3/DLZ6nYfDespa14IrSQHeHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boEaQI/dJMcadm4zg3/DLZ6nYfDespa14IrSQHeHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboEaQI%2FdJMcadm4zg3%2FDLZ6nYfDespa14IrSQHeHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;417&quot; height=&quot;43&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;43&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'cat' 명령어를 입력해 해당 파일을 읽어주었고, 다음단계의 패스워드를 획득했다.&lt;/p&gt;</description>
      <category>워게임/Bandit</category>
      <category>Bandit</category>
      <category>Linux</category>
      <author>hfairy</author>
      <guid isPermaLink="true">https://ryd-gmswjr.tistory.com/16</guid>
      <comments>https://ryd-gmswjr.tistory.com/16#entry16comment</comments>
      <pubDate>Wed, 31 Dec 2025 17:28:41 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] .csv파일로 저장하고 엑셀에서 열기</title>
      <link>https://ryd-gmswjr.tistory.com/15</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스트에서는 MySQL 테이블에 저장된 데이터를 csv 파일로 저장하고 엑셀에서 불러오는 과정을 작성하고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 데이터베이스 'jokbalreview_db' 안의 테이블 'jokbalreview_tb'에 저장된 데이터를 추출할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 저장된 전체 데이터를 불러오는 코드는 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1766766955969&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;USE jokbalreview_db; #올바른 db를 왼쪽 스키마 리스트에서 선택하면 굳이 작성하지 않아도 된다.
SELECT * FROM jokbalreview_tb;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 만약 특정브랜드(여기선 'brand_name')의 리뷰만 선택적으로 보고싶다면 아래와 같이 쿼리를 작성하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1766767073016&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM jokbalreview_tb where brand_name = '저장된 브랜드명';&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 엑셀로 내보내고 싶은 데이터를 다 선택했다면 결과창에 Export 아이콘을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eLqY2V/dJMcacobXtS/DLSKxSl1HoaDT8xlZwkipk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eLqY2V/dJMcacobXtS/DLSKxSl1HoaDT8xlZwkipk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eLqY2V/dJMcacobXtS/DLSKxSl1HoaDT8xlZwkipk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeLqY2V%2FdJMcacobXtS%2FDLSKxSl1HoaDT8xlZwkipk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;763&quot; height=&quot;525&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장 화면이 뜨면 파일 형식은 CSV(*.csv)를 선택해서 저장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VGq8B/dJMcabpg2GH/AlJhElKnGiQ1j0z1vgU66K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VGq8B/dJMcabpg2GH/AlJhElKnGiQ1j0z1vgU66K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VGq8B/dJMcabpg2GH/AlJhElKnGiQ1j0z1vgU66K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVGq8B%2FdJMcabpg2GH%2FAlJhElKnGiQ1j0z1vgU66K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;129&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;csv 파일 저장 후 엑셀에 들어가 [데이터 &amp;gt; 텍스트/CSV에서 데이터 가져오기]경로를 선택하고 아까 저장한 csv파일을 가져오기한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqb03Q/dJMcahwgtjs/ipcQjwgoYquhERxNrdNVUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqb03Q/dJMcahwgtjs/ipcQjwgoYquhERxNrdNVUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqb03Q/dJMcahwgtjs/ipcQjwgoYquhERxNrdNVUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdqb03Q%2FdJMcahwgtjs%2FipcQjwgoYquhERxNrdNVUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;208&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 창이 뜨면 확인 후 [데이터 변환]을 클릭한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWvVbg/dJMcai9Js9G/a9qdTF0hNsf2qNtdSRwPe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWvVbg/dJMcai9Js9G/a9qdTF0hNsf2qNtdSRwPe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWvVbg/dJMcai9Js9G/a9qdTF0hNsf2qNtdSRwPe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWvVbg%2FdJMcai9Js9G%2Fa9qdTF0hNsf2qNtdSRwPe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1041&quot; height=&quot;780&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;편집기 창이 뜨면 데이터 내용 확인 후 [닫기 및 로드]를 선택한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L2w41/dJMcafkURhr/k1RSWh0YlaOu44z3vV3YMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L2w41/dJMcafkURhr/k1RSWh0YlaOu44z3vV3YMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L2w41/dJMcafkURhr/k1RSWh0YlaOu44z3vV3YMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL2w41%2FdJMcafkURhr%2Fk1RSWh0YlaOu44z3vV3YMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;971&quot; height=&quot;272&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엑셀로 데이터 확인 및 변환 완료.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;997&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzurSq/dJMcagRENnl/QyVL0MvKK9YWF99y3KE2J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzurSq/dJMcagRENnl/QyVL0MvKK9YWF99y3KE2J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzurSq/dJMcagRENnl/QyVL0MvKK9YWF99y3KE2J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzurSq%2FdJMcagRENnl%2FQyVL0MvKK9YWF99y3KE2J0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;555&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;997&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/빅데이터 분석</category>
      <category>CSV</category>
      <category>Excel</category>
      <category>MySQL</category>
      <category>엑셀</category>
      <author>hfairy</author>
      <guid isPermaLink="true">https://ryd-gmswjr.tistory.com/15</guid>
      <comments>https://ryd-gmswjr.tistory.com/15#entry15comment</comments>
      <pubDate>Sat, 27 Dec 2025 01:56:32 +0900</pubDate>
    </item>
    <item>
      <title>[웹크롤링] 네이버 쇼핑(네이버스토어) 후기 크롤링 (랭킹순, 별점 낮은순)</title>
      <link>https://ryd-gmswjr.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ryd-gmswjr.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ryd-gmswjr.tistory.com/11&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1766751491665&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[MySQL] 데이터베이스 구축 및 테이블 생성 _ 1&quot; data-og-description=&quot;MySQL을 기반으로 실습 진행하였으며 버전은 8.1.0이다.(mysql --version) 데이터베이스 생성CREATE DATABASE IF NOT EXISTS cosmetic_db; 'CREATE DATABASE'를 이용해 'cosmetic_db'라는 데이터베이스를 생성한다.이때 중복 &quot; data-og-host=&quot;ryd-gmswjr.tistory.com&quot; data-og-source-url=&quot;https://ryd-gmswjr.tistory.com/11&quot; data-og-url=&quot;https://ryd-gmswjr.tistory.com/11&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lOmQX/hyZPKiGxal/WrLoJ3yUt7skRLUjL4OtFk/img.png?width=323&amp;amp;height=405&amp;amp;face=0_0_323_405,https://scrap.kakaocdn.net/dn/bjeC5X/hyZPVk2n0T/Kr1tWv28pygsSls6UhhEg0/img.png?width=323&amp;amp;height=405&amp;amp;face=0_0_323_405,https://scrap.kakaocdn.net/dn/pH4bo/hyZPI6gqEL/dNQthTz4LC252UYG8YOp51/img.png?width=666&amp;amp;height=374&amp;amp;face=0_0_666_374&quot;&gt;&lt;a href=&quot;https://ryd-gmswjr.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ryd-gmswjr.tistory.com/11&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lOmQX/hyZPKiGxal/WrLoJ3yUt7skRLUjL4OtFk/img.png?width=323&amp;amp;height=405&amp;amp;face=0_0_323_405,https://scrap.kakaocdn.net/dn/bjeC5X/hyZPVk2n0T/Kr1tWv28pygsSls6UhhEg0/img.png?width=323&amp;amp;height=405&amp;amp;face=0_0_323_405,https://scrap.kakaocdn.net/dn/pH4bo/hyZPI6gqEL/dNQthTz4LC252UYG8YOp51/img.png?width=666&amp;amp;height=374&amp;amp;face=0_0_666_374');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[MySQL] 데이터베이스 구축 및 테이블 생성 _ 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MySQL을 기반으로 실습 진행하였으며 버전은 8.1.0이다.(mysql --version) 데이터베이스 생성CREATE DATABASE IF NOT EXISTS cosmetic_db; 'CREATE DATABASE'를 이용해 'cosmetic_db'라는 데이터베이스를 생성한다.이때 중복&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ryd-gmswjr.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 구축 및 테이블 생성은 위에 정리한 내용을 기반으로 진행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 하려니 또 가물가물했는데 이렇게 정리해놓은게 얼마나 다행이던지..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표는 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;브랜드 여섯개 선정 후 각 제품의 후기 크롤링하기
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;랭킹순 70개, 별점 낮은순 30개 =&amp;gt; 총 100개의 후기 수집&lt;/li&gt;
&lt;li&gt;만약 수집 과정 중 중복 데이터가 있다면 한개만 저장. 즉, 각 브랜드의 댓글수가 100개로 동일하지 않을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;크롤링 후 각 브랜드별로 csv 파일로 저장해 하나의 엑셀 파일에 저장하기(시트 나누어)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckGG6X/dJMcabv3oCn/xubRO1XweJwowKE0Zjyp1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckGG6X/dJMcabv3oCn/xubRO1XweJwowKE0Zjyp1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckGG6X/dJMcabv3oCn/xubRO1XweJwowKE0Zjyp1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckGG6X%2FdJMcabv3oCn%2FxubRO1XweJwowKE0Zjyp1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;574&quot; height=&quot;295&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 테이블의 컬럼은 위 사진과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;review_num : 고유번호 (자동으로 부여됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;brand_name : 브랜드명 (따로 수집하지 않고 코드에서 각 브랜드 이름을 넣어줬음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;review_text : 수집된 리뷰&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MySQL 연결 코드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전에 크롤링할 때도 사용했던 MySQL 연결 코드 파일을 그대로 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번 작성해놓으면 쉽게 import할 수 있어서 편하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;password에는 실제 MySQL 비밀번호를 작성하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할 점은 kill_chrome 함수는 크롬 프로세스를 다 종료시키기 때문에 이 함수를 사용한다면 크롬창에 중요한건 없는지 확인한 후 실행시켜야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1766755132163&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import mysql.connector
import subprocess
import re

# MySQL 서버 연결 정보
host = '127.0.0.1'
database = 'jokbalreview_db'
user = 'root'
password = ' '

# MySQL 서버에 연결
conn = mysql.connector.connect(host=host, database=database, user=user, password=password, use_pure=True)

# 커서 생성
cursor = conn.cursor()

def kill_chrome():
    #KILL, TASKKILL / 프로세스를 종료하는 명령을 의미
    subprocess.call(&quot;TASKKILL /f /IM CHROME.EXE&quot;)
    subprocess.call(&quot;TASKKILL /f /IM CHROMEDRIVER.EXE&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종코드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 실행 전 url 과 brand_name은 직접 입력했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 섹션마다 대기시간을 넣어줘서 로딩되기 전에 진행돼 꼬이지 않게 함. 또한 매크로 탐지도 피할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 진행과정은 아래와 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;크롬을 통해 url 접속&lt;/li&gt;
&lt;li&gt;스크롤을 통해 리뷰 버튼이 보이도록 함&lt;/li&gt;
&lt;li&gt;리뷰 클릭&lt;/li&gt;
&lt;li&gt;필터 클릭 (랭킹순)&lt;/li&gt;
&lt;li&gt;리뷰 수집 및 저장 (중복 데이터 저장X, 페이지 넘기는 코드 포함)&lt;/li&gt;
&lt;li&gt;필터 클릭 (별점 낮은순)&lt;/li&gt;
&lt;li&gt;리뷰 수집 및 저장 (중복 데이터 저장X, 페이지 넘기는 코드 포함)&lt;/li&gt;
&lt;li&gt;종료&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1766756450209&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import time
import random
# mysql 연결 코드 파일 import하기
from mysql_info_jokbal import *
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys

# --- 설정 및 초기화 ---
target_counts = {&quot;랭킹순&quot;: 70, &quot;평점 낮은순&quot;: 30}
total_collected_count = 0
url = &quot; &quot;
random_delay = random.uniform(2, 9)
brand_name = ' '

# SQL 쿼리 (컬럼에 맞춰 수정)
query = &quot;INSERT IGNORE INTO jokbalreview_tb (brand_name, review_text) VALUES (%s, %s)&quot;

page_index = 1

# kill_chrome()

driver = webdriver.Chrome()
driver.get(url)

# 종종 로봇이 아님을 증명하는 페이지가 뜨기 때문에 대기시간을 넉넉하게 설정함
wait = WebDriverWait(driver, 10)
time.sleep(random.uniform(5, 10))

# 스크롤
for c in range(3,7):
    driver.find_element(By.TAG_NAME,'body').send_keys(Keys.PAGE_DOWN)
    time.sleep(2) 

# 리뷰 클릭
try:
    review_button = driver.find_element(By.XPATH, &quot;//a[@data-name='REVIEW']&quot;)
    ActionChains(driver).move_to_element(review_button).click().perform()
    time.sleep(2)
    print(&quot;리뷰 버튼 클릭 성공&quot;)
except Exception as e:
    print(f&quot;리뷰 버튼을 찾거나 클릭하는 데 실패했습니다: {e}&quot;)

time.sleep(random_delay)

for filter_name, limit in target_counts.items():
    print(f&quot;\n&amp;gt;&amp;gt;&amp;gt; {filter_name} 필터 수집 시작 (목표: {limit}개)&quot;)
    
    page_index = 1 

    # 1. 필터 버튼 클릭
    try:
        filter_btn = wait.until(EC.element_to_be_clickable((By.XPATH, f'//a[contains(text(), &quot;{filter_name}&quot;)]')))
        driver.execute_script(&quot;arguments[0].click();&quot;, filter_btn)
        time.sleep(3)
        print(f&quot;{filter_name} 버튼 클릭 성공&quot;)
    
    except Exception as e:
        print(f&quot;{filter_name} 버튼 클릭 실패: {e}&quot;)
        continue

    current_filter_collected = 0

    while current_filter_collected &amp;lt; limit:
        try:
            # 리뷰 박스 요소들 찾기
            review_elements = driver.find_elements(By.CSS_SELECTOR, 'li.PxsZltB5tV')

            if not review_elements: break

            for element in review_elements:
                if current_filter_collected &amp;gt;= limit:
                    break
                
                print(f&quot;\n{page_index}페이지...\n&quot;)

                # 리뷰 본문 추출
                try:
                    # 부모 클래스를 거쳐서 span을 찾는 방식
                    # comment_text = element.find_element(By.XPATH, &quot;.//div[contains(@class, 'KqJ8QqwO82')]/span&quot;).text.strip()
                    comment_text = element.find_element(By.CLASS_NAME, 'KqJ8Qqw082').text.strip()
                except:
                    continue

                if comment_text:  # 내용이 있는 경우에만 저장
                    total_collected_count += 1
                    # (review_num, brand_name, review_text)
                    review_data = (brand_name, comment_text[:500])
                    
                    try:
                        cursor.execute(query, review_data)
                        conn.commit()
                        current_filter_collected += 1
                        print(f&quot;[{filter_name}] {current_filter_collected}/{limit} 완료&quot;)
                    except mysql.connector.errors.IntegrityError:
                        print(&quot;중복 데이터 건너뜀&quot;)
                        total_collected_count -= 1 # 중복 시 카운트 되돌림

            if current_filter_collected &amp;gt;= limit:
                break

            # --- 페이지네이션 ---
            page_index += 1
            next_page = str(page_index)

            try:
                if int(next_page) % 10 == 1:
                    # '다음' 버튼(&amp;gt; 모양) 찾기
                    next_btn = driver.find_elements(By.CLASS_NAME, &quot;JY2WGJ4hXh&quot;)
                    if next_btn:
                        next_btn[-1].click()
                        print(f&quot;&amp;gt;&amp;gt;&amp;gt; {next_page}페이지 그룹으로 이동&quot;)
                    else:
                        print(&quot;&amp;gt;&amp;gt;&amp;gt; 다음 페이지 그룹이 없습니다. 수집 종료.&quot;)
                        break
                else:
                    # 숫자 페이지 번호들 찾기
                    page_elements = driver.find_elements(By.CLASS_NAME, &quot;hyY6CXtbcn&quot;)
                    clicked = False

                    for pg in page_elements:
                        if pg.text == next_page:
                            # # 스크롤을 이동시켜 클릭 가능하게 만듦
                            # driver.execute_script(&quot;arguments[0].scrollIntoView();&quot;, pg)
                            pg.click()
                            clicked = True
                            print(f&quot;&amp;gt;&amp;gt;&amp;gt; {next_page}페이지 클릭 성공&quot;)
                            time.sleep(random_delay)
                            break
            
                        # 만약 모든 페이지 요소를 뒤졌는데 다음 페이지 번호가 없다면?
                    if not clicked:
                        print(f&quot;&amp;gt;&amp;gt;&amp;gt; 더 이상 클릭할 페이지({next_page})가 없습니다. 수집을 종료합니다.&quot;)
                        break 

                time.sleep(random.uniform(2.5, 4.0)) # 페이지 로딩 대기
            except Exception as e:
                print(f&quot;페이지 이동 중 오류 발생: {e}&quot;)
                break

        except Exception as e:
            print(f&quot;오류 발생: {e}&quot;)
            break

print(f&quot;\n 수집 완료! '{brand_name}' 총 {total_collected_count}개 리뷰 저장됨.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/빅데이터 분석</category>
      <category>MySQL</category>
      <category>Selenium</category>
      <category>SQL</category>
      <category>네이버스토어 후기</category>
      <category>리뷰 크롤링</category>
      <category>웹크롤링</category>
      <category>크롤링</category>
      <category>후기 크롤링</category>
      <author>hfairy</author>
      <guid isPermaLink="true">https://ryd-gmswjr.tistory.com/14</guid>
      <comments>https://ryd-gmswjr.tistory.com/14#entry14comment</comments>
      <pubDate>Sat, 27 Dec 2025 01:20:08 +0900</pubDate>
    </item>
    <item>
      <title>[웹크롤링] 네이버 스마트스토어 리뷰 크롤링</title>
      <link>https://ryd-gmswjr.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ryd-gmswjr.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ryd-gmswjr.tistory.com/11&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1752079741683&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[MySQL] 데이터베이스 구축 및 테이블 생성 _ 1&quot; data-og-description=&quot;MySQL을 기반으로 실습 진행하였으며 버전은 8.1.0이다.(mysql --version) 데이터베이스 생성CREATE DATABASE IF NOT EXISTS cosmetic_db; 'CREATE DATABASE'를 이용해 'cosmetic_db'라는 데이터베이스를 생성한다.이때 중복 &quot; data-og-host=&quot;ryd-gmswjr.tistory.com&quot; data-og-source-url=&quot;https://ryd-gmswjr.tistory.com/11&quot; data-og-url=&quot;https://ryd-gmswjr.tistory.com/11&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ieDWl/hyZjAAa6na/UtYbSLaMjICrGgyMbMmGx1/img.png?width=323&amp;amp;height=405&amp;amp;face=0_0_323_405,https://scrap.kakaocdn.net/dn/dnitdk/hyZjBlxbAL/uvRLAv47NCJ74kVSwUHWf1/img.png?width=323&amp;amp;height=405&amp;amp;face=0_0_323_405,https://scrap.kakaocdn.net/dn/pbkd3/hyZjB6UQym/QKQ4AA595VKYb3ZHx2rs8K/img.png?width=666&amp;amp;height=374&amp;amp;face=0_0_666_374&quot;&gt;&lt;a href=&quot;https://ryd-gmswjr.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ryd-gmswjr.tistory.com/11&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ieDWl/hyZjAAa6na/UtYbSLaMjICrGgyMbMmGx1/img.png?width=323&amp;amp;height=405&amp;amp;face=0_0_323_405,https://scrap.kakaocdn.net/dn/dnitdk/hyZjBlxbAL/uvRLAv47NCJ74kVSwUHWf1/img.png?width=323&amp;amp;height=405&amp;amp;face=0_0_323_405,https://scrap.kakaocdn.net/dn/pbkd3/hyZjB6UQym/QKQ4AA595VKYb3ZHx2rs8K/img.png?width=666&amp;amp;height=374&amp;amp;face=0_0_666_374');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[MySQL] 데이터베이스 구축 및 테이블 생성 _ 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MySQL을 기반으로 실습 진행하였으며 버전은 8.1.0이다.(mysql --version) 데이터베이스 생성CREATE DATABASE IF NOT EXISTS cosmetic_db; 'CREATE DATABASE'를 이용해 'cosmetic_db'라는 데이터베이스를 생성한다.이때 중복&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ryd-gmswjr.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스와 테이블 구축 방법은 위 게시물에 자세하게 작성해 놓았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lRF0F/btsPb5jTTMh/r2WgOPzWOXJfaMEPBKEr01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lRF0F/btsPb5jTTMh/r2WgOPzWOXJfaMEPBKEr01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lRF0F/btsPb5jTTMh/r2WgOPzWOXJfaMEPBKEr01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlRF0F%2FbtsPb5jTTMh%2Fr2WgOPzWOXJfaMEPBKEr01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;705&quot; height=&quot;388&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 코드를 통해 데이터를 삽입할 테이블과 컬럼 정보는 위와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 컬럼의 목적은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;comment_num&lt;/b&gt;(primary key): 고유번호&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;product_name&lt;/b&gt;: 제품명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;comment_text&lt;/b&gt;: 리뷰 내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;comment_date&lt;/b&gt;: 리뷰 작성 일자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;crawling_date&lt;/b&gt;: 크롤링한 날짜 및 시간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;site_name&lt;/b&gt;: 크롤링한 사이트 이름(쿠팡, 네이버쇼핑 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;url&lt;/b&gt;: 크롤링한 사이트 url&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;MySQL 연결 코드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에 연동할 코드는 다른 코드에서도 쓰기 편하도록 별도의 파일을 생성하여 import하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일명은 'mysql_info'&lt;br /&gt;아래&amp;nbsp;코드에서&amp;nbsp;&quot;****&quot;로&amp;nbsp;처리한&amp;nbsp;password에는&amp;nbsp;실제&amp;nbsp;password&amp;nbsp;넣으면&amp;nbsp;된다.&lt;/p&gt;
&lt;pre id=&quot;code_1752079983284&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import mysql.connector
import subprocess
import re

# MySQL 서버 연결 정보
host = '127.0.0.1'
database = 'cosmetic_db'
user = 'root'
password = '****'

# MySQL 서버에 연결
conn = mysql.connector.connect(host=host, database=database, user=user, password=password)

# 커서 생성
cursor = conn.cursor()

def kill_chrome():
    # KILL, TASKKILL / 프로세스를 종료하는 명령을 의미
    subprocess.call(&quot;TASKKILL /f /IM CHROME.EXE&quot;)
    subprocess.call(&quot;TASKKILL /f /IM CHROMEDRIVER.EXE&quot;)


def remove_tag(_input_data):
    p = re.compile('@[a-zA-Z0-9_]+')
    data = p.search(_input_data)
    if data is not None:
        tag_data = p.findall(_input_data)
        output_data = _input_data
        for tag in tag_data:
            output_data = output_data.replace(tag, '')
        return output_data.strip()
    else:
        return _input_data
    #print(output_data)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;최종코드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url에는&amp;nbsp;후기를&amp;nbsp;크롤링할&amp;nbsp;제품&amp;nbsp;페이지의&amp;nbsp;url을&amp;nbsp;넣으면&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;product_name도 직접 제품명을 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1752080113823&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time
import random
from mysql_info import *
from selenium.webdriver.common.action_chains import ActionChains

random_delay = random.uniform(2, 9)

site_name = &quot;네이버스토어&quot;
driver = webdriver.Chrome()
url = &quot;https://smartstore.naver.com/...&quot;

driver.get(url)
time.sleep(random_delay)

product_name =driver.find_element(By.CLASS_NAME, '_22kNQuEXmb').text.strip()

action = ActionChains(driver)

time.sleep(random_delay)

# 스크롤
for c in range(0,6):
    driver.find_element(By.TAG_NAME,'body').send_keys(Keys.PAGE_DOWN)
    time.sleep(1) 


# 유니크 인덱스 추가 후 수정한 쿼리
query = &quot;INSERT IGNORE INTO derma_comment_tb (product_name, comment_text, comment_date, site_name, url) VALUES (%s, %s, %s, %s, %s)&quot;

review_list= []
page_index = 1

try:
    review_button = driver.find_element(By.XPATH, &quot;//a[@data-name='REVIEW']&quot;)
    ActionChains(driver).move_to_element(review_button).click().perform()
except Exception as e:
    print(f&quot;리뷰 버튼을 찾거나 클릭하는 데 실패했습니다: {e}&quot;)

time.sleep(random_delay)

# 페이지를 아래로 스크롤하여 최신순 버튼이 보이도록 함
for _ in range(2):
    driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.PAGE_DOWN)
    time.sleep(1)

# 최신순 버튼 클릭
try:
    lately_button = driver.find_element(By.XPATH, &quot;//a[@data-shp-contents-id='최신순']&quot;)
    ActionChains(driver).move_to_element(lately_button).click().perform()
except Exception as e:
    print(f&quot;최신순 버튼을 찾거나 클릭하는 데 실패했습니다: {e}&quot;)

time.sleep(random_delay)

while True: 
    try:
        review_elements = driver.find_elements(By.CLASS_NAME, '_9oeeh3ukt7')
        for element in review_elements:
            # 리뷰 날짜
            try:
                print(f&quot;\n{page_index}페이지...\n&quot;)
                comment_date = element.find_element(By.XPATH, &quot;.//span[contains(text(), '.')]&quot;).text.strip()
                print(comment_date)
            except:
                comment_date = ''

            # 리뷰 본문 (하단의 span 중 마지막 것)
            try:
                comment_text = element.find_elements(By.CLASS_NAME, '_2L3vDiadT9')[-1].text.strip()
                print(comment_text)
            except:
                comment_text = ''
        
            review_list.append((product_name, comment_text[:1000],comment_date, site_name, url))

        for review in review_list:
            try:
                cursor.execute(query, review)
            except mysql.connector.errors.IntegrityError:
                print(&quot;중복값 제외&quot;)
        
        conn.commit()

        next_page = str(page_index + 1)

        if int(next_page) % 10 == 1:
            driver.find_elements(By.CLASS_NAME, &quot;fAUKm1ewwo&quot;)[-1].click()
        else:
            page_elements = driver.find_elements(By.CLASS_NAME, &quot;UWN4IvaQza&quot;)
            for page_element in page_elements:
                if page_element.text == next_page:
                    page_element.click()
                    time.sleep(random_delay)
                    break
        time.sleep(random_delay)
        page_index += 1

    except Exception as e:
        print(&quot;에러 발생 또는 마지막 페이지:&quot;, e)
        break&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠팡과 비교해서 블락이 안 걸려서 다행이었다... 쿠팡은 너무 쉽게 차단 당해서 다음날까지 시도도 못하고..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vpn이나 프록시를 사용해야 하나 했는데 너무 복잡해서 일단은 되는 것만이라도 하는걸로&lt;/p&gt;</description>
      <category>공부/빅데이터 분석</category>
      <category>MySQL</category>
      <category>웹크롤링</category>
      <category>크롤링</category>
      <author>hfairy</author>
      <guid isPermaLink="true">https://ryd-gmswjr.tistory.com/13</guid>
      <comments>https://ryd-gmswjr.tistory.com/13#entry13comment</comments>
      <pubDate>Thu, 10 Jul 2025 01:58:13 +0900</pubDate>
    </item>
    <item>
      <title>[웹크롤링] 쿠팡 후기 크롤링</title>
      <link>https://ryd-gmswjr.tistory.com/12</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OlEJA/btsO5lBlXcj/k1RXaoByfMiqjy9wcSneDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OlEJA/btsO5lBlXcj/k1RXaoByfMiqjy9wcSneDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OlEJA/btsO5lBlXcj/k1RXaoByfMiqjy9wcSneDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOlEJA%2FbtsO5lBlXcj%2Fk1RXaoByfMiqjy9wcSneDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;803&quot; height=&quot;430&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ryd-gmswjr.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ryd-gmswjr.tistory.com/11&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1751458568282&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[MySQL] 데이터베이스 구축 및 테이블 생성 _ 1&quot; data-og-description=&quot;MySQL을 기반으로 실습 진행하였으며 버전은 8.1.0이다.(mysql --version) 데이터베이스 생성CREATE DATABASE IF NOT EXISTS cosmetic_db; 'CREATE DATABASE'를 이용해 'cosmetic_db'라는 데이터베이스를 생성한다.이때 중복 &quot; data-og-host=&quot;ryd-gmswjr.tistory.com&quot; data-og-source-url=&quot;https://ryd-gmswjr.tistory.com/11&quot; data-og-url=&quot;https://ryd-gmswjr.tistory.com/11&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CNTIi/hyZfAm2pIg/KxHOeLbLmf62kWDKvJ2bkk/img.png?width=323&amp;amp;height=405&amp;amp;face=0_0_323_405,https://scrap.kakaocdn.net/dn/bydLHF/hyZgbgqpZj/RGJFfOtiHva19VdN9I7HYk/img.png?width=323&amp;amp;height=405&amp;amp;face=0_0_323_405,https://scrap.kakaocdn.net/dn/iW3Dz/hyZf3o9ikp/wkKDvIQeuoRbVtB5TODH31/img.png?width=666&amp;amp;height=374&amp;amp;face=0_0_666_374&quot;&gt;&lt;a href=&quot;https://ryd-gmswjr.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ryd-gmswjr.tistory.com/11&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CNTIi/hyZfAm2pIg/KxHOeLbLmf62kWDKvJ2bkk/img.png?width=323&amp;amp;height=405&amp;amp;face=0_0_323_405,https://scrap.kakaocdn.net/dn/bydLHF/hyZgbgqpZj/RGJFfOtiHva19VdN9I7HYk/img.png?width=323&amp;amp;height=405&amp;amp;face=0_0_323_405,https://scrap.kakaocdn.net/dn/iW3Dz/hyZf3o9ikp/wkKDvIQeuoRbVtB5TODH31/img.png?width=666&amp;amp;height=374&amp;amp;face=0_0_666_374');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[MySQL] 데이터베이스 구축 및 테이블 생성 _ 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MySQL을 기반으로 실습 진행하였으며 버전은 8.1.0이다.(mysql --version) 데이터베이스 생성CREATE DATABASE IF NOT EXISTS cosmetic_db; 'CREATE DATABASE'를 이용해 'cosmetic_db'라는 데이터베이스를 생성한다.이때 중복&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ryd-gmswjr.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 페이지에서 구축한 테이블에 데이터를 수집하는 과정을 작성할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB name: cosmetic_db&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Table name: derma_review_tb&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 column은 아래와 같음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;review_num(primary&amp;nbsp;key):&amp;nbsp;고유번호 &lt;br /&gt;product_name: 제품명 &lt;br /&gt;review_text: 리뷰 내용 &lt;br /&gt;review_date: 리뷰 작성 일자 &lt;br /&gt;crawling_date: 크롤링한 날짜 및 시간 &lt;br /&gt;site_name: 크롤링한 사이트 이름(쿠팡, 네이버쇼핑 등) &lt;br /&gt;url: 크롤링한 사이트 url&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;※ ※ ※ ※ ※ 오류날 수 있음 주의...^-^※ ※ ※ ※ ※&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Visual Studio Code에서 작업하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치되지 않은 라이브러리들은 터미널에 입력해서 설치하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 ' pip install selenium ' 이렇게.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AkBRm/btsO3cW5Mea/Ar97Ezo8lIXtrVtGWDKOs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AkBRm/btsO3cW5Mea/Ar97Ezo8lIXtrVtGWDKOs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AkBRm/btsO3cW5Mea/Ar97Ezo8lIXtrVtGWDKOs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAkBRm%2FbtsO3cW5Mea%2FAr97Ezo8lIXtrVtGWDKOs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;909&quot; height=&quot;93&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MySQL 연결 코드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에 연동할 코드는 다른 코드에서도 편리하게 사용할 수 있도록 별개의 파일로 저장하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일명은 'mysql_info'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드에서 &quot;****&quot;로 처리한 password에는 실제 password 넣으면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1751628887579&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import mysql.connector
import subprocess
import re

# MySQL 서버 연결 정보
host = '127.0.0.1'
database = 'cosmetic_db'
user = 'root'
password = '****'

# MySQL 서버에 연결
conn = mysql.connector.connect(host=host, database=database, user=user, password=password)

# 커서 생성
cursor = conn.cursor()

def kill_chrome():
    # KILL, TASKKILL / 프로세스를 종료하는 명령을 의미
    subprocess.call(&quot;TASKKILL /f /IM CHROME.EXE&quot;)
    subprocess.call(&quot;TASKKILL /f /IM CHROMEDRIVER.EXE&quot;)


def remove_tag(_input_data):
    p = re.compile('@[a-zA-Z0-9_]+')
    data = p.search(_input_data)
    if data is not None:
        tag_data = p.findall(_input_data)
        output_data = _input_data
        for tag in tag_data:
            output_data = output_data.replace(tag, '')
        return output_data.strip()
    else:
        return _input_data
    #print(output_data)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종코드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url에는 후기를 크롤링할 제품 페이지의 url을 넣으면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1751628501421&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.alert import Alert
import time
import random
from mysql_info import *
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

site_name = '쿠팡'

driver = webdriver.Chrome()
url = &quot;https://www.coupang.com/...&quot;
driver.get(url)

action = ActionChains(driver)

time.sleep(3)

# 스크롤
for c in range(0,5):
    driver.find_element(By.TAG_NAME,'body').send_keys(Keys.PAGE_DOWN)
    time.sleep(1) 

# 유니크 인덱스 추가 후 수정한 쿼리
query = &quot;INSERT IGNORE INTO derma_review_tb (product_name, review_text, review_date, site_name, url) VALUES (%s, %s, %s, %s, %s)&quot;

random_delay = random.uniform(2, 7)

page_index = 1

unique_review_texts = set()

# for loop_i in range(1, 100):
while True:
    review_list = []
    print(f&quot;\n--- 페이지 {page_index} 리뷰 수집 시작 ---&quot;)
    time.sleep(random_delay)

    try:
        # 최대 10초 동안 alert이 나타날 때까지 대기
        WebDriverWait(driver, 5).until(EC.alert_is_present())
        # alert 객체로 전환
        alert = Alert(driver)
        # alert 수락
        alert.accept()
    
    except TimeoutException:
        # 10초 동안 alert이 나타나지 않으면 예외 발생
        print(&quot;Alert이 나타나지 않았습니다.&quot;)
        pass
    
    # 상품평 틀
    item_elements = driver.find_element(By.CLASS_NAME, &quot;js_reviewArticleListContainer&quot;).find_elements(By.TAG_NAME, &quot;article&quot;)
    # enumerate =&amp;gt; 순서가 있는 객체를 인덱스값과 함께 출력
    for review_index, item_element in enumerate(item_elements, start=1):
        # 리뷰 각각에서 텍스트(리뷰내용) 추출
        review_text_cleaned = &quot;&quot;
        try:
            review_text = item_element.find_element(By.CLASS_NAME, &quot;sdp-review__article__list__review__content&quot;).text
            review_text_cleaned = &quot; &quot;.join(review_text.split())
        except Exception as e:
            review_text_cleaned = &quot;&quot;

        if review_text_cleaned and review_text_cleaned not in unique_review_texts:
            try:
                review_date = item_element.find_element(By.CLASS_NAME, &quot;sdp-review__article__list__info__product-info__reg-date&quot;).text
                product_name = item_element.find_element(By.CLASS_NAME,&quot;sdp-review__article__list__info__product-info__name&quot;).text
                print(f'페이지 {page_index}_리뷰 번호 {review_index}', product_name, review_text_cleaned[:500], review_date)
                review_list.append((product_name, review_text_cleaned[:500], review_date, site_name, url))
                time.sleep(random_delay)
            except Exception as e:
                print(&quot;118LINE&quot;, str(e))
        else:
            pass

    for review in review_list:
        try:
            cursor.execute(query, review)
        except mysql.connector.errors.IntegrityError:
            print(&quot;중복값 제외&quot;)

    conn.commit()

    next_page = str(page_index+1)

    try:
        # &quot;다음&quot; 버튼을 먼저 찾습니다.
        next_button = driver.find_element(By.CLASS_NAME, &quot;sdp-review__article__page__next&quot;)

        # &quot;다음&quot; 버튼이 비활성화되었는지 확인 (비활성화 클래스명 확인 필요)
        # 웹사이트마다 클래스명이 다를 수 있으니 확인해야 합니다.
        if &quot;disabled&quot; in next_button.get_attribute(&quot;class&quot;):
            print(&quot;마지막 페이지입니다. 크롤링을 종료합니다.&quot;)
            break # 루프 종료
        
        if int(next_page) % 10 == 1:
            # 11, 21, 31 페이지 등 페이지 블록을 넘길 때
            next_button.click()
            print(&quot;다음 페이지 블록으로 이동합니다.&quot;)
            time.sleep(random_delay)
            # 다음 페이지를 누르면 끝페이지로 이동해서 첫페이지 선택해줌
            # 예를 들어 10페이지 크롤링 후 다음 버튼을 누르면 20페이지로 이동해서 11페이지를 클릭해줘야 함
            driver.find_element(By.CLASS_NAME, &quot;sdp-review__article__page__num&quot;).click()
            time.sleep(random_delay)
        else:
            
            page_elements = driver.find_elements(By.CLASS_NAME, &quot;sdp-review__article__page__num&quot;)
            
            # 다음 페이지 번호를 클릭
            found_next_page = False
            for page_element in page_elements:
                if page_element.text == next_page:
                    page_element.click()
                    found_next_page = True
                    time.sleep(3)
                    break
            
            if not found_next_page:
                # 다음 페이지 번호가 없으면 마지막 페이지로 간주
                print(&quot;더 이상 페이지가 없습니다. 크롤링을 종료합니다.&quot;)
                break # 루프 종료


    except Exception as e:
        # &quot;다음&quot; 버튼이 아예 없을 경우 (마지막 페이지)
        print(f&quot;\n다음 페이지 버튼을 찾을 수 없습니다. 크롤링을 종료합니다. 오류: {e}&quot;)
        break # 루프 종료

    time.sleep(5) # 페이지 로딩 대기
    page_index += 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적인 과정은 나중에 추가할 수 있으면 추가하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 속도가 좀 느리다 중간중간 대기시간을 넣다 보니.. 대기시간을 안 넣으면 사이트가 계속 막혀서 어쩔 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진행이 안되느니 그냥 시간을 조금 더 쓰는걸로..ㅎㅎ&lt;/p&gt;</description>
      <category>공부/빅데이터 분석</category>
      <category>MySQL</category>
      <category>Python</category>
      <category>SQL</category>
      <category>웹크롤링</category>
      <category>파이썬</category>
      <author>hfairy</author>
      <guid isPermaLink="true">https://ryd-gmswjr.tistory.com/12</guid>
      <comments>https://ryd-gmswjr.tistory.com/12#entry12comment</comments>
      <pubDate>Fri, 4 Jul 2025 20:38:32 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] 데이터베이스 구축 및 테이블 생성</title>
      <link>https://ryd-gmswjr.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL을 기반으로 실습 진행하였으며 버전은 8.1.0이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(mysql --version)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;데이터베이스 생성&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;CREATE DATABASE IF NOT EXISTS cosmetic_db;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'&lt;b&gt;CREATE DATABASE&lt;/b&gt;'를 이용해 'cosmetic_db'라는 데이터베이스를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 중복 생성을 방지하기 위해 '&lt;b&gt;IF NOT EXISTS&lt;/b&gt;' 옵션을 넣어 만약 'cosmetic_db'라는 데이터베이스가 존재한다면 새로 생성하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751309627586&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SHOW databases;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m4ktE/btsOZeH3iOa/ntUqHmrQXN13DWVfbYnOx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m4ktE/btsOZeH3iOa/ntUqHmrQXN13DWVfbYnOx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m4ktE/btsOZeH3iOa/ntUqHmrQXN13DWVfbYnOx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm4ktE%2FbtsOZeH3iOa%2FntUqHmrQXN13DWVfbYnOx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;323&quot; height=&quot;405&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;테이블 생성&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1751309335288&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 어떤 db 내에서 SQL문을 실행할 것인지 설정
USE cosmetic_db;
# 테이블 생성
CREATE TABLE derma_review_tb (
    review_num int auto_increment primary key,
    review_text varchar(500),
    crawling_date datetime DEFAULT CURRENT_TIMESTAMP,
    url varchar(500)
    );&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;USE cosmetic_db&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 앞으로의 SQL문은 'cosmetic_db'&amp;nbsp; 내에서 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CREATE TABLE&amp;nbsp; derma_review_tb&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 'derma_review_tb'라는 테이블을 생성하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;review_num int auto_increment primary key&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 'review_num'이라는 컬럼을 생성한다. 이 컬럼 내에는 정수형(int) 데이터가 새로운 행이 추가될 때마다 자동으로 1씩 증가( &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;auto_increment&lt;/span&gt;)하여 저장되며, 이 값들은 고유한 값(primary key)을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;review_text varchar(500)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 'review_text'라는 컬럼을 생성한다. 이 컬럼 내에는 가변 길이 문자열 데이터를 저장하며 최대 500자까지 저장할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;crawling_date datetime DEFAULT CURRENT_TIMESTAMP&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: ' crawling_date'라는 컬럼을 생성한다. 이 컬럼에는 날짜와 시간 정보(datetime)를 저장하며, 이 컬럼에 따로 값을 넣지 않으면 데이터가 저장되는 시각(DEFAULT CURRENT_TIMESTAMP)이 자동으로 입력되어 데이터 수집 시점을 기록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;url varchar(500)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 'url'이라는 컬럼을 생성한다. 이 컬럼 내에는 가변 길이 문자열 데이터를 저장하며 최대 500자까지 저장할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;컬럼 추가&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1751391291996&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALTER TABLE derma_review_tb
ADD COLUMN site_name VARCHAR(50) after crawling_date,
ADD COLUMN product_name VARCHAR(50) after review_num,
ADD COLUMN review_date VARCHAR(50) after review_text;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ALTER&amp;nbsp;TABLE&amp;nbsp;derma_review_tb&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 'derma_review_tb'라는 테이블을 수정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;ADD COLUMN site_name VARCHAR(50) after crawling_date&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 'site_name'이라는 컬럼을 'crawling_date' 컬럼 바로 뒤에(after&amp;nbsp;crawling_date) 추가한다. 데이터 타입은 VARCHAR이고 최대 50자까지의 문자열을 저장할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;ADD COLUMN product_name VARCHAR(50) after review_num&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 'product_name'이라는 컬럼을 'review_num'컬럼 바로 뒤에(after review_num) 추가한다. 데이터 타입은 VARCHAR이고 최대 50자까지의 문자열을 저장할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;ADD COLUMN review_date VARCHAR(50) after review_text&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 'review_date'라는 컬럼을 'review_text'컬럼 바로 뒤에(after&amp;nbsp;review_text) 추가한다. 데이터 타입은 VARCHAR이고 최대 50자까지의 문자열을 저장할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;테이블 컬럼 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 생성한 테이블의 컬럼을 확인하기 위해 아래와 같이 쿼리를 작성하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1751392680789&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;USE cosmetic_db;
SHOW COLUMNS FROM derma_review_tb;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E4tIt/btsO0xViXEH/fD1OCeqdxHfPIIIgnBt4YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E4tIt/btsO0xViXEH/fD1OCeqdxHfPIIIgnBt4YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E4tIt/btsO0xViXEH/fD1OCeqdxHfPIIIgnBt4YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE4tIt%2FbtsO0xViXEH%2FfD1OCeqdxHfPIIIgnBt4YK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;374&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 컬럼의 목적은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;review_num&lt;/b&gt;(primary&amp;nbsp;key):&amp;nbsp;고유번호 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;product_name&lt;/b&gt;:&amp;nbsp;제품명 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;review_text&lt;/b&gt;:&amp;nbsp;리뷰&amp;nbsp;내용 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;review_date&lt;/b&gt;:&amp;nbsp;리뷰&amp;nbsp;작성&amp;nbsp;일자 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;crawling_date&lt;/b&gt;:&amp;nbsp;크롤링한&amp;nbsp;날짜&amp;nbsp;및&amp;nbsp;시간 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;site_name&lt;/b&gt;:&amp;nbsp;크롤링한&amp;nbsp;사이트&amp;nbsp;이름(쿠팡,&amp;nbsp;네이버쇼핑&amp;nbsp;등) &lt;br /&gt;&lt;br /&gt;&lt;b&gt;url&lt;/b&gt;: 크롤링한 사이트 url&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/빅데이터 분석</category>
      <category>MySQL</category>
      <category>SQL</category>
      <author>hfairy</author>
      <guid isPermaLink="true">https://ryd-gmswjr.tistory.com/11</guid>
      <comments>https://ryd-gmswjr.tistory.com/11#entry11comment</comments>
      <pubDate>Wed, 2 Jul 2025 03:02:27 +0900</pubDate>
    </item>
    <item>
      <title>[웹크롤링] 유튜브 숏츠 댓글 크롤링하기</title>
      <link>https://ryd-gmswjr.tistory.com/10</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유튜브 쇼츠 영상에서 댓글을 크롤링하는 코드를 작성할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 서버에 연결해서 데이터베이스를 구축하였고, HeidiSQL을 이용하면 MySQL과 연결해 훨씬 수월하게 데이터를 관리할 수 있다. 삽입이나 삭제도 쉽고 시각적으로도 보기 편하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 쉽게 수정하다 보니 SQL 명령문을 계속 까먹어서 간단한 건 직접 쿼리를 작성하려고 노력할 것이다..ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;selenium이란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;selenium은 웹 브라우저 자동화 툴이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해 브라우저를 직접 실행하지 않고 원하는 기능을 코드로 입력하면 selenium의 메소드를 통해 웹 브라우저의 기능을 사용할 수 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 파이참을 사용하고 있고, 아래 사진처럼 패키지 설치할 수 있는 메뉴가 있는데 나는 이미 설치되어 있어서 오른쪽에 'Uninstall'이라고 뜨지만 설치가 안되어 있으면 'Install'이라고 뜨니 눌러서 설치하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDKqAs/btsOyZDVtGE/5O38zMNBpYaennscpHkO8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDKqAs/btsOyZDVtGE/5O38zMNBpYaennscpHkO8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDKqAs/btsOyZDVtGE/5O38zMNBpYaennscpHkO8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDKqAs%2FbtsOyZDVtGE%2F5O38zMNBpYaennscpHkO8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1022&quot; height=&quot;269&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 방법으로는 아래처럼 파이참 내부 터미널에 'pip install selenium'을 입력해서 설치할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqLhen/btsOuw3K2uX/ayV3V3RiyLWMoKQ7hKzUl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqLhen/btsOuw3K2uX/ayV3V3RiyLWMoKQ7hKzUl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqLhen/btsOuw3K2uX/ayV3V3RiyLWMoKQ7hKzUl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqLhen%2FbtsOuw3K2uX%2FayV3V3RiyLWMoKQ7hKzUl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;351&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 브라우저에 맞는&amp;nbsp; webdriver도 설치해야 하는데 나는 아래 링크에서 설치하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://googlechromelabs.github.io/chrome-for-testing/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://googlechromelabs.github.io/chrome-for-testing/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1749402396812&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Chrome for Testing availability&quot; data-og-description=&quot;chrome-headless-shellmac-arm64https://storage.googleapis.com/chrome-for-testing-public/137.0.7151.68/mac-arm64/chrome-headless-shell-mac-arm64.zip200&quot; data-og-host=&quot;googlechromelabs.github.io&quot; data-og-source-url=&quot;https://googlechromelabs.github.io/chrome-for-testing/&quot; data-og-url=&quot;https://googlechromelabs.github.io/chrome-for-testing/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://googlechromelabs.github.io/chrome-for-testing/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://googlechromelabs.github.io/chrome-for-testing/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Chrome for Testing availability&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;chrome-headless-shellmac-arm64https://storage.googleapis.com/chrome-for-testing-public/137.0.7151.68/mac-arm64/chrome-headless-shell-mac-arm64.zip200&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;googlechromelabs.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 윈도우 64비트를 사용하고 있기 때문에 'win64' 버전을 다운받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(각 운영체제에 따라 작성된 URL에 접속하면 다운로드가 실행된다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1568&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buWQf2/btsOyr8ws2M/8nuISHF8Tug3MI1PzQXWFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buWQf2/btsOyr8ws2M/8nuISHF8Tug3MI1PzQXWFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buWQf2/btsOyr8ws2M/8nuISHF8Tug3MI1PzQXWFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuWQf2%2FbtsOyr8ws2M%2F8nuISHF8Tug3MI1PzQXWFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1568&quot; height=&quot;214&quot; data-origin-width=&quot;1568&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한 파일은 웹크롤링 코드를 저장할 폴더 안에 같이 넣어놓았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;데이터베이스 구축&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 내가 구축한 DB와 table 정보이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB name: youtube&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;table name: youtube_crawling&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCvPvV/btsOr1Kmra0/dDMBbAkQjeL8UPmarZSyaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCvPvV/btsOr1Kmra0/dDMBbAkQjeL8UPmarZSyaK/img.png&quot; data-alt=&quot;HeidiSQL 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCvPvV/btsOr1Kmra0/dDMBbAkQjeL8UPmarZSyaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCvPvV%2FbtsOr1Kmra0%2FdDMBbAkQjeL8UPmarZSyaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;272&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HeidiSQL 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'datetime' : 크롤링한 시간을 기록하기 위한 열&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'data' : 댓글 내용을 저장할 열&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'url' : 어떤 영상에서 긁어온 댓글인지 파악하기 위해 영상의 url을 저장할 열&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코드작성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 다이소 아이템들이 인기가 있어서 유튜브에 '다이소 추천템'이라고 검색한 후 몇 가지 영상을 선택하여 크롤링에 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from selenium import webdriver
import time
import mysql.connector
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By

# 검색어: 다이소 추천템

url1 = &quot;https://www.youtube.com/shorts/s6o3xpXSYFs&quot;
url2 = &quot;https://www.youtube.com/shorts/MfjnCiRxIu0&quot;

url_list = [ url1, url2 ]

# CHROME 실행
driver = webdriver.Chrome()

# 테이블에 삽입할 댓글과 url 담기 위한 리스트
# url은 어떤 영상에서 크롤링한 댓글인지 파악하기 위해 수집
comment_text_list = []

# url_list 안에 있는 url 모두 접속
for url in url_list:
	# 브라우저 열기. 웹 로딩되는 시간 2초정도 대기.
    driver.get(url)
    time.sleep(2)
	
    # 댓글 버튼 클릭 -&amp;gt; 댓글창 띄움
    element = driver.find_element(By.ID, &quot;comments-button&quot;).find_element(By.CLASS_NAME, &quot;yt-spec-button-shape-next&quot;)
    driver.execute_script(&quot;arguments[0].click();&quot;, element)

    # 댓글이 로딩 3초정도 대기
    time.sleep(3)

	
    # 댓글 더보기 기능을 위해 댓글창에서 아래로 스크롤하기(PAGE_DOWN 이용)
    comment_elements = driver.find_elements(By.ID, &quot;contents&quot;)[1]

    for scroll_i in range(1, 15):
        comment_elements.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.4)

	# 댓글 내용 찾기
    comment_elements2 = comment_elements.find_elements(By.ID, &quot;content-text&quot;)

	# 댓글 내용을 comment_text_list에 저장
    for comment_element in comment_elements2:
        comment_text_list.append([comment_element.text, url])


	# 댓글 개수 출력
    print(&quot;댓글 개수&quot;, len(comment_text_list))


driver.quit()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드를 통해 댓글은 수집하였고 수집한 댓글을 테이블 내에 데이터로 저장하는 코드를 아래에 함께 작성하였다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;host = '127.0.0.1'
database = 'youtube'
user = 'root'
password = '****' # 비밀번호 입력

# MySQL 서버에 연결
conn = mysql.connector.connect(host=host, database=database, user=user, password=password)

# cursor 생성 : DB와 상호작용하여 SQL문 실행할 수 있는 환경 제공
cursor = conn.cursor()

# 데이터 삽입 쿼리 작성
query = &quot;INSERT INTO youtube_crawling (data, url) VALUES (%s, %s)&quot;


for comment_text in comment_text_list:
    insert_data = (comment_text[0], comment_text[1])
    cursor.execute(query, insert_data)

# commit : 변경 사항 저장하여 DB에 최종 반영됨
conn.commit()
# 연결 종료
conn.close()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서&amp;nbsp;잠깐..&amp;nbsp;간혹&amp;nbsp;데이터의&amp;nbsp;길이가&amp;nbsp;테이블&amp;nbsp;생성시에&amp;nbsp;설정한&amp;nbsp;크기보다&amp;nbsp;클&amp;nbsp;때&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;'Data&amp;nbsp;too&amp;nbsp;long&amp;nbsp;for&amp;nbsp;column&amp;nbsp;'data'&amp;nbsp;at&amp;nbsp;row&amp;nbsp;1'&lt;/span&gt;&amp;nbsp;라는&amp;nbsp;오류가&amp;nbsp;뜰&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;이&amp;nbsp;문제를&amp;nbsp;해결하기&amp;nbsp;위해&amp;nbsp;쿼리에&amp;nbsp;전달할&amp;nbsp;'comment_text[0]'의&amp;nbsp;크기를&amp;nbsp;600으로&amp;nbsp;제한할&amp;nbsp;것이다.&amp;nbsp;변경된&amp;nbsp;코드는&amp;nbsp;아래와&amp;nbsp;같다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749667301535&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;host = '127.0.0.1'
database = 'youtube'
user = 'root'
password = '****' # 비밀번호 입력

# MySQL 서버에 연결
conn = mysql.connector.connect(host=host, database=database, user=user, password=password)

# cursor 생성 : DB와 상호작용하여 SQL문 실행할 수 있는 환경 제공
cursor = conn.cursor()

# 데이터 삽입 쿼리 작성
query = &quot;INSERT INTO youtube_crawling (data, url) VALUES (%s, %s)&quot;


for comment_text in comment_text_list:
	# data에 넣을 값의 크기 600으로 제한(600자까지만 자름)
    insert_data = (comment_text[0][:600], comment_text[1])
    cursor.execute(query, insert_data)

# commit : 변경 사항 저장하여 DB에 최종 반영됨
conn.commit()
# 연결 종료
conn.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 실행의 결과 삽입된 데이터를 확인하면 아래와 같이 잘 저장된 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;785&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YqHOJ/btsOtgGvmqg/7H4LKldlvZVjMZ9DtqOTCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YqHOJ/btsOtgGvmqg/7H4LKldlvZVjMZ9DtqOTCK/img.png&quot; data-alt=&quot;MySQL Workbench&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YqHOJ/btsOtgGvmqg/7H4LKldlvZVjMZ9DtqOTCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYqHOJ%2FbtsOtgGvmqg%2F7H4LKldlvZVjMZ9DtqOTCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;785&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;785&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MySQL Workbench&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;완성된 코드 1&lt;/b&gt;&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from selenium import webdriver
import time
import mysql.connector
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By

# 검색어: 다이소 추천템

url1 = &quot;https://www.youtube.com/shorts/s6o3xpXSYFs&quot;
url2 = &quot;https://www.youtube.com/shorts/MfjnCiRxIu0&quot;

url_list = [ url1, url2 ]

# CHROME 실행
driver = webdriver.Chrome()

# 테이블에 삽입할 댓글과 url 담기 위한 리스트
# url은 어떤 영상에서 크롤링한 댓글인지 파악하기 위해 수집
comment_text_list = []

# url_list 안에 있는 url 모두 접속
for url in url_list:
	# 브라우저 열기. 웹 로딩되는 시간 2초정도 대기.
    driver.get(url)
    time.sleep(2)
	
    # 댓글 버튼 클릭 -&amp;gt; 댓글창 띄움
    element = driver.find_element(By.ID, &quot;comments-button&quot;).find_element(By.CLASS_NAME, &quot;yt-spec-button-shape-next&quot;)
    driver.execute_script(&quot;arguments[0].click();&quot;, element)

    # 댓글이 로딩 3초정도 대기
    time.sleep(3)

	
    # 댓글창에서 아래로 스크롤하기(PAGE_DOWN 이용)
    comment_elements = driver.find_elements(By.ID, &quot;contents&quot;)[1]

    for scroll_i in range(1, 15):
        comment_elements.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.4)

	# 댓글 내용 찾기
    comment_elements2 = comment_elements.find_elements(By.ID, &quot;content-text&quot;)

	# 댓글 내용을 comment_text_list에 저장
    for comment_element in comment_elements2:
        comment_text_list.append([comment_element.text, url])


	# 댓글 개수 출력
    print(&quot;댓글 개수&quot;, len(comment_text_list))

driver.quit()


host = '127.0.0.1'
database = 'youtube'
user = 'root'
password = '****' # 비밀번호 입력

# MySQL 서버에 연결
conn = mysql.connector.connect(host=host, database=database, user=user, password=password)

# cursor 생성 : DB와 상호작용하여 SQL문 실행할 수 있는 환경 제공
cursor = conn.cursor()

# 데이터 삽입 쿼리 작성
query = &quot;INSERT INTO youtube_crawling (data, url) VALUES (%s, %s)&quot;


for comment_text in comment_text_list:
	# data에 넣을 값의 크기 600으로 제한(600자까지만 자름)
    insert_data = (comment_text[0][:600], comment_text[1])
    cursor.execute(query, insert_data)

# commit : 변경 사항 저장하여 DB에 최종 반영됨
conn.commit()
# 연결 종료
conn.close()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;텍스트 파일로 URL 관리하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 더 많은 영상에서 댓글을 크롤링하기 위해 URL을 텍스트 파일로 저장하고 파일을 읽는 방법이 있는데, 이 방법을 사용하면 코드 길이도 줄일 수 있고 더 많은 영상 주소를 저장하고 삭제하기 편리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 아래와 같이 txt 파일을 생성하고 여러개의 영상 주소를 저장한다. 나는 일단 11개 정도를 작성하였다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u9yc8/btsOweb0D57/Qid2m7xfNNcqVjK8U6W81k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u9yc8/btsOweb0D57/Qid2m7xfNNcqVjK8U6W81k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u9yc8/btsOweb0D57/Qid2m7xfNNcqVjK8U6W81k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu9yc8%2FbtsOweb0D57%2FQid2m7xfNNcqVjK8U6W81k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;277&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아래와 같이 수정해 주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;url1 = &quot;https://www.youtube.com/shorts/s6o3xpXSYFs&quot;
url2 = &quot;https://www.youtube.com/shorts/MfjnCiRxIu0&quot;

url_list = [ url1, url2 ]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;darr;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1749665661846&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with open(&quot;./youtube_link.txt&quot;) as fr:
    url_list = [row.strip() for row in fr.readlines()]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;완성된 코드 2&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1749667573743&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from selenium import webdriver
import time
import mysql.connector
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By

# 검색어: 다이소 추천템
# 영상 링크 저장한 텍스트 파일에서 주소 읽어옴
with open(&quot;./youtube_link.txt&quot;) as fr:
    url_list = [row.strip() for row in fr.readlines()]

# CHROME 실행
driver = webdriver.Chrome()

# 테이블에 삽입할 댓글과 url 담기 위한 리스트
# url은 어떤 영상에서 크롤링한 댓글인지 파악하기 위해 수집
comment_text_list = []

# url_list 안에 있는 url 모두 접속
for url in url_list:
	# 브라우저 열기. 웹 로딩되는 시간 2초정도 대기.
    driver.get(url)
    time.sleep(2)
	
    # 댓글 버튼 클릭 -&amp;gt; 댓글창 띄움
    element = driver.find_element(By.ID, &quot;comments-button&quot;).find_element(By.CLASS_NAME, &quot;yt-spec-button-shape-next&quot;)
    driver.execute_script(&quot;arguments[0].click();&quot;, element)

    # 댓글이 로딩 3초정도 대기
    time.sleep(3)

	
    # 댓글창에서 아래로 스크롤하기(PAGE_DOWN 이용)
    comment_elements = driver.find_elements(By.ID, &quot;contents&quot;)[1]

    for scroll_i in range(1, 15):
        comment_elements.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.4)

	# 댓글 내용 찾기
    comment_elements2 = comment_elements.find_elements(By.ID, &quot;content-text&quot;)

	# 댓글 내용을 comment_text_list에 저장
    for comment_element in comment_elements2:
        comment_text_list.append([comment_element.text, url])


	# 댓글 개수 출력
    print(&quot;댓글 개수&quot;, len(comment_text_list))

driver.quit()


host = '127.0.0.1'
database = 'youtube'
user = 'root'
password = '****' # 비밀번호 입력

# MySQL 서버에 연결
conn = mysql.connector.connect(host=host, database=database, user=user, password=password)

# cursor 생성 : DB와 상호작용하여 SQL문 실행할 수 있는 환경 제공
cursor = conn.cursor()

# 데이터 삽입 쿼리 작성
query = &quot;INSERT INTO youtube_crawling (data, url) VALUES (%s, %s)&quot;


for comment_text in comment_text_list:
	# data에 넣을 값의 크기 600으로 제한(600자까지만 자름)
    insert_data = (comment_text[0][:600], comment_text[1])
    cursor.execute(query, insert_data)

# commit : 변경 사항 저장하여 DB에 최종 반영됨
conn.commit()
# 연결 종료
conn.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/빅데이터 분석</category>
      <category>MySQL</category>
      <category>Python</category>
      <category>Selenium</category>
      <category>댓글크롤링</category>
      <category>웹크롤링</category>
      <category>유튜브크롤링</category>
      <category>크롤링</category>
      <author>hfairy</author>
      <guid isPermaLink="true">https://ryd-gmswjr.tistory.com/10</guid>
      <comments>https://ryd-gmswjr.tistory.com/10#entry10comment</comments>
      <pubDate>Thu, 12 Jun 2025 03:49:54 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬, C언어] $ 백준 - 1008번 문제 풀이</title>
      <link>https://ryd-gmswjr.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[문제] 1008번 - A / B &lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;945&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ3mJJ/btsNC9vbWkX/1mEIkFL3A6Clfgdh9urY6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ3mJJ/btsNC9vbWkX/1mEIkFL3A6Clfgdh9urY6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ3mJJ/btsNC9vbWkX/1mEIkFL3A6Clfgdh9urY6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ3mJJ%2FbtsNC9vbWkX%2F1mEIkFL3A6Clfgdh9urY6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;552&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;945&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수로 A와 B를 입력받고 A / B를 출력하는 프로그램을 작성하라는 문제.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; [파이썬] 정답 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1745864314053&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;A, B = input().split()
A = int(A)
B = int(B)

print(A / B)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[파이썬] - split() 함수&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;split() 함수는 특정 구분자를 기준으로 문자열을 나누어 리스트를 반환하는 함수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 위의 문제에서 입력으로 &amp;lsquo;1 3&amp;rsquo;을 입력했는데 여기서 1과 3이 공백(space)으로 구분되어 각각 A와 B에 삽입되기 때문에 split() 함수를 통해 1과 3을 분리해주는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 A와 B에 저장된 값을 확인해 보자.&lt;/p&gt;
&lt;pre id=&quot;code_1745864569868&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A, B = input().split()
A = int(A)
B = int(B)

print('A의 값은',A, '이고, B의 값은',B, '이다.')

&amp;gt;&amp;gt; INPUT : 1 3
&amp;gt;&amp;gt; OUTPUT : A의 값은 1 이고, B의 값은 3 이다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 문자열을 입력받고 ',(콤마)'로 문자를 구분하고 싶다면 어떻게 코드를 작성할 수 있을까?&lt;/p&gt;
&lt;pre id=&quot;code_1745864382928&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;s = input().split(',')
print(s)

&amp;gt;&amp;gt;INPUT : KIM,LEE,PARK,CHOI
&amp;gt;&amp;gt;OUTPUT : ['KIM', 'LEE', 'PARK', 'CHOI']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input값으로 &amp;lsquo;KIM,LEE,PARK,CHOI&amp;rsquo;를 입력하였고 결과적으로 s에는 &amp;lsquo;,(콤마)&amp;rsquo;를 기준으로 문자열을 분리하여 [&amp;lsquo;KIM&amp;rsquo;, &amp;lsquo;LEE&amp;rsquo;, &amp;lsquo;PARK&amp;rsquo;, &amp;lsquo;CHOI&amp;rsquo;]의 리스트가 저장되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; [C언어] 정답 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1745864981355&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main()
{
	int A;
	int B;
	
	scanf_s(&quot;%d %d&quot;, &amp;amp;A, &amp;amp;B);
	printf(&quot;%.9f&quot;, (double)A / B);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[C언어] - 자료형(Data Type)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 자료형은 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자형(Character)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;char(1&amp;nbsp;byte) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;정수형(Integer)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;int(4&amp;nbsp;byte) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;부동 소수점(Floating Point)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;float(&amp;nbsp;4&amp;nbsp;byte&amp;nbsp;|&amp;nbsp;소수점&amp;nbsp;이하&amp;nbsp;6자리),&amp;nbsp;double(&amp;nbsp;8&amp;nbsp;byte&amp;nbsp;|&amp;nbsp;소수점&amp;nbsp;이하&amp;nbsp;15자리)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[C언어] - 포맷 스트링&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자(Chatacter): 문자 한 글자에 대한 형식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;%c&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;문자열(String): 문자열에 대한 형식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;%s&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;정수(Integer): 정수에 대한 형식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;%u (부호 없는 10진수 정수)&lt;/li&gt;
&lt;li&gt;%d (10진수 정수)&lt;/li&gt;
&lt;li&gt;%o (8진수 정수)&lt;/li&gt;
&lt;li&gt;%x (16진수 정수 | %x일 경우 영어로 표기되는 부분이 소문자로, %X일 경우 영어로 표기되는 부분이 대문자로 표기됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;부동 소수점(Floating Point)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;%e, %E (지수 표기)&lt;/li&gt;
&lt;li&gt;%f (부동 소수점 표기 | Floating Point)&lt;/li&gt;
&lt;li&gt;%lf (부동 소수점 표기 | Long Floating Point)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부/프로그래밍 언어</category>
      <category>c언어</category>
      <category>split()</category>
      <category>split()함수</category>
      <category>백준</category>
      <category>백준 1008번</category>
      <category>자료형</category>
      <category>파이썬</category>
      <category>포맷 스트링</category>
      <author>hfairy</author>
      <guid isPermaLink="true">https://ryd-gmswjr.tistory.com/9</guid>
      <comments>https://ryd-gmswjr.tistory.com/9#entry9comment</comments>
      <pubDate>Tue, 29 Apr 2025 03:35:40 +0900</pubDate>
    </item>
    <item>
      <title>[DREAMHACK] cookie 풀이</title>
      <link>https://ryd-gmswjr.tistory.com/8</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz0YmJ/btsDz9lh0Rx/1SMVFL2kVb8Kk7ZFnlKcHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz0YmJ/btsDz9lh0Rx/1SMVFL2kVb8Kk7ZFnlKcHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz0YmJ/btsDz9lh0Rx/1SMVFL2kVb8Kk7ZFnlKcHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz0YmJ%2FbtsDz9lh0Rx%2F1SMVFL2kVb8Kk7ZFnlKcHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;339&quot; height=&quot;244&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;244&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uc0jq/btsDDZO4mKT/crwxIHkbGGmapQt86XkOD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uc0jq/btsDDZO4mKT/crwxIHkbGGmapQt86XkOD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uc0jq/btsDDZO4mKT/crwxIHkbGGmapQt86XkOD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuc0jq%2FbtsDDZO4mKT%2FcrwxIHkbGGmapQt86XkOD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;449&quot; height=&quot;163&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드림핵의 cookie 웹해킹 문제 중 가장 기본적인 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* cookie: 웹에 접속할 때 서버가 사용자의 정보를 저장한 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t85Xq/btsDAhp7JLS/iilXZMf0UNK15rEfPTXKBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t85Xq/btsDAhp7JLS/iilXZMf0UNK15rEfPTXKBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t85Xq/btsDAhp7JLS/iilXZMf0UNK15rEfPTXKBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft85Xq%2FbtsDAhp7JLS%2FiilXZMf0UNK15rEfPTXKBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;981&quot; height=&quot;224&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 생성된 주소로 접속하면 위와 같은 사이트에 접속된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 제목이 cookie이므로 쿠키값을 변조해 로그인해야 할 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/urUp8/btsE6H7A8JW/wbWUX16k0X1rTU5a7XVxZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/urUp8/btsE6H7A8JW/wbWUX16k0X1rTU5a7XVxZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/urUp8/btsE6H7A8JW/wbWUX16k0X1rTU5a7XVxZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FurUp8%2FbtsE6H7A8JW%2FwbWUX16k0X1rTU5a7XVxZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;381&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주어진 코드에 'guest'의 패스워드가 'guest'인 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FtwXq/btsE1CFX0s3/qXouCHoziWxIs0cxZWFqMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FtwXq/btsE1CFX0s3/qXouCHoziWxIs0cxZWFqMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FtwXq/btsE1CFX0s3/qXouCHoziWxIs0cxZWFqMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFtwXq%2FbtsE1CFX0s3%2FqXouCHoziWxIs0cxZWFqMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;234&quot; height=&quot;287&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boTbXS/btsE0sjkquK/ZgLlKPCMacE9EaTKpukqRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boTbXS/btsE0sjkquK/ZgLlKPCMacE9EaTKpukqRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boTbXS/btsE0sjkquK/ZgLlKPCMacE9EaTKpukqRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboTbXS%2FbtsE0sjkquK%2FZgLlKPCMacE9EaTKpukqRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;423&quot; height=&quot;170&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- guest로 로그인하면 'Hello guest, you are not admin'라는 문장이 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- admin으로 로그인하면 문제를 해결할 수 있을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k6dis/btsEZBVcT7x/mfWWxMVBg7svxb7KGEOP2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k6dis/btsEZBVcT7x/mfWWxMVBg7svxb7KGEOP2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k6dis/btsEZBVcT7x/mfWWxMVBg7svxb7KGEOP2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6dis%2FbtsEZBVcT7x%2FmfWWxMVBg7svxb7KGEOP2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;405&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYaLBu/btsEZQdHUaQ/tTiSHzXMElKDufC2mgRC71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYaLBu/btsEZQdHUaQ/tTiSHzXMElKDufC2mgRC71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYaLBu/btsEZQdHUaQ/tTiSHzXMElKDufC2mgRC71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYaLBu%2FbtsEZQdHUaQ%2FtTiSHzXMElKDufC2mgRC71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;387&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발자 도구에서 username을 'admin'으로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tb66R/btsEZzps56V/Hv53C1J4lkkMrEANaQRaMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tb66R/btsEZzps56V/Hv53C1J4lkkMrEANaQRaMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tb66R/btsEZzps56V/Hv53C1J4lkkMrEANaQRaMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTb66R%2FbtsEZzps56V%2FHv53C1J4lkkMrEANaQRaMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;191&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 플래그를 얻었다.&lt;/p&gt;</description>
      <category>워게임/DREAMHACK</category>
      <author>hfairy</author>
      <guid isPermaLink="true">https://ryd-gmswjr.tistory.com/8</guid>
      <comments>https://ryd-gmswjr.tistory.com/8#entry8comment</comments>
      <pubDate>Tue, 20 Feb 2024 00:21:02 +0900</pubDate>
    </item>
  </channel>
</rss>