<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>B급 코드 리뷰</title>
    <link>https://iamgus.tistory.com/</link>
    <description>책과 IT뉴스에 대한 B급 감성 리뷰로 디지탈노마드 세상에 다가간다.</description>
    <language>ko</language>
    <pubDate>Fri, 12 Jun 2026 17:00:01 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>디마드</managingEditor>
    <image>
      <title>B급 코드 리뷰</title>
      <url>https://tistory1.daumcdn.net/tistory/367554/attach/3dfa6b14817c44269485494507723ab7</url>
      <link>https://iamgus.tistory.com</link>
    </image>
    <item>
      <title>여름 필수템! 선글라스 리뷰</title>
      <link>https://iamgus.tistory.com/763</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;햇살이 강해지면서 밖에 나가기가 두려워지는 요즘, 선글라스가 필요하다는 생각이 들더라고요. &quot;이 여름, 어떤 선글라스를 선택해야 할까?&quot; 고민하던 중에 우연히 이 선글라스를 발견하게 되었답니다!&lt;/li&gt;
&lt;li&gt;친구가 추천해준 이 선글라스는 디자인이 세련되면서도 가격이 부담스럽지 않아서, 즉시 구매를 결심했어요. 특히, 일상에서 활용하기에도 좋을 것 같아 더욱 끌렸답니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  선글라스 첫인상&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음 착용했을 때의 느낌은 정말 상쾌했어요! 프레임이 가벼워서 안정감이 있었고, 디자인이 심플하면서도 세련된 느낌을 주더라고요. 여기에 UV 차단 기능까지 있으니, 여름철 외출에 안성맞춤이네요.&lt;/li&gt;
&lt;li&gt;  선글라스 제품 이미지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.coupang.com/np/search?q=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;lptag=AF7819398&amp;amp;itime=20250720170238&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250720170238&amp;amp;redirect=landing&amp;amp;subId=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&quot;&gt;&lt;img src=&quot;https://ecimg.cafe24img.com/pg1512b58569568085/ratigre2022/web/product/big/20250304/06e4dc7a77b36a4d4b541d7ae495cfd1.jpg&quot; alt=&quot;선글라스 이미지 1&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.coupang.com/np/search?q=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;lptag=AF7819398&amp;amp;itime=20250720170238&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250720170238&amp;amp;redirect=landing&amp;amp;subId=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&quot;&gt;&lt;img src=&quot;https://d2v80xjmx68n4w.cloudfront.net/members/portfolios/VeMS61747209297.jpg?w=500&quot; alt=&quot;선글라스 이미지 2&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.coupang.com/np/search?q=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;lptag=AF7819398&amp;amp;itime=20250720170238&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250720170238&amp;amp;redirect=landing&amp;amp;subId=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&quot;&gt;&lt;img src=&quot;https://i.ytimg.com/vi/aLSS6AqOiUE/hqdefault.jpg&quot; alt=&quot;선글라스 이미지 3&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠팡 링크 삽입: &quot;더 자세한 모습은 &lt;a href=&quot;https://www.coupang.com/np/search?q=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;lptag=AF7819398&amp;amp;itime=20250720170238&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250720170238&amp;amp;redirect=landing&amp;amp;subId=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&quot;&gt;여기&lt;/a&gt;에서 확인하세요!&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;선글라스의 매력 포인트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;UV 차단 기능&lt;/b&gt;: 이 선글라스는 UV 차단 기능이 뛰어나서, 강한 햇빛 아래에서도 눈이 편안해요. 바닷가에서 일광욕을 할 때도 정말 편안하게 사용할 수 있었답니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;경량 디자인&lt;/b&gt;: 가벼운 프레임 덕분에 장시간 착용해도 불편함이 없어요. 오랜 시간 외출할 때도 부담이 없었답니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모던한 스타일&lt;/b&gt;: 어떤 의상에도 잘 어울리는 디자인이라, 데일리룩에 쉽게 매치할 수 있어요. 친구들과의 바베큐 자리에서도 주목받았답니다!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;장단점 솔직 리뷰&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  이건 정말 좋아요!&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;스타일과 편안함&lt;/b&gt;: 이 선글라스는 스타일과 편안함 모두를 갖추고 있어요. 일상에서 자주 사용하게 될 것 같네요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;합리적인 가격&lt;/b&gt;: 가성비가 좋고, 품질도 괜찮아서 매우 만족스럽습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  조금 아쉬운 점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;케이스가 약간 부실함&lt;/b&gt;: 선글라스를 보관하는 케이스가 조금 약해 보였어요. 좀 더 튼튼했으면 좋았을 것 같아요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  선글라스 상세 스펙&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;사양&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UV 차단&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프레임 소재&lt;/td&gt;
&lt;td&gt;경량 플라스틱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;무게&lt;/td&gt;
&lt;td&gt;25g&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이런 분들께 추천!&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여름철에 자주 외출하는 분들께 적합해요!&lt;/li&gt;
&lt;li&gt;패션에 신경 쓰시는 분들에게도 잘 어울릴 것 같아요.&lt;/li&gt;
&lt;li&gt;가벼운 선글라스를 찾는 분들께 특히 추천합니다!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구매 전 꼭 확인하세요&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구매 전에는 UV 차단 기능이 있는지 꼭 확인하세요. 여름에 강한 햇빛을 피할 수 있는 좋은 방법이니까요!&lt;/li&gt;
&lt;li&gt;최신 가격과 할인은 &lt;a href=&quot;https://www.coupang.com/np/search?q=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;lptag=AF7819398&amp;amp;itime=20250720170238&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250720170238&amp;amp;redirect=landing&amp;amp;subId=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&quot;&gt;여기&lt;/a&gt;에서 확인하세요!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리: 내 돈 내산 솔직 후기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전반적으로 이 선글라스는 가성비와 스타일을 모두 만족시켜 주는 제품이에요. 여름철 필수 아이템으로 강력 추천합니다! 궁금하다면 &lt;a href=&quot;https://www.coupang.com/np/search?q=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;lptag=AF7819398&amp;amp;itime=20250720170238&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250720170238&amp;amp;redirect=landing&amp;amp;subId=%EC%84%A0%EA%B8%80%EB%9D%BC%EC%8A%A4&quot;&gt;쿠팡에서 확인&lt;/a&gt;하고 최신 할인 놓치지 마세요!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.&lt;/p&gt;
&lt;!-- SEO Keywords: {&quot;primary_keywords&quot;: [&quot;선글라스&quot;], &quot;long_tail_keywords&quot;: [&quot;선글라스 리뷰&quot;], &quot;related_keywords&quot;: [&quot;일반&quot;], &quot;location_keywords&quot;: [&quot;한국&quot;, &quot;국내&quot;]} --&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/763</guid>
      <comments>https://iamgus.tistory.com/763#entry763comment</comments>
      <pubDate>Sun, 20 Jul 2025 17:06:35 +0900</pubDate>
    </item>
    <item>
      <title>아이폰 Pro 리뷰 - 스마트폰의 새로운 기준</title>
      <link>https://iamgus.tistory.com/762</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&quot;이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.&quot;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 스마트폰을 교체할 시기가 되어 여러 모델을 고민하던 중, 결국 아이폰 Pro를 선택하게 되었습니다. 평소 애플 제품을 좋아하기도 했지만, 이번에는 개인적으로 필요한 기능들이 많아서 더욱 끌렸던 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이폰 Pro를 처음 알게 된 건, 친구가 구매한 후 자랑을 하며 보여준 것이었어요. 그때 화면의 선명함과 카메라 성능에 매료되어, 저도 구매를 결심하게 되었습니다.&lt;/p&gt;
&lt;!-- 이미지 섹션은 자동으로 삽입됩니다 --&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  아이폰 Pro 제품 이미지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.coupang.com/np/search?q=%EC%95%84%EC%9D%B4%ED%8F%B0%20pro&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EC%95%84%EC%9D%B4%ED%8F%B0%20pro&amp;amp;lptag=AF7819398&amp;amp;itime=20250630205927&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EC%95%84%EC%9D%B4%ED%8F%B0%20pro&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250630205927&amp;amp;redirect=landing&amp;amp;subId=%EC%95%84%EC%9D%B4%ED%8F%B0_pro&quot;&gt;&lt;img src=&quot;https://cdsassets.apple.com/live/7WUAS350/images/tech-specs/iphone_15_pro.png&quot; alt=&quot;아이폰 Pro 이미지 1&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.coupang.com/np/search?q=%EC%95%84%EC%9D%B4%ED%8F%B0%20pro&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EC%95%84%EC%9D%B4%ED%8F%B0%20pro&amp;amp;lptag=AF7819398&amp;amp;itime=20250630205927&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EC%95%84%EC%9D%B4%ED%8F%B0%20pro&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250630205927&amp;amp;redirect=landing&amp;amp;subId=%EC%95%84%EC%9D%B4%ED%8F%B0_pro&quot;&gt;&lt;img src=&quot;https://cdsassets.apple.com/live/SZLF0YNV/images/sp/111846_sp875-sp876-iphone14-pro-promax.png&quot; alt=&quot;아이폰 Pro 이미지 2&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.coupang.com/np/search?q=%EC%95%84%EC%9D%B4%ED%8F%B0%20pro&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EC%95%84%EC%9D%B4%ED%8F%B0%20pro&amp;amp;lptag=AF7819398&amp;amp;itime=20250630205927&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EC%95%84%EC%9D%B4%ED%8F%B0%20pro&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250630205927&amp;amp;redirect=landing&amp;amp;subId=%EC%95%84%EC%9D%B4%ED%8F%B0_pro&quot;&gt;&lt;img src=&quot;https://www.apple.com/kr/iphone-16-pro/images/overview/product-viewer/iphone-pro/all_colors__fdpduog7urm2_xlarge.jpg&quot; alt=&quot;아이폰 Pro 이미지 3&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;아이폰 Pro 주요 특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이폰 Pro는 여러 뛰어난 기능들로 무장하고 있습니다. 우선, 6.1인치 Super Retina XDR 디스플레이는 정말 눈이 시원해지는 화질을 제공합니다. HDR 영상을 감상할 때 그 진가를 발휘하죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 카메라 성능이 매우 뛰어나서 저녁에 찍은 사진도 선명하게 나오더라고요. 특히, 인물 모드에서의 배경 흐림 효과는 전문가 같다는 평을 받을 정도입니다. 배터리 수명도 만족스러워 하루 종일 사용해도 충분히 버틸 수 있었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제 사용해보니...&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  좋았던 점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이폰 Pro를 사용하면서 가장 좋았던 점은 카메라 기능입니다. 친구들과의 여행 중에 찍은 사진들이 정말 인생샷이 많았어요. 그리고 Face ID 기능도 편리하게 잘 작동했습니다. 손가락으로 잠금을 해제하는 것보다 훨씬 빠르고 간편했어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, iOS의 안정성과 앱 생태계가 너무 마음에 들어서, 다양한 앱을 쉽게 설치하고 사용할 수 있었습니다. 게다가, 애플 생태계의 다른 제품들과의 호환성도 큰 장점 중 하나였습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  아쉬웠던 점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 몇 가지 아쉬웠던 점도 있었습니다. 첫째로, 가격이 다소 비싼 편이라 부담이 되긴 했습니다. 둘째로, 아이폰 특유의 폐쇄적인 시스템 때문에 사용자들이 원하는 대로 커스터마이징하기가 어려운 점이 아쉬웠습니다. 마지막으로, 충전 포트가 여전히 라이트닝 포트를 사용하는 점도 불편하게 느껴졌습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이런 분들께 추천!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이폰 Pro는 사진 촬영을 좋아하는 분들, 애플 생태계에 이미 익숙한 사용자, 그리고 고급스러운 디자인과 성능을 중시하는 분들께 추천합니다. 또한, 영상 통화와 모바일 게임을 자주 하시는 분들에게도 적합할 것 같습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상세 스펙 정리&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;사양&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;디스플레이&lt;/td&gt;
&lt;td&gt;6.1인치 Super Retina XDR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로세서&lt;/td&gt;
&lt;td&gt;A14 Bionic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;카메라&lt;/td&gt;
&lt;td&gt;트리플 카메라 시스템&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배터리 수명&lt;/td&gt;
&lt;td&gt;최대 20시간 통화 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;운영체제&lt;/td&gt;
&lt;td&gt;iOS 14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;저장 용량&lt;/td&gt;
&lt;td&gt;128GB, 256GB, 512GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구매 가이드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이폰 Pro를 구매할 때는 먼저 자신의 사용 용도를 고려해야 합니다. 고급 사진 촬영이나 영상 편집을 계획하고 있다면, 카메라 성능이 뛰어난 이 모델이 적합합니다. 또한, 애플의 생태계에 이미 투자한 사용자라면 더욱 유용할 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더불어, 가격 비교를 위해 쿠팡에서 확인해보시는 것도 좋은 방법입니다. &lt;a href=&quot;https://www.coupang.com/np/search?q=%EC%95%84%EC%9D%B4%ED%8F%B0%20pro&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EC%95%84%EC%9D%B4%ED%8F%B0%20pro&amp;amp;lptag=AF7819398&amp;amp;itime=20250630205927&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EC%95%84%EC%9D%B4%ED%8F%B0%20pro&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250630205927&amp;amp;redirect=landing&amp;amp;subId=%EC%95%84%EC%9D%B4%ED%8F%B0_pro&quot;&gt;아이폰 Pro 구매하기&lt;/a&gt; 링크에서 다양한 옵션을 확인해 보세요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적으로 아이폰 Pro는 뛰어난 성능과 디자인을 갖춘 스마트폰입니다. 단점도 있지만 그에 비해 장점이 더 많은 제품이라고 생각합니다. 개인적으로는 매우 만족하고 있으며, 앞으로도 잘 사용해 나갈 것 같습니다. 스마트폰 교체를 고민하고 계신 분들께 강력히 추천합니다!&lt;/p&gt;
&lt;!-- SEO Keywords: {&quot;primary_keywords&quot;: [&quot;아이폰 Pro&quot;], &quot;long_tail_keywords&quot;: [&quot;아이폰 Pro 리뷰&quot;], &quot;related_keywords&quot;: [&quot;스마트폰&quot;], &quot;location_keywords&quot;: [&quot;한국&quot;, &quot;국내&quot;]} --&gt;</description>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/762</guid>
      <comments>https://iamgus.tistory.com/762#entry762comment</comments>
      <pubDate>Mon, 30 Jun 2025 21:02:50 +0900</pubDate>
    </item>
    <item>
      <title>갤럭시 S25: 기대를 모은 스마트폰의 진짜 모습</title>
      <link>https://iamgus.tistory.com/761</link>
      <description>&lt;p&gt;최근에 스마트폰을 바꾸기로 결심했습니다. 여러 가지 모델을 고민하다가, 많은 사람들이 기대하고 있는 갤럭시 S25를 사용해보기로 했습니다. 삼성의 최신 모델인 만큼 어떤 기능이 탑재되어 있을지 궁금했어요. 특히, 카메라 성능과 배터리 수명이 중요한 요소였는데, 갤럭시 S25는 이러한 기대를 어느 정도 충족시켜줄지 궁금했습니다.&lt;/p&gt;
&lt;h2&gt;  갤럭시 S25 제품 이미지&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.coupang.com/np/search?q=%EA%B0%A4%EB%9F%AD%EC%8B%9C%20S25&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EA%B0%A4%EB%9F%AD%EC%8B%9C%20S25&amp;amp;lptag=AF7819398&amp;amp;itime=20250629201952&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EA%B0%A4%EB%9F%AD%EC%8B%9C%20S25&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250629201952&amp;amp;redirect=landing&amp;amp;subId=%EA%B0%A4%EB%9F%AD%EC%8B%9C_S25&quot;&gt;&lt;img src=&quot;https://img.kr.news.samsung.com/kr/wp-content/uploads/2025/05/%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EA%B0%A4%EB%9F%AD%EC%8B%9C-S25-%EC%97%A3%EC%A7%80-2-%EC%95%84%EC%9D%B4%EC%8A%A4%EB%B8%94%EB%A3%A8-2.jpg&quot; alt=&quot;갤럭시 S25 이미지 1&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.coupang.com/np/search?q=%EA%B0%A4%EB%9F%AD%EC%8B%9C%20S25&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EA%B0%A4%EB%9F%AD%EC%8B%9C%20S25&amp;amp;lptag=AF7819398&amp;amp;itime=20250629201952&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EA%B0%A4%EB%9F%AD%EC%8B%9C%20S25&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250629201952&amp;amp;redirect=landing&amp;amp;subId=%EA%B0%A4%EB%9F%AD%EC%8B%9C_S25&quot;&gt;&lt;img src=&quot;https://img.kr.news.samsung.com/kr/wp-content/uploads/2025/05/02.-%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EA%B0%A4%EB%9F%AD%EC%8B%9C-S25-%EC%97%A3%EC%A7%80-%EB%94%94%EC%9E%90%EC%9D%B4%EB%84%88-%EC%9D%B8%ED%84%B0%EB%B7%B0-%EA%B0%A4%EB%9F%AD%EC%8B%9C-S25-%EC%97%A3%EC%A7%80-%EC%A0%9C%ED%92%88.jpg&quot; alt=&quot;갤럭시 S25 이미지 2&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.coupang.com/np/search?q=%EA%B0%A4%EB%9F%AD%EC%8B%9C%20S25&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EA%B0%A4%EB%9F%AD%EC%8B%9C%20S25&amp;amp;lptag=AF7819398&amp;amp;itime=20250629201952&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EA%B0%A4%EB%9F%AD%EC%8B%9C%20S25&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250629201952&amp;amp;redirect=landing&amp;amp;subId=%EA%B0%A4%EB%9F%AD%EC%8B%9C_S25&quot;&gt;&lt;img src=&quot;https://images.samsung.com/kdp/goods/2025/01/15/cf939ac6-e80c-4af1-85cc-a0805d345aed.png?$944_550_PNG$&quot; alt=&quot;갤럭시 S25 이미지 3&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;갤럭시 S25 주요 특징&lt;/h2&gt;
&lt;p&gt;갤럭시 S25는 최신 기술이 집약된 스마트폰으로, 다음과 같은 주요 기능이 있습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;카메라 성능&lt;/strong&gt;: 고화소 카메라와 다양한 촬영 모드가 탑재되어 있어, 일상적인 순간을 쉽게 캡처할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;디스플레이&lt;/strong&gt;: AMOLED 디스플레이는 색감이 뛰어나고, 화면이 밝아 실내 외 구분 없이 편리하게 사용할 수 있었습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;배터리 수명&lt;/strong&gt;: 대용량 배터리 덕분에 하루 종일 사용해도 걱정 없이 사용할 수 있었습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5G 지원&lt;/strong&gt;: 빠른 데이터 속도를 자랑하며, 끊김 없는 스트리밍과 다운로드가 가능했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;실제 사용해보니...&lt;/h2&gt;
&lt;h3&gt;  좋았던 점&lt;/h3&gt;
&lt;p&gt;갤럭시 S25를 사용하면서 가장 좋았던 점은 카메라 성능이었습니다. 다양한 촬영 모드가 있어서 내가 원하는 스타일로 사진을 찍을 수 있었고, 특히 야경 모드에서는 놀라운 결과물을 얻을 수 있었습니다. 또한, AMOLED 디스플레이 덕분에 영화를 볼 때 색감이 생생해서 마치 극장에서 보는 듯한 느낌이 들었어요. 배터리도 정말 오래 가더라고요. 하루 종일 사용해도 남아있는 잔량이 있어 좋았습니다.&lt;/p&gt;
&lt;h3&gt;  아쉬웠던 점&lt;/h3&gt;
&lt;p&gt;하지만 아쉬운 점도 있었습니다. 첫 번째로, 가격이 아직 공개되지 않아서 가성비에 대한 고민이 필요했습니다. 두 번째로, 소프트웨어 최적화가 다소 부족한 느낌이 들어서 가끔 앱이 느려지는 경우가 있었습니다. 최신 모델임에도 불구하고 이런 부분은 아쉽더군요.&lt;/p&gt;
&lt;h2&gt;이런 분들께 추천!&lt;/h2&gt;
&lt;p&gt;갤럭시 S25는 사진 촬영을 좋아하는 분들과 고화질 콘텐츠 소비를 선호하는 분들께 추천합니다. 특히, 최신 기술을 누리고 싶지만 가격이 부담스러운 분들은 더 많은 정보가 필요할 것 같습니다. &lt;/p&gt;
&lt;h2&gt;상세 스펙 정리&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;사양&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;디스플레이&lt;/td&gt;
&lt;td&gt;AMOLED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;카메라&lt;/td&gt;
&lt;td&gt;고화소, 다양한 촬영 모드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배터리&lt;/td&gt;
&lt;td&gt;대용량&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5G 지원&lt;/td&gt;
&lt;td&gt;예&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;운영체제&lt;/td&gt;
&lt;td&gt;최신 버전&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;구매 가이드&lt;/h2&gt;
&lt;p&gt;갤럭시 S25를 구매할 때 고려해야 할 사항은 본인의 사용 용도입니다. 사진 촬영을 많이 하시고, 고화질 콘텐츠 소비를 즐기는 분들에게는 매우 적합하지만, 가격이 아직 확인되지 않아 예산을 고려해야 할 필요가 있습니다. 더 궁금하신 분들은 &lt;a href=&quot;https://www.coupang.com/np/search?q=%EA%B0%A4%EB%9F%AD%EC%8B%9C%20S25&amp;amp;src=1139000&amp;amp;spec=10799999&amp;amp;addtag=AF7819398&amp;amp;ctag=%EA%B0%A4%EB%9F%AD%EC%8B%9C%20S25&amp;amp;lptag=AF7819398&amp;amp;itime=20250629201952&amp;amp;pageType=SEARCH&amp;amp;pageValue=%EA%B0%A4%EB%9F%AD%EC%8B%9C%20S25&amp;amp;wPcid=17262011008720070184324&amp;amp;wRef=&amp;amp;wTime=20250629201952&amp;amp;redirect=landing&amp;amp;subId=%EA%B0%A4%EB%9F%AD%EC%8B%9C_S25&quot;&gt;쿠팡 링크&lt;/a&gt;에서 더욱 자세한 정보를 확인해보세요.&lt;/p&gt;
&lt;h2&gt;마무리&lt;/h2&gt;
&lt;p&gt;전체적으로 갤럭시 S25는 기대 이상의 성능을 보여주었지만, 가격과 소프트웨어 최적화 문제는 아쉬움으로 남았습니다. 하지만 카메라와 배터리 성능은 정말 만족스러웠기에, 앞으로도 계속 사용해볼 가치가 있다고 생각합니다.&lt;/p&gt;
&lt;p&gt;이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.&lt;/p&gt;
&lt;!-- SEO Keywords: {&quot;primary_keywords&quot;: [&quot;갤럭시 S25&quot;], &quot;long_tail_keywords&quot;: [&quot;갤럭시 S25 리뷰&quot;], &quot;related_keywords&quot;: [&quot;일반&quot;], &quot;location_keywords&quot;: [&quot;한국&quot;, &quot;국내&quot;]} --&gt;</description>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/761</guid>
      <comments>https://iamgus.tistory.com/761#entry761comment</comments>
      <pubDate>Sun, 29 Jun 2025 20:21:42 +0900</pubDate>
    </item>
    <item>
      <title>제휴 마케팅, 더 쉽게! 자동화로 블로그 똑똑하게 운영하기</title>
      <link>https://iamgus.tistory.com/760</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;제휴 마케팅으로 수익을 내고 싶지만, 제품 정보 찾고, 글 쓰고, 링크 넣는 과정이 너무 번거롭지 않으신가요? 저도 처음 쿠팡 파트너스로 블로그를 시작했을 때, 매번 반복되는 작업에 지쳤던 기억이 나네요. 그래서 고민 끝에 &lt;b&gt;제휴 마케팅 자동화 시스템&lt;/b&gt;을 만들어 봤어요. 이 시스템 덕분에 시간을 엄청 절약하면서도 깔끔한 블로그 포스트를 뚝딱 만들 수 있게 됐죠! 오늘은 이 시스템에 어떤 기술이 들어갔는지, 어떻게 작동하는지 부드럽게 풀어서 알려드릴게요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;제휴 마케팅 자동화, 뭐가 다를까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제휴 마케팅 자동화는 제품 정보 수집부터 블로그 포스트 작성, SEO 키워드 추가, 제휴 링크 삽입까지 한 번에 처리해주는 똑똑한 도구예요. 예를 들어, &quot;갤럭시 S25&quot; 같은 제품을 리뷰하고 싶을 때, 이 시스템이 알아서 정보를 모으고, 읽기 좋은 포스트를 만들어 주죠.  &lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;어떤 기술로 만들었나요?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시스템을 만들기 위해 몇 가지 멋진 기술을 활용했어요. 하나씩 소개할게요!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;파이썬: 모든 걸 하나로 묶는 마법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 이 시스템의 심장이에요. 코드가 간단하고, 다양한 라이브러리를 쉽게 붙일 수 있어서 선택했죠. 제품 정보 수집부터 포스트 작성까지, 파이썬이 모든 걸 부드럽게 연결해 줍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;Serper.dev API: 똑똑한 정보 수집&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제품 정보를 찾기 위해 &lt;b&gt;Serper.dev API&lt;/b&gt;를 사용했어요. 이 API는 Google 검색 결과를 깔끔한 JSON 형식으로 가져와 주는데, 특히 쿠팡 사이트에서 &quot;갤럭시 S25 리뷰&quot;나 &quot;가격&quot; 같은 정보를 쏙쏙 뽑아내죠. 제품 이미지나 고유 ID(vendorItemId)도 여기서 찾아요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;LangChain &amp;amp; OpenAI: 자연스러운 글쓰기&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LangChain&lt;/b&gt;: 검색한 정보를 정리하고, 필요한 부분만 골라내는 데 탁월해요. FAISS라는 벡터 검색 기술을 써서 정보를 빠르게 찾아내고, 블로그 포스트에 딱 맞는 내용을 뽑아냅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OpenAI GPT-4o-mini&lt;/b&gt;: 이 녀석이 진짜 글쓰기 마법사예요! 제품 정보를 주면 실제 사용자가 쓴 것처럼 부드럽고 자연스러운 리뷰를 만들어 줍니다. SEO 키워드도 똑똑하게 뽑아서 포스트가 검색 상위에 뜨도록 도와줘요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;python-dotenv: 비밀 정보 안전하게&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 키나 쿠팡 파트너스 ID 같은 민감한 정보는 .env 파일에 따로 저장했어요. &lt;b&gt;python-dotenv&lt;/b&gt; 덕분에 코드에 민감한 정보를 직접 넣지 않아도 돼서 보안 걱정 없이 작업할 수 있었죠.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;FAISS: 빠르고 똑똑한 검색&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색한 데이터를 벡터로 바꿔서 빠르게 찾아내는 데 &lt;b&gt;FAISS&lt;/b&gt;를 썼어요. OpenAI의 임베딩 기술과 함께, 제품 정보 중에서 블로그에 넣을 만한 핵심 내용만 쏙쏙 골라냅니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시스템, 어떻게 작동하나요?&lt;/h2&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;&lt;b&gt;정보 수집 (SerperSearcher)&lt;/b&gt;: 제품명(예: &quot;갤럭시 S25&quot;)을 넣으면 리뷰, 스펙, 가격, 이미지 등을 모아줘요. 쿠팡 페이지에서 제품 ID도 찾아냅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제휴 링크 생성 (CoupangLinkGenerator)&lt;/b&gt;: 쿠팡 파트너스 링크를 만들어 줘요. 제품 ID가 있으면 특정 제품 페이지로, 없으면 검색 페이지로 연결되는 링크를 생성합니다. 예:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제품 링크: &lt;a href=&quot;https://www.coupang.com/vp/products/123456?vendorItemId=789012345&amp;amp;addtag=AF123456&quot;&gt;https://www.coupang.com/vp/products/123456?vendorItemId=789012345&amp;amp;addtag=AF123456&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;검색 링크: &lt;a href=&quot;https://www.coupang.com/np/search?q=갤럭시%20S25&amp;amp;addtag=AF123456&quot;&gt;https://www.coupang.com/np/search?q=갤럭시%20S25&amp;amp;addtag=AF123456&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정보 정리 (ProductInfoExtractor)&lt;/b&gt;: 검색된 데이터를 깔끔한 형식(가격, 평점, 주요 특징 등)으로 정리해요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SEO 키워드 생성 (SEOKeywordGenerator)&lt;/b&gt;: 검색 엔진에 잘 뜨도록 키워드를 뽑아냅니다. 예: &quot;갤럭시 S25 리뷰&quot;, &quot;갤럭시 S25 가격&quot;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;블로그 포스트 작성 (BlogPostGenerator)&lt;/b&gt;: 실제 사용자처럼 자연스러운 리뷰 포스트를 작성하고, 이미지와 링크를 넣어줘요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;통합 관리 (AffiliateBlogAutomator)&lt;/b&gt;: 모든 과정을 하나로 묶어서 부드럽게 실행합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그래서, 뭐가 좋나요?&lt;/h2&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;&lt;b&gt;시간 절약&lt;/b&gt;: 정보를 찾고 글 쓰는 데 몇 시간이 걸렸던 게 이제 몇 분이면 끝!&lt;/li&gt;
&lt;li&gt;&lt;b&gt;더 많은 포스트&lt;/b&gt;: 하루에 여러 제품 리뷰를 뚝딱 만들 수 있어요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수익 UP&lt;/b&gt;: 정확한 제휴 링크로 클릭과 구매가 잘 추적돼요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SEO 짱&lt;/b&gt;: 키워드가 잘 맞춰져서 블로그가 검색 상위에 뜨기 쉬워요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리하며&lt;/h2&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>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/760</guid>
      <comments>https://iamgus.tistory.com/760#entry760comment</comments>
      <pubDate>Sun, 29 Jun 2025 20:19:54 +0900</pubDate>
    </item>
    <item>
      <title>  Python으로 실시간 뉴스 요약 시스템 만들기 - NewsData.io API 완벽 활용법</title>
      <link>https://iamgus.tistory.com/753</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;매일 쏟아지는 수많은 뉴스들, 다 읽기엔 시간이 부족하죠? 오늘은 Python을 사용해서 뉴스를 자동으로 수집하고 요약해주는 시스템을 만들어보겠습니다. 무료 API를 활용한 실전 프로젝트로, 개발 초보자도 쉽게 따라할 수 있어요!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZLNpc/btsOV82L7Td/J1AY7s5N9yBpU368bzizbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZLNpc/btsOV82L7Td/J1AY7s5N9yBpU368bzizbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZLNpc/btsOV82L7Td/J1AY7s5N9yBpU368bzizbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZLNpc%2FbtsOV82L7Td%2FJ1AY7s5N9yBpU368bzizbk%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;1540&quot; height=&quot;916&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  이런 분들께 추천해요&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뉴스를 효율적으로 소비하고 싶은 분&lt;/li&gt;
&lt;li&gt;Python API 활용 실습을 원하는 개발자&lt;/li&gt;
&lt;li&gt;자동화 도구에 관심이 있는 분&lt;/li&gt;
&lt;li&gt;텍스트 처리 프로젝트를 해보고 싶은 분&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  NewsData.io API를 선택한 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뉴스 API는 여러 종류가 있지만, NewsData.io를 선택한 이유는 다음과 같아요:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;무료 플랜 제공&lt;/b&gt;: 하루 200회 API 호출 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한국어 뉴스 지원&lt;/b&gt;: 국내 뉴스도 잘 수집됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다양한 필터링&lt;/b&gt;: 카테고리, 키워드, 국가별 검색 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실시간 업데이트&lt;/b&gt;: 최신 뉴스를 빠르게 제공&lt;/li&gt;
&lt;li&gt;&lt;b&gt;간단한 사용법&lt;/b&gt;: REST API로 쉽게 연동&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 무료 플랜 제한사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일일 200회 호출 제한&lt;/li&gt;
&lt;li&gt;한 번에 최대 10개 기사&lt;/li&gt;
&lt;li&gt;과거 데이터 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 개인 프로젝트나 학습용으로는 충분해요!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ 개발 환경 설정하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 필요한 패키지 설치&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install requests python-dotenv
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. NewsData.io API 키 발급&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://newsdata.io/&quot;&gt;NewsData.io&lt;/a&gt; 사이트 접속&lt;/li&gt;
&lt;li&gt;무료 계정 생성&lt;/li&gt;
&lt;li&gt;대시보드에서 API 키 복사&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 환경변수 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 폴더에 .env 파일을 만들고:&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;NEWSDATA_API_KEY=your_actual_api_key_here
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;꿀팁&lt;/b&gt;: .gitignore에 .env를 추가해서 API 키가 실수로 공개되지 않도록 하세요!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  핵심 코드 구현&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;뉴스 수집 클래스 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NewsData.io API의 주요 매개변수들을 정리하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;country: 국가 코드 (kr=한국, us=미국 등)&lt;/li&gt;
&lt;li&gt;language: 언어 코드 (ko=한국어, en=영어 등)&lt;/li&gt;
&lt;li&gt;category: 카테고리 (technology, sports, business 등)&lt;/li&gt;
&lt;li&gt;q: 검색 키워드&lt;/li&gt;
&lt;li&gt;size: 가져올 기사 수 (최대 10개)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;def get_news(self, country=&quot;kr&quot;, language=&quot;ko&quot;, category=None, q=None, size=10):
    params = {
        &quot;apikey&quot;: self.api_key,
        &quot;country&quot;: country,
        &quot;language&quot;: language,
        &quot;size&quot;: min(size, 10)  # 무료 플랜 제한
    }
    
    if category:
        params[&quot;category&quot;] = category
    if q:
        params[&quot;q&quot;] = q
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;텍스트 요약 알고리즘&lt;/h3&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;&lt;b&gt;문장 분리&lt;/b&gt;: 정규표현식으로 정확한 문장 구분&lt;/li&gt;
&lt;li&gt;&lt;b&gt;점수 계산&lt;/b&gt;: 문장 길이 + 키워드 가중치&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중요 문장 선별&lt;/b&gt;: 상위 점수 문장들만 추출&lt;/li&gt;
&lt;li&gt;&lt;b&gt;순서 유지&lt;/b&gt;: 원본 순서대로 재배열&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;# 한국어 뉴스 키워드 가중치
important_keywords = ['발표', '예정', '계획', '정부', '대통령', '기업', '투자']
for keyword in important_keywords:
    if keyword in sentence:
        score += 5
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실제 사용해보기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 일반 뉴스 요약&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;summaries = summarizer.process_news(country=&quot;kr&quot;, language=&quot;ko&quot;, size=5)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 카테고리별 뉴스&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;tech_summaries = summarizer.process_news(
    country=&quot;kr&quot;, 
    language=&quot;ko&quot;, 
    category=&quot;technology&quot;, 
    size=3
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 키워드 검색&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;ai_summaries = summarizer.process_news(
    language=&quot;ko&quot;,
    q=&quot;인공지능&quot;,
    size=3
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실행 결과 예시&lt;/h2&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;================================================================================
  뉴스 요약 결과
================================================================================

[1] 국내 AI 스타트업, 글로벌 투자 유치 성공
  발행일: 2025-06-28T10:30:00Z
  출처: tech_news
  링크: https://example.com/news/1

  요약:
국내 AI 스타트업 A사가 실리콘밸리 투자사로부터 100억원 규모의 투자를 유치했다고 발표했다. 
이번 투자로 글로벌 시장 진출을 가속화할 계획이다. 
A사는 자연어 처리 기술 분야에서 독자적인 알고리즘을 보유하고 있다.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  더 나아가기 - 고도화 아이디어&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. AI 기반 요약 업그레이드&lt;/h3&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;# OpenAI GPT API 연동 예시
import openai

def ai_summarize(self, text):
    response = openai.ChatCompletion.create(
        model=&quot;gpt-3.5-turbo&quot;,
        messages=[
            {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;뉴스 기사를 3문장으로 요약해주세요.&quot;},
            {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: text}
        ]
    )
    return response.choices[0].message.content
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 데이터베이스 연동&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import sqlite3

def save_to_db(self, summaries):
    conn = sqlite3.connect('news_summary.db')
    cursor = conn.cursor()
    
    for summary in summaries:
        cursor.execute('''
            INSERT INTO news (title, summary, link, published_date)
            VALUES (?, ?, ?, ?)
        ''', (summary['title'], summary['summary'], 
              summary['link'], summary['published_date']))
    
    conn.commit()
    conn.close()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 스케줄링 자동화&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import schedule
import time

def run_daily_summary():
    summarizer = NewsDataSummarizer(API_KEY)
    summaries = summarizer.process_news(size=5)
    # 이메일 발송 또는 슬랙 알림
    send_notification(summaries)

# 매일 오전 9시에 실행
schedule.every().day.at(&quot;09:00&quot;).do(run_daily_summary)

while True:
    schedule.run_pending()
    time.sleep(1)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실용적인 활용 방안&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 개인용 뉴스 디제스트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관심 키워드로 맞춤형 뉴스 수집&lt;/li&gt;
&lt;li&gt;이메일이나 메신저로 자동 발송&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 업무용 모니터링 시스템&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 업계 뉴스 추적&lt;/li&gt;
&lt;li&gt;경쟁사 동향 파악&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 콘텐츠 제작 도구&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;블로그 소재 발굴&lt;/li&gt;
&lt;li&gt;트렌드 분석 자료&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 성능 최적화 팁&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. API 호출 최적화&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;# 호출 간격 조절로 제한 회피
time.sleep(0.5)

# 배치 처리로 효율성 증대
def batch_process(self, queries, batch_size=5):
    results = []
    for i in range(0, len(queries), batch_size):
        batch = queries[i:i+batch_size]
        # 배치 처리 로직
    return results
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 캐싱 시스템&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import json
from datetime import datetime, timedelta

def cache_results(self, key, data, hours=1):
    cache_file = f&quot;cache_{key}.json&quot;
    cache_data = {
        'timestamp': datetime.now().isoformat(),
        'data': data
    }
    with open(cache_file, 'w', encoding='utf-8') as f:
        json.dump(cache_data, f, ensure_ascii=False)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  보안 및 에러 처리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. API 키 보안&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환경변수 사용 필수&lt;/li&gt;
&lt;li&gt;.gitignore에 .env 추가&lt;/li&gt;
&lt;li&gt;배포 시 서버 환경변수 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 견고한 에러 처리&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def safe_api_call(self, params, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = requests.get(self.base_url, params=params, timeout=10)
            response.raise_for_status()
            return response.json()
        except requests.exceptions.RequestException as e:
            if attempt == max_retries - 1:
                print(f&quot;API 호출 실패: {e}&quot;)
                return None
            time.sleep(2 ** attempt)  # 지수 백오프
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  결과 분석 및 개선점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;현재 버전의 한계점&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;단순한 요약 알고리즘&lt;/b&gt;: 문장 길이 기반의 기초적 방법&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언어별 최적화 부족&lt;/b&gt;: 한국어 특성을 충분히 반영하지 못함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문맥 이해 부족&lt;/b&gt;: 문장 간 연관성 고려 안 함&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개선 방향&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;머신러닝 모델 도입&lt;/b&gt;: BERT, KoBERT 등 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;감정 분석 추가&lt;/b&gt;: 기사의 톤 분석&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중복 제거&lt;/b&gt;: 유사한 뉴스 필터링&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개인화&lt;/b&gt;: 사용자 선호도 학습&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python과 NewsData.io API를 활용해서 나만의 뉴스 요약 시스템을 만들어봤어요. 코드는 간단하지만 실용성이 높고, 여러 방향으로 확장 가능한 프로젝트입니다.&lt;/p&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;&lt;b&gt;API 연동의 기본기&lt;/b&gt;: REST API 사용법과 에러 처리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;텍스트 처리 기법&lt;/b&gt;: 자연어 처리의 기초&lt;/li&gt;
&lt;li&gt;&lt;b&gt;환경변수 관리&lt;/b&gt;: 보안을 고려한 개발 방법&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동화 시스템 구축&lt;/b&gt;: 실무에서 활용 가능한 도구 제작&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://newsdata.io/docs&quot;&gt;NewsData.io 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python-requests.org/&quot;&gt;Python requests 라이브러리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pypi.org/project/python-dotenv/&quot;&gt;python-dotenv 사용법&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;다음 프로젝트 예고&lt;/b&gt;: 이번에 만든 뉴스 요약기에 GPT API를 연동해서 더 정교한 요약 시스템을 만들어보는 튜토리얼을 준비 중이에요. 많은 관심 부탁드려요!&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>코드리뷰/chatGPT(Python)코드</category>
      <category>API</category>
      <category>newsdata</category>
      <category>python</category>
      <category>개발자도구</category>
      <category>뉴스요약</category>
      <category>자동화</category>
      <category>텍스트처리</category>
      <category>프로그래밍튜토리얼</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/753</guid>
      <comments>https://iamgus.tistory.com/753#entry753comment</comments>
      <pubDate>Sat, 28 Jun 2025 19:28:07 +0900</pubDate>
    </item>
    <item>
      <title>초보자도 쉽게 만들 수 있는 유튜브 음악방송 7단계</title>
      <link>https://iamgus.tistory.com/752</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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/1OgWS3TYa9E?si=x_jjEiChhaPG3Vqh&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/1OgWS3TYa9E?si=x_jjEiChhaPG3Vqh&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=1OgWS3TYa9E&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/UAXN2/hyY8VZRP0j/QHCGlkMdtpKE2AIy9LkEC1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/4lt7U/hyY8VZRPNG/P1ya9MNqs69AdtrQo1CByk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;아무 생각 없이 듣기 좋은 카페 음악  #2&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/1OgWS3TYa9E&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자~ 본격적으로 만들어 볼까요...&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1단계: 방송 컨셉 잡기 - 나만의 색깔 찾기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 중요한 첫 번째 단계는 방송의 정체성을 정하는 것입니다. 성공하는 음악방송들은 모두 명확한 컨셉을 가지고 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인기 있는 컨셉들:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;카페 분위기 음악 (재즈, 어쿠스틱)&lt;/li&gt;
&lt;li&gt;집중력 향상 음악 (로파이, 앰비언트)&lt;/li&gt;
&lt;li&gt;힐링/수면 음악 (뉴에이지, 자연음)&lt;/li&gt;
&lt;li&gt;계절별 테마 음악 (겨울 감성, 봄날 등)&lt;/li&gt;
&lt;li&gt;시간대별 음악 (새벽 감성, 야간 드라이브)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컨셉 정할 때 고려사항:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내가 좋아하는 음악 장르&lt;/li&gt;
&lt;li&gt;타겟 청취자층 (학생, 직장인, 불면증 환자 등)&lt;/li&gt;
&lt;li&gt;경쟁 채널과의 차별화 포인트&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2단계: 음원 수집 - 저작권 걱정 없는 음악 찾기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음악방송의 핵심인 음원 수집 단계입니다. 저작권 문제를 피하기 위해 무료 음원 사이트를 적극 활용해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추천 무료 음원 사이트:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Bensound&lt;/b&gt;: 퀄리티 높은 로열티 프리 음악&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pixabay Music&lt;/b&gt;: 다양한 장르의 무료 음원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Freesound&lt;/b&gt;: 효과음과 앰비언트 사운드&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Zapsplat&lt;/b&gt;: 회원가입 후 무료 이용 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유튜브 오디오 라이브러리&lt;/b&gt;: 유튜브에서 제공하는 무료 음원&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z7Ijm/btsOHZRLs32/nKe1JaSKmgeKtbTsqKgGgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z7Ijm/btsOHZRLs32/nKe1JaSKmgeKtbTsqKgGgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z7Ijm/btsOHZRLs32/nKe1JaSKmgeKtbTsqKgGgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ7Ijm%2FbtsOHZRLs32%2FnKe1JaSKmgeKtbTsqKgGgK%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;779&quot; height=&quot;502&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;음원 선택 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일관된 분위기와 볼륨 유지&lt;/li&gt;
&lt;li&gt;30분~1시간 분량으로 구성&lt;/li&gt;
&lt;li&gt;곡과 곡 사이 자연스러운 연결&lt;/li&gt;
&lt;li&gt;라이선스 조건 반드시 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3단계: 무료 이미지 및 동영상 수집 - 시각적 매력 더하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음악만큼 중요한 것이 시각적 요소입니다. 정적인 이미지보다는 은은하게 움직이는 영상이 시청자들의 관심을 더 오래 붙잡을 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추천 무료 소스 사이트:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Pexels&lt;/b&gt;: 고퀄리티 무료 사진과 영상&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pixabay&lt;/b&gt;: 다양한 무료 이미지와 동영상&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Unsplash&lt;/b&gt;: 감각적인 무료 사진&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Videvo&lt;/b&gt;: 무료 영상 클립 전문 사이트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소재 선택 가이드:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨셉과 어울리는 분위기 (카페 &amp;rarr; 커피, 책, 창가 풍경)&lt;/li&gt;
&lt;li&gt;너무 강렬하지 않은 차분한 색감&lt;/li&gt;
&lt;li&gt;루프 가능한 영상 (반복 재생에 자연스러운 것)&lt;/li&gt;
&lt;li&gt;해상도 1080p 이상 권장&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4단계: 영상 제작 - CapCut으로 쉽게 편집하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 수집한 음원과 영상을 하나로 합쳐 완성된 콘텐츠를 만들어보겠습니다. CapCut은 무료이면서도 초보자가 사용하기 쉬운 편집툴입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CapCut 활용 편집 과정:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;배경 영상 타임라인에 배치&lt;/li&gt;
&lt;li&gt;음원 추가 후 길이 맞춤&lt;/li&gt;
&lt;li&gt;간단한 텍스트 추가 (채널명, 플레이리스트 제목 등)&lt;/li&gt;
&lt;li&gt;페이드 인/아웃 효과로 자연스러운 시작과 끝&lt;/li&gt;
&lt;li&gt;색감 보정으로 일관된 분위기 연출&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;1329&quot; data-origin-height=&quot;865&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dARvcP/btsOG1QquIn/CVXaB4mY07vWl5ZpdO2YX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dARvcP/btsOG1QquIn/CVXaB4mY07vWl5ZpdO2YX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dARvcP/btsOG1QquIn/CVXaB4mY07vWl5ZpdO2YX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdARvcP%2FbtsOG1QquIn%2FCVXaB4mY07vWl5ZpdO2YX1%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;1329&quot; height=&quot;865&quot; data-origin-width=&quot;1329&quot; data-origin-height=&quot;865&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;편집 시 주의사항:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;과도한 효과보다는 깔끔함 추구&lt;/li&gt;
&lt;li&gt;텍스트는 읽기 쉽지만 방해되지 않게&lt;/li&gt;
&lt;li&gt;영상과 음원의 분위기 일치 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5단계: 썸네일 이미지 제작 - 미리캔버스로 눈길 끌기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;썸네일은 시청자가 가장 먼저 보는 요소로, 클릭률에 직접적인 영향을 미칩니다. 미리캔버스를 활용하면 디자인 경험이 없어도 전문적인 썸네일을 만들 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;효과적인 썸네일 디자인 원칙:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유튜브 썸네일 템플릿 활용 (1280x720 픽셀)&lt;/li&gt;
&lt;li&gt;컨셉을 한눈에 알 수 있는 이미지&lt;/li&gt;
&lt;li&gt;가독성 좋은 폰트로 제목 텍스트 추가&lt;/li&gt;
&lt;li&gt;따뜻하고 편안한 색감 사용&lt;/li&gt;
&lt;li&gt;브랜딩 요소 (로고, 고정 색상) 일관성 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;미리캔버스 활용 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;템플릿에서 시작해 개인 스타일로 수정&lt;/li&gt;
&lt;li&gt;텍스트 크기는 모바일에서도 읽기 쉽게&lt;/li&gt;
&lt;li&gt;너무 많은 정보보다는 간결하게&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;카페음악2-001.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;a href=&quot;https://youtu.be/1OgWS3TYa9E?si=VdW4k3NvoNTIjl9S&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxiCnr/btsOGYTFPkh/eGPjr9FyuxAeha17UKkk4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxiCnr%2FbtsOGYTFPkh%2FeGPjr9FyuxAeha17UKkk4K%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;1280&quot; height=&quot;720&quot; data-filename=&quot;카페음악2-001.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6단계: 유튜브 채널 설정 - 전문적인 첫인상 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널 개설과 기본 설정을 통해 전문적인 인상을 줄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;채널 설정 체크리스트:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;채널명: 컨셉을 반영한 기억하기 쉬운 이름&lt;/li&gt;
&lt;li&gt;채널 아트: 컨셉과 일치하는 디자인 (2560x1440 픽셀)&lt;/li&gt;
&lt;li&gt;채널 소개: 어떤 음악을 제공하는지 명확히 설명&lt;/li&gt;
&lt;li&gt;재생목록 구성: 테마별로 체계적으로 분류&lt;/li&gt;
&lt;li&gt;채널 예고편: 대표적인 영상으로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7단계: 게시 및 홍보 - 꾸준함이 성공의 열쇠&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 단계는 콘텐츠를 세상에 알리는 것입니다. 좋은 콘텐츠도 사람들이 모르면 의미가 없겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;효과적인 홍보 전략:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정기적인 업로드&lt;/b&gt;: 일정한 스케줄로 신뢰성 구축&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SEO 최적화&lt;/b&gt;: 제목과 설명에 검색 키워드 포함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SNS 활용&lt;/b&gt;: 인스타그램, 페이스북, X 등으로 티저 공유&lt;/li&gt;
&lt;li&gt;&lt;b&gt;블로그 포스팅&lt;/b&gt;: 플레이리스트 소개나 음악 추천 글 작성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커뮤니티 참여&lt;/b&gt;: 관련 카페나 그룹에서 자연스럽게 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;350&quot;&gt;&lt;a href=&quot;https://x.com/jsBar/status/1935525091619782705&quot; target=&quot;_blank&quot; title=&quot;유튜브방송&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZcWk3/btsOIV9cGHb/1TwIFNRMoAyf0oDAh8ZkX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZcWk3%2FbtsOIV9cGHb%2F1TwIFNRMoAyf0oDAh8ZkX1%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;901&quot; height=&quot;350&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지속 가능한 채널 운영 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구독자 피드백에 적극 응답&lt;/li&gt;
&lt;li&gt;시즌이나 트렌드에 맞는 콘텐츠 기획&lt;/li&gt;
&lt;li&gt;다른 음악 채널과의 협업 고려&lt;/li&gt;
&lt;li&gt;분석 도구로 시청자 패턴 파악 후 전략 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/752</guid>
      <comments>https://iamgus.tistory.com/752#entry752comment</comments>
      <pubDate>Thu, 19 Jun 2025 11:48:30 +0900</pubDate>
    </item>
    <item>
      <title>AI 이용해 유튜브 명상 채널 만들기</title>
      <link>https://iamgus.tistory.com/751</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AI를 이용해 명상 채널을 만들어 봤어요. 무료로 제공되는 사이트를 이용해 영상 제작부터 유튜브 업로드까지 모두 해봤습니다. 아직 유튜브 채널을 개설하지 않으셨다면 한번 따라해 보세요. 그냥 쭉 따라가면 나만의 채널이 만들어집니다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;445&quot; data-end=&quot;465&quot; data-ke-size=&quot;size26&quot;&gt;✅ [1단계] AIVA로 AI 음악 생성&lt;/h2&gt;
&lt;h3 data-end=&quot;212&quot; data-start=&quot;197&quot; data-ke-size=&quot;size23&quot;&gt;AIVA(&lt;a href=&quot;https://www.aiva.ai&quot;&gt;https://www.aiva.ai&lt;/a&gt;) 사이트에서 음악을 만들고 다운로드 하세요.&lt;/h3&gt;
&lt;h3 data-end=&quot;175&quot; data-start=&quot;159&quot; data-ke-size=&quot;size23&quot;&gt;1. 테마/분위기 설정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;362&quot; data-start=&quot;176&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;214&quot; data-start=&quot;176&quot;&gt;&lt;b&gt;Mood&lt;/b&gt;: &amp;ldquo;Healing&amp;rdquo;, &amp;ldquo;Sleep&amp;rdquo;, &amp;ldquo;Calm&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;251&quot; data-start=&quot;215&quot;&gt;&lt;b&gt;Genre&lt;/b&gt;: Ambient / Chill / Relax&lt;/li&gt;
&lt;li data-end=&quot;281&quot; data-start=&quot;252&quot;&gt;&lt;b&gt;Tempo&lt;/b&gt;: Slow (~60BPM 이하)&lt;/li&gt;
&lt;li data-end=&quot;324&quot; data-start=&quot;282&quot;&gt;&lt;b&gt;Length&lt;/b&gt;: 5분 단위로 생성 후, 8시간 영상용으로 반복 루프&lt;/li&gt;
&lt;li data-end=&quot;362&quot; data-start=&quot;325&quot;&gt;&lt;b&gt;Structure&lt;/b&gt;: 일정한 분위기 지속 + 페이드인/아웃&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;375&quot; data-start=&quot;364&quot; data-ke-size=&quot;size23&quot;&gt;2. 다운로드&lt;/h3&gt;
&lt;h2 data-end=&quot;465&quot; data-start=&quot;445&quot; data-ke-size=&quot;size26&quot;&gt;✅ [2단계] 자연 효과음 수집&lt;/h2&gt;
&lt;p data-end=&quot;481&quot; data-start=&quot;467&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;빗소리 같은 자연의 소리를 함께 넣어주면 너무 좋죠..&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;481&quot; data-start=&quot;467&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  추천 사이트&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;621&quot; data-start=&quot;482&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;572&quot; data-start=&quot;482&quot;&gt;&lt;a href=&quot;https://mixkit.co/free-sound-effects/rain/&quot;&gt;https://mixkit.co/free-sound-effects/rain/&lt;/a&gt;&lt;/li&gt;
&lt;li data-end=&quot;621&quot; data-start=&quot;573&quot;&gt;&lt;a href=&quot;https://freesound.org&quot;&gt;https://freesound.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;634&quot; data-start=&quot;623&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 검색어&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;697&quot; data-start=&quot;635&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;654&quot; data-start=&quot;635&quot;&gt;&amp;ldquo;Rain heavy loop&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;671&quot; data-start=&quot;655&quot;&gt;&amp;ldquo;Thunder soft&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;697&quot; data-start=&quot;672&quot;&gt;&amp;ldquo;Forest night ambie&lt;/li&gt;
&lt;li data-end=&quot;697&quot; data-start=&quot;672&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-end=&quot;465&quot; data-start=&quot;445&quot;&gt;✅ [3단계] 배경 영상 확보&lt;/h2&gt;
&lt;p data-end=&quot;776&quot; data-start=&quot;759&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유튜브 영상으로 나올 배경을 찾아서 내려 받아주세요.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;  무료 고화질 소스&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;920&quot; data-start=&quot;777&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;819&quot; data-start=&quot;777&quot;&gt;&lt;a data-end=&quot;819&quot; data-start=&quot;779&quot;&gt;Pexels&lt;/a&gt;&lt;/li&gt;
&lt;li data-end=&quot;860&quot; data-start=&quot;820&quot;&gt;&lt;a data-end=&quot;860&quot; data-start=&quot;822&quot;&gt;Pixabay&lt;/a&gt;&lt;/li&gt;
&lt;li data-end=&quot;920&quot; data-start=&quot;861&quot;&gt;키워드: &amp;ldquo;night sky, stars, clouds, rain window, moonlight&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;932&quot; data-start=&quot;922&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;권장 사항&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;992&quot; data-start=&quot;933&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;966&quot; data-start=&quot;933&quot;&gt;30초~1분짜리 영상을 여러 개 모아 루프로 이어 붙이기&lt;/li&gt;
&lt;li data-end=&quot;992&quot; data-start=&quot;967&quot;&gt;느린 장면, 카메라 흔들림 없는 장면 선호&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1044&quot; data-start=&quot;999&quot; data-ke-size=&quot;size26&quot;&gt;✅ [4단계] 영상 편집 구성 (예: CapCut, Premiere Pro)&lt;/h2&gt;
&lt;p data-end=&quot;1056&quot; data-start=&quot;1046&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CapCut 편집 툴은 사용하기 편하고 쉬워서 초보자를 위해서는 딱입니다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1056&quot; data-start=&quot;1046&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구성 요소&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1178&quot; data-start=&quot;1057&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1082&quot; data-start=&quot;1057&quot;&gt;배경 영상 루프 (8시간 타임라인 만들기)&lt;/li&gt;
&lt;li data-end=&quot;1118&quot; data-start=&quot;1083&quot;&gt;AI 음악 + 자연음 믹싱 (다소 낮은 볼륨의 효과음 추천)&lt;/li&gt;
&lt;li data-end=&quot;1144&quot; data-start=&quot;1119&quot;&gt;텍스트 자막 삽입 (오프닝/콜투액션/엔딩)&lt;/li&gt;
&lt;li data-end=&quot;1178&quot; data-start=&quot;1145&quot;&gt;인트로 &amp;amp; 아웃트로: 15초~30초 부드러운 페이드 효과&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1206&quot; data-start=&quot;1185&quot; data-ke-size=&quot;size26&quot;&gt;✅ [5단계] 유튜브 업로드 자료&lt;/h2&gt;
&lt;h3 data-end=&quot;1220&quot; data-start=&quot;1208&quot; data-ke-size=&quot;size23&quot;&gt;유튜브 개설부터 해야겠죠. 명상 관련 채널을 개설하고 로고+채널소개글을 올려요. 뭘 써야할지 모르겠다면 GPT에 물어보세요. 너무 고민하지 말고요.&amp;nbsp;그다음은 영상을 올려야겠죠. 미리캔버스에서 썸네일도 만들면 더 좋겠죠.&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;1220&quot; data-start=&quot;1208&quot; data-ke-size=&quot;size23&quot;&gt;  영상 제목&lt;/h3&gt;
&lt;h3 data-end=&quot;1220&quot; data-start=&quot;1208&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;1220&quot; data-start=&quot;1208&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;  8시간 숙면 유도 음악 | AI가 만든 빗소리와 명상 사운드 | 깊은 잠을 위한 힐링음악&lt;/span&gt;&lt;/h3&gt;
&lt;h2 data-end=&quot;1623&quot; data-start=&quot;1602&quot; data-ke-size=&quot;size26&quot;&gt;✅ [6단계] 썸네일 템플릿 제작&lt;/h2&gt;
&lt;p data-end=&quot;1636&quot; data-start=&quot;1625&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;디자인 요소&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1750&quot; data-start=&quot;1637&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1658&quot; data-start=&quot;1637&quot;&gt;배경: 흐릿한 달빛/별/구름 이미지&lt;/li&gt;
&lt;li data-end=&quot;1698&quot; data-start=&quot;1659&quot;&gt;글자:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1698&quot; data-start=&quot;1667&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1680&quot; data-start=&quot;1667&quot;&gt;&quot;8시간 숙면 음악&quot;&lt;/li&gt;
&lt;li data-end=&quot;1698&quot; data-start=&quot;1683&quot;&gt;&quot;AI 작곡 + 빗소리&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1750&quot; data-start=&quot;1699&quot;&gt;글꼴: 부드럽고 둥근 스타일 (예: Noto Sans KR, Spoqa Han Sans)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;도구 추천&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1822&quot; data-start=&quot;1763&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1822&quot; data-start=&quot;1763&quot;&gt;Canva (&lt;a href=&quot;https://www.canva.com&quot;&gt;https://www.canva.com&lt;/a&gt;) 또는 미리캔버스(&lt;a href=&quot;https://www.miricanvas.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.miricanvas.com/&lt;/a&gt;)&lt;br /&gt;무료 템플릿 많고 초보자도 쉽게 편집 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;1602&quot; data-end=&quot;1623&quot; data-ke-size=&quot;size26&quot;&gt;✅ [7단계] 유튜브 업로드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드디어 완성했습니다. AI가 제시한 방법을 따라 만들어 봤습니다. 처음이니 각종 툴과 영상 제작에 익숙해 지도록 자주 만들어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-start=&quot;1625&quot; data-end=&quot;1636&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://youtu.be/yxcQOCS9yq4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/yxcQOCS9yq4&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=yxcQOCS9yq4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/clFTAL/hyY5fq4tqt/pJpgGoahHUJdkfFhwfluq1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bHuHb7/hyY5hCqWOp/XIz215lmDunL0yYSjy2eZK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;깊은 잠을 위한 명상 사운드 - 비와 당신의 이야기&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/yxcQOCS9yq4&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&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;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <category>aiva</category>
      <category>명상</category>
      <category>미리캔버스</category>
      <category>수면</category>
      <category>유튜브 만들기</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/751</guid>
      <comments>https://iamgus.tistory.com/751#entry751comment</comments>
      <pubDate>Sat, 14 Jun 2025 17:12:11 +0900</pubDate>
    </item>
    <item>
      <title>AI 인공지능 이용해 피아노 작곡해보기</title>
      <link>https://iamgus.tistory.com/750</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;누구나 피아노 작곡을 할 수 있다. 단, AI와 함께라면 ...&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;피아노로 아름다운 곡을 듣거나 연주할 때면 이걸 직접 작곡할 수 없을까 하는 생각을 해보았을 거다.&amp;nbsp; AI가 못하는 게 없는 세상인데 이 정도는 어렵지 않을 것 같아 작업을 시켜봤는데 결과는 놀라웠다.&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작곡에서 가장 중용한 건 화음이다. 기본음을 정해 시작하고 다음 화음을 연결하는 방식이다. 이러한 방식으로 곡이 완성되기 때문에 이것을 AI에게 알려 주기만 하면 나머지는 알아서 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 작곡 규칙 정하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI에 작업을 시키기 전에 먼저 작곡 룰을 만들자. 유튜브에서 찾은 간단한 작곡 규칙이다. 시작과 끝 그리고 중간 연결화음 정의가 되어있다. 이거면 충분하다. 본격적으로 작업을 시켜보자.&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;1013&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QaUCb/btsMbvGOtbA/oNtiArNeYu8pwB8qGptgDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QaUCb/btsMbvGOtbA/oNtiArNeYu8pwB8qGptgDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QaUCb/btsMbvGOtbA/oNtiArNeYu8pwB8qGptgDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQaUCb%2FbtsMbvGOtbA%2FoNtiArNeYu8pwB8qGptgDK%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;1013&quot; height=&quot;346&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 작곡 프롬프트 작성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;첨부한 화음규칙에 맞춰 8마디 작곡을 하는 파이썬 코드를 작성해줘. 그리고 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;악보를 확인할 수 있는 앱과 연동할 수 있도록 해줘.&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739088555721&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import random
from typing import List, Tuple
import os
from music21 import *

class MusicComposer:
    def __init__(self):
        self.harmony_rules = {
            'I': ['ii', 'iii', 'IV', 'V', 'vi'],
            'ii': ['IV', 'V'],
            'iii': ['ii'],
            'IV': ['ii', 'V'],
            'V': ['I', 'ii'],
            'vi': ['ii', 'IV', 'V']
        }
        
        self.note_mapping = {
            1: 'C4',
            2: 'D4',
            3: 'E4',
            4: 'F4',
            5: 'G4',
            6: 'A4',
            7: 'B4'
        }
        
        self.chord_notes = {
            'I': [1, 3, 5],
            'ii': [2, 4, 6],
            'iii': [3, 5, 7],
            'IV': [4, 6, 1],
            'V': [5, 7, 2],
            'vi': [6, 1, 3]
        }
        
        # 리듬 패턴 정의 (각 패턴의 합은 4.0이어야 함)
        self.rhythm_patterns = [
            [1.0, 1.0, 1.0, 1.0],  # 4분음표 4개
            [1.0, 0.5, 0.5, 1.0, 1.0],  # 4분음표-8분음표2개-4분음표2개
            [1.0, 1.0, 0.5, 0.5, 1.0],  # 4분음표2개-8분음표2개-4분음표
            [0.5, 0.5, 1.0, 1.0, 1.0],  # 8분음표2개-4분음표3개
        ]
    
    def generate_chord_progression(self) -&amp;gt; List[str]:
        progression = ['I']
        for _ in range(6):
            current = progression[-1]
            next_chord = random.choice(self.harmony_rules[current])
            progression.append(next_chord)
        
        if progression[-1] != 'V':
            progression[-1] = 'V'
        progression.append('I')
        
        return progression
    
    def generate_melody(self, chord_progression: List[str]) -&amp;gt; List[tuple[List[int], List[float]]]:
        &quot;&quot;&quot;멜로디와 리듬을 생성&quot;&quot;&quot;
        melody = []
        for chord in chord_progression:
            available_notes = self.chord_notes[chord]
            # 랜덤하게 리듬 패턴 선택
            rhythm = random.choice(self.rhythm_patterns)
            # 리듬 패턴 길이만큼 음표 생성
            notes = [random.choice(available_notes) for _ in range(len(rhythm))]
            melody.append((notes, rhythm))
        return melody

    def create_score(self, chord_progression: List[str], melody: List[tuple[List[int], List[float]]], 
                    filename: str = &quot;composition&quot;) -&amp;gt; str:
        score = stream.Score()
        
        # 멜로디 파트
        melody_part = stream.Part()
        melody_part.append(instrument.Piano())
        melody_part.append(meter.TimeSignature('4/4'))
        melody_part.append(key.Key('C'))
        
        # 반주 파트
        accompaniment_part = stream.Part()
        accompaniment_part.append(instrument.Piano())
        accompaniment_part.append(meter.TimeSignature('4/4'))
        accompaniment_part.append(key.Key('C'))
        
        # 멜로디 노트 추가
        for bar_idx, (bar_notes, bar_rhythm) in enumerate(melody):
            measure = stream.Measure(number=bar_idx + 1)
            for note_num, note_length in zip(bar_notes, bar_rhythm):
                note_name = self.note_mapping[note_num]
                n = note.Note(note_name, quarterLength=note_length)
                measure.append(n)
            melody_part.append(measure)
        
        # 반주 (2분음표 코드) 추가
        for chord_idx, chord_name in enumerate(chord_progression):
            measure = stream.Measure(number=chord_idx + 1)
            chord_notes = self.chord_notes[chord_name]
            chord_note_names = [self.note_mapping[n] for n in chord_notes]
            # 한 마디에 2분음표 코드 2개
            for _ in range(2):
                c = chord.Chord(chord_note_names, quarterLength=2.0)
                measure.append(c)
            accompaniment_part.append(measure)
        
        score.append(melody_part)
        score.append(accompaniment_part)
        
        xml_path = f&quot;{filename}.musicxml&quot;
        score.write('musicxml', xml_path)
        
        return xml_path

    def compose_and_visualize(self):
        chord_progression = self.generate_chord_progression()
        melody = self.generate_melody(chord_progression)
        
        print(&quot;화음 진행:&quot;, ' '.join(chord_progression))
        print(&quot;\n멜로디 (음표, 리듬):&quot;)
        for bar_num, ((notes, rhythm), chord) in enumerate(zip(melody, chord_progression), 1):
            print(f&quot;마디 {bar_num} ({chord}): 음표={notes}, 리듬={rhythm}&quot;)
        
        xml_file = self.create_score(chord_progression, melody)
        print(f&quot;\nMusicXML 파일이 생성되었습니다: {xml_file}&quot;)
        
        try:
            if os.name == 'nt':
                os.startfile(xml_file)
            else:
                os.system(f'open {xml_file}')
        except Exception as e:
            print(&quot;악보를 자동으로 열 수 없습니다. MuseScore에서 직접 파일을 열어주세요.&quot;)

def main():
    try:
        import music21
    except ImportError:
        print(&quot;필요한 패키지를 설치합니다...&quot;)
        os.system(&quot;pip install music21&quot;)
        print(&quot;패키지 설치가 완료되었습니다. 프로그램을 다시 실행해주세요.&quot;)
        return

    composer = MusicComposer()
    composer.compose_and_visualize()

if __name__ == &quot;__main__&quot;:
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;span style=&quot;text-align: start;&quot;&gt;MuseScore 앱 설치 (&lt;a style=&quot;color: #000000;&quot; href=&quot;https://musescore.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://musescore.com/&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 작곡한 악보와 음악을 듣기 위해 MusesScore를 설치한다. 무료임.&amp;nbsp; 파이썬코드를 실행하면 앱 연동하여 자동 실행된다. MusesScore에서 악보 수정도 편하게 할 수 있다.&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;1561&quot; data-origin-height=&quot;1281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Drizf/btsMbtCkNwr/TMgMGz9WcZ2THTkN0Toez1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Drizf/btsMbtCkNwr/TMgMGz9WcZ2THTkN0Toez1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Drizf/btsMbtCkNwr/TMgMGz9WcZ2THTkN0Toez1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDrizf%2FbtsMbtCkNwr%2FTMgMGz9WcZ2THTkN0Toez1%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;1561&quot; height=&quot;1281&quot; data-origin-width=&quot;1561&quot; data-origin-height=&quot;1281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. 작곡 실행 영상&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8마디 간단한 피아노 연습곡이 완성되었다. 화음에 맞는 멜로디를 구성하게 했다. 단순해 보이지만 화음 규칙을 맞췄기 때문에 다음 마디가 자연스럽게 연결된다. 8분 음표와 4분 음표 외 다양한 음표와 리듬을 추가해 작곡을 하면 훌륭한 연주가 될 수도 있을 것이다.&amp;nbsp;&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;작곡이야 말로 어쩌면 AI가 가장 쉽게 할 수 있는 분야가 아닐까하는 생각이 든다. 왜냐하면 다음 코드르 보면 이해가 바로 될 것이다. 고전 천재적인 음악가들 모차르트나 쇼팽 같은 대가들이 어떤 식으로 작곡을 했었는지는 모르지만, 요즘 대부분의 작곡은 이러한 어느 정도 정해진 규칙을 따라 곡을 만들 것 같다.&amp;nbsp;그렇다면 그 룰들을 수집해 AI에 랜덤하게 생성하게 하면 멋진 곡이 나올 확률이 높아지지 않겠는가... :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하모니 룰이다.&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;harmony_rules&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'I'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'ii'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'iii'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'IV'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'V'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'vi'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'ii'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'IV'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'V'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'iii'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'ii'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'IV'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'ii'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'V'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'V'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'I'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'ii'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'vi'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'ii'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'IV'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'V'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 구성은 다음과 같다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;note_mapping&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'C4'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'D4'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'E4'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'F4'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'G4'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'A4'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'B4'&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;chord_notes&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'I'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'ii'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'iii'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'IV'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'V'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'vi'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 패턴은 다음과 같이 정의한다 .&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# 리듬 패턴 정의 (각 패턴의 합은 4.0이어야 함)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;rhythm_patterns&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; [&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;], &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# 4분음표 4개&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;], &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# 4분음표-8분음표2개-4분음표2개&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;], &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# 4분음표2개-8분음표2개-4분음표&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;], &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# 8분음표2개-4분음표3개&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ]&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/750</guid>
      <comments>https://iamgus.tistory.com/750#entry750comment</comments>
      <pubDate>Sun, 9 Feb 2025 17:27:34 +0900</pubDate>
    </item>
    <item>
      <title>AI 성수동 케이크 맛집 검색 사이트 만들기</title>
      <link>https://iamgus.tistory.com/749</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;AI 인공지능을 이용해 맛집을 찾아주는 사이트를 만들었다. 음식점 API를 호출해 간단한 코드로 결과를 가져왔었다. 유려한 UI도 함께 제공을 했었는데, 이번에는 검색결과에 나온 음식점 위치를 지도에서 찾아주는 코드를 추가로 작성하자.&amp;nbsp;&lt;/h4&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://iamgus.tistory.com/747&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.02 - [코드리뷰/chatGPT(Python)코드] - 광화문 맛집 찾기 10분 만에 만들기 - DeepSeek, Cluade, ChatGpt 이용&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738916466375&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;광화문 맛집 찾기 10분 만에 만들기 - DeepSeek, Cluade, ChatGpt 이용&quot; data-og-description=&quot;네이버 부동산 사이트처럼 API를 사용하는 경우 이를 이용해 응용 프로그램을 만들 수 있다.&amp;nbsp;지역명을 입력하면 그 주변 맛집을 찾아주는 서비스를 만들어 보자. 개발 방식은 지난 포스팅한 네&quot; data-og-host=&quot;iamgus.tistory.com&quot; data-og-source-url=&quot;https://iamgus.tistory.com/747&quot; data-og-url=&quot;https://iamgus.tistory.com/747&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/D9y3z/hyYcaXdkJ7/9PQmPRvtf97NdvczEWoaGk/img.png?width=800&amp;amp;height=571&amp;amp;face=0_0_800_571,https://scrap.kakaocdn.net/dn/HJzmm/hyYclj75bY/kOA9ZklMycjdmez7N46ohk/img.png?width=800&amp;amp;height=571&amp;amp;face=0_0_800_571,https://scrap.kakaocdn.net/dn/fjs1w/hyYb7GcimR/xxpyLxc6sZIEJLz7u8dvKK/img.png?width=1932&amp;amp;height=1013&amp;amp;face=0_0_1932_1013&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/747&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iamgus.tistory.com/747&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/D9y3z/hyYcaXdkJ7/9PQmPRvtf97NdvczEWoaGk/img.png?width=800&amp;amp;height=571&amp;amp;face=0_0_800_571,https://scrap.kakaocdn.net/dn/HJzmm/hyYclj75bY/kOA9ZklMycjdmez7N46ohk/img.png?width=800&amp;amp;height=571&amp;amp;face=0_0_800_571,https://scrap.kakaocdn.net/dn/fjs1w/hyYb7GcimR/xxpyLxc6sZIEJLz7u8dvKK/img.png?width=1932&amp;amp;height=1013&amp;amp;face=0_0_1932_1013');&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;광화문 맛집 찾기 10분 만에 만들기 - DeepSeek, Cluade, ChatGpt 이용&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;네이버 부동산 사이트처럼 API를 사용하는 경우 이를 이용해 응용 프로그램을 만들 수 있다.&amp;nbsp;지역명을 입력하면 그 주변 맛집을 찾아주는 서비스를 만들어 보자. 개발 방식은 지난 포스팅한 네&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iamgus.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라드를 이용했고 프롬프트는 다음과 같다. 이전 소스코드를 첨부하여 알려주고 2개 개선사항을 요청했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;background-color: #262624; color: #e5e5e2; text-align: start;&quot;&gt;첨부한 코드는 음식점 찾는 파이썬 코드야. 다음 작업을 추가해줘.&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;background-color: #262624; color: #e5e5e2; text-align: start;&quot;&gt; 1. 검색 결과를 더블클릭하면 네이버 지도에 해당 음식점 위치를 표치해줘. &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;background-color: #262624; color: #e5e5e2; text-align: start;&quot;&gt;2. 검색창에서 엔터를 치면 검색이 바로 되도록 수정해 줘.&lt;/span&gt; &lt;/i&gt;&lt;/b&gt;&lt;/span&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;2465&quot; data-origin-height=&quot;855&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ue9g8/btsMbF9yaqm/DKAyroBDjelcHNMKcMU9K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ue9g8/btsMbF9yaqm/DKAyroBDjelcHNMKcMU9K0/img.png&quot; data-alt=&quot;streamlit 홈페이지 기능으로 맛집 검색 띄우기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ue9g8/btsMbF9yaqm/DKAyroBDjelcHNMKcMU9K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fue9g8%2FbtsMbF9yaqm%2FDKAyroBDjelcHNMKcMU9K0%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;2465&quot; height=&quot;855&quot; data-origin-width=&quot;2465&quot; data-origin-height=&quot;855&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;streamlit 홈페이지 기능으로 맛집 검색 띄우기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;맛집 검색결과창에서 오른쪽 '지도보기'를 클릭하면 네이버 지도가 나타난다. 식당명과 주소로 검색해 지도에 표시한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1699&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBMEgw/btsMcfbxqav/2R1fPDvQBuAYNJptuO7CU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBMEgw/btsMcfbxqav/2R1fPDvQBuAYNJptuO7CU1/img.png&quot; data-alt=&quot;네이버 지도 식당 검색 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBMEgw/btsMcfbxqav/2R1fPDvQBuAYNJptuO7CU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBMEgw%2FbtsMcfbxqav%2F2R1fPDvQBuAYNJptuO7CU1%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;1699&quot; height=&quot;758&quot; data-origin-width=&quot;1699&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네이버 지도 식당 검색 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;꽤&lt;/span&gt; 쓸만하지 않은가!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 작업 결과를 보고 놀라운 점 하나는 내가 시키지도 않은, 아니 미처 생각하지 못한 부분을 짚어 주는 것이다. 다음을 보자. 클로드는 사용자에게 편리한 화면을 제공하기 위해 GUI를 개선한 것이다. 이걸 마다할 이유는 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;테이블 스타일 개선:&lt;/i&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;행 간격과 패딩을 늘려 가독성 향상&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;짝수/홀수 행의 배경색을 다르게 설정&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;평점을 강조 표시&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;지도보기 버튼을 더 눈에 띄게 디자인&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엔터키와 검색 버튼 클릭 시 동일한 동작 수행&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;불필요한 상태 관리 코드 제거&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시간이 갈수록 이런 것들은 디폴트가 되어 갈 것이고 요청자가 느끼지 못할 것이다. '개떡같이 요청해도 찰떡같이 만들어 드립니다요.'가 캐치프레이즈가 되고 사용자도 당연하다고 생각할 터이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그럼 소스코드를 전혀 몰라도 될까? 아니다. 프로그램 언어를 모르면 이런 요청을 하기도 문제가 생겼을 때 해결하기도 어렵다. 이과적인 질문이 필요할 때가 있는 것이다. 오류를 해결하는 데 시간이 노력이 단축된다. 문과적인 발상은 창의적인 면에서 좋을지 모르나 버그 수정이나 부분 개선 시는 모호한 면이 많아 엉뚱한 결과를 가져오기 쉽다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결론은 파이썬을 공부하면 된다. 간단한 코드를 작성하고 실행한다. 그리고 조금씩 원하는 것들을 만들어 보고 프로그램 돌아가는 메커니즘이 어느 정도 이해되면 인공지능에게 복잡한 것들을 시키면 된다. 업무효율이 10배는 올라간다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/749</guid>
      <comments>https://iamgus.tistory.com/749#entry749comment</comments>
      <pubDate>Fri, 7 Feb 2025 17:46:05 +0900</pubDate>
    </item>
    <item>
      <title>AI 인공지능 프리젠테이션 만들기 자동화</title>
      <link>https://iamgus.tistory.com/748</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;클로드나 ChatGpt로 파워포인트 발표자료를 만들어 보자.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;너무 간단해서 이젠 놀랍다기보다는 당연한 것 같다. 만들고 싶은 발표 자료 주제를 선정해 AI에 프롬프트를 주면 된다.&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #262624; color: #e5e5e2; text-align: start;&quot;&gt;&quot;인공지능을 이용한 프리젠테이션 만들기 자동화&quot;에 대한 주제로 슬라이드 10장을 만들어줘. 표지와 목차를 포함하고 파이썬 코드로 작성해 줘.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;인공지능은 LLM 이용해 발표자료를 자동으로 만드는 파이썬 코드를 알려준다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;그 코드를 vs code에서 실행한다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;파워포인트 파일이 자동으로 생성된다.&amp;nbsp;끝!!!&lt;/b&gt;&lt;/span&gt;&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;591&quot; data-origin-height=&quot;1162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAN1VX/btsMbyI7WyJ/4zFkWm32kQHZ0TxDlfXG11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAN1VX/btsMbyI7WyJ/4zFkWm32kQHZ0TxDlfXG11/img.png&quot; data-alt=&quot;claude로 만든 PPT 자동화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAN1VX/btsMbyI7WyJ/4zFkWm32kQHZ0TxDlfXG11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAN1VX%2FbtsMbyI7WyJ%2F4zFkWm32kQHZ0TxDlfXG11%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;591&quot; height=&quot;1162&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;1162&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;claude로 만든 PPT 자동화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬라이드에 서식이나 이미지 등을&amp;nbsp; 추가해 가독성 좋게 만들 수도 있다. 하지만 그것보다는 발표자료 초안을 아주 쉽고 빠르게 만들 수 있다. 그다음은 수작업으로 다듬는 작업을 하면 완성된다. 물론 모두 인공지능에 요청해도 되겠지만 마음에 쏙 들지는 않을 것 같다. 발표자료 틀을 잡는데 주안점을 두어라..&lt;/p&gt;
&lt;pre id=&quot;code_1738908533852&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor

def create_ai_presentation():
    prs = Presentation()
    
    # 슬라이드 마스터 설정
    title_slide_layout = prs.slide_layouts[0]  # 제목 슬라이드
    content_slide_layout = prs.slide_layouts[1]  # 내용 슬라이드
    
    # 1. 표지 슬라이드
    slide = prs.slides.add_slide(title_slide_layout)
    title = slide.shapes.title
    subtitle = slide.placeholders[1]
    
    title.text = &quot;인공지능을 이용한 프리젠테이션 만들기 자동화&quot;
    subtitle.text = &quot;AI Presentation Automation\n2025년 2월&quot;
    
    # 2. 목차 슬라이드
    slide = prs.slides.add_slide(content_slide_layout)
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = &quot;목차&quot;
    content.text = &quot;&quot;&quot;1. 인공지능 프레젠테이션 자동화 개요
2. 자동화의 필요성과 장점
3. 주요 기술 스택 소개
4. 텍스트 생성 AI 활용
5. 이미지 생성 AI 활용
6. 자동화 구현 방법
7. 실제 적용 사례
8. 한계점과 개선 방향&quot;&quot;&quot;
    
    # 3. 개요 슬라이드
    slide = prs.slides.add_slide(content_slide_layout)
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = &quot;인공지능 프레젠테이션 자동화 개요&quot;
    content.text = &quot;&quot;&quot;&amp;bull; 프레젠테이션 자동화의 정의
  - 인공지능을 활용한 콘텐츠 생성 및 구성
  - 템플릿 기반의 자동화된 슬라이드 제작

&amp;bull; 주요 활용 분야
  - 비즈니스 보고서
  - 교육 자료
  - 제품 소개자료&quot;&quot;&quot;
    
    # 4. 필요성과 장점 슬라이드
    slide = prs.slides.add_slide(content_slide_layout)
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = &quot;자동화의 필요성과 장점&quot;
    content.text = &quot;&quot;&quot;&amp;bull; 시간 절약
  - 반복적인 작업 최소화
  - 효율적인 리소스 활용

&amp;bull; 일관성 유지
  - 디자인 표준화
  - 브랜드 아이덴티티 유지

&amp;bull; 품질 향상
  - 전문적인 템플릿 활용
  - 오류 최소화&quot;&quot;&quot;
    
    # 5. 기술 스택 슬라이드
    slide = prs.slides.add_slide(content_slide_layout)
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = &quot;주요 기술 스택 소개&quot;
    content.text = &quot;&quot;&quot;&amp;bull; 프로그래밍 언어
  - Python
  - python-pptx 라이브러리

&amp;bull; AI 모델
  - GPT 시리즈
  - DALL-E
  - Stable Diffusion

&amp;bull; 추가 도구
  - 템플릿 엔진
  - 데이터 처리 라이브러리&quot;&quot;&quot;
    
    # 6. 텍스트 생성 AI 슬라이드
    slide = prs.slides.add_slide(content_slide_layout)
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = &quot;텍스트 생성 AI 활용&quot;
    content.text = &quot;&quot;&quot;&amp;bull; 내용 생성
  - 주제별 핵심 내용 자동 생성
  - 키워드 기반 콘텐츠 확장

&amp;bull; 문장 최적화
  - 문법 교정
  - 가독성 향상
  - 전문용어 적절성 검토&quot;&quot;&quot;
    
    # 7. 이미지 생성 AI 슬라이드
    slide = prs.slides.add_slide(content_slide_layout)
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = &quot;이미지 생성 AI 활용&quot;
    content.text = &quot;&quot;&quot;&amp;bull; 커스텀 이미지 생성
  - 주제에 맞는 이미지 자동 생성
  - 스타일 일관성 유지

&amp;bull; 이미지 최적화
  - 해상도 조정
  - 컬러 보정
  - 레이아웃 최적화&quot;&quot;&quot;
    
    # 8. 구현 방법 슬라이드
    slide = prs.slides.add_slide(content_slide_layout)
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = &quot;자동화 구현 방법&quot;
    content.text = &quot;&quot;&quot;&amp;bull; 시스템 구성
  - API 연동 설정
  - 템플릿 구성
  - 데이터 파이프라인 구축

&amp;bull; 프로세스 자동화
  - 콘텐츠 생성
  - 디자인 적용
  - 품질 검증&quot;&quot;&quot;
    
    # 9. 적용 사례 슬라이드
    slide = prs.slides.add_slide(content_slide_layout)
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = &quot;실제 적용 사례&quot;
    content.text = &quot;&quot;&quot;&amp;bull; 기업 보고서 자동화
  - 월간/분기 실적 보고서
  - 시장 분석 리포트

&amp;bull; 교육 자료 제작
  - 온라인 강의 자료
  - 학습 교재

&amp;bull; 마케팅 자료
  - 제품 소개서
  - 프로모션 자료&quot;&quot;&quot;
    
    # 10. 한계점과 개선 방향 슬라이드
    slide = prs.slides.add_slide(content_slide_layout)
    title = slide.shapes.title
    content = slide.placeholders[1]
    
    title.text = &quot;한계점과 개선 방향&quot;
    content.text = &quot;&quot;&quot;&amp;bull; 현재 한계점
  - 복잡한 디자인 처리의 제약
  - 맥락 이해의 한계
  - 창의성 표현의 한계

&amp;bull; 개선 방향
  - AI 모델 고도화
  - 사용자 피드백 반영
  - 다양한 템플릿 확보&quot;&quot;&quot;
    
    # 프레젠테이션 저장
    prs.save('AI_Presentation_Automation.pptx')

if __name__ == &quot;__main__&quot;:
    create_ai_presentation()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 말고 VBA를 이용해 엑셀에서 만드는 방안도 있지만 별로 추천하고 싶지는 않다. Visual Basic언어가 30년도 더 되었고 지금은 그다지 사용하지 않기 때문이다. 파이썬처럼 프로그램이 직관적이거나 사용법이 쉽지도 않다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 인공지능을 이용한 확장은 끝을 알아보기 힘들 정도다. 이런 분야가 있다는 사실을 모르기 때문에 시도조차 하지 못하는 게 얼마나 많겠는가! 마치 파워포인트 자동화를 생각하지 못했다면 여전히 많은 시간을 들여 수작업을 하고 있을게 뻔하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 이러한 사용법, 물고기를 잡는 방법, 여기선 인공 지능을 &amp;nbsp;일하게 하는 프롬프트 작성 방법을 깨닫게 되면 지금까지 당연하다고 생각한 모든 고정관념을 깨부스는 계기가 될 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/748</guid>
      <comments>https://iamgus.tistory.com/748#entry748comment</comments>
      <pubDate>Fri, 7 Feb 2025 15:20:14 +0900</pubDate>
    </item>
    <item>
      <title>광화문 맛집 찾기 10분 만에 만들기 - DeepSeek, Cluade, ChatGpt 이용</title>
      <link>https://iamgus.tistory.com/747</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;네이버 부동산 사이트처럼 API를 사용하는 경우 이를 이용해 응용 프로그램을 만들 수 있다.&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;지역명을 입력하면 그 주변 맛집을 찾아주는 서비스를 만들어 보자. 개발 방식은 지난 포스팅한 네이버 부동산 정보 추출과 동일한다. 처음엔 복잡해 보이는데 한 두 번만 해보면 돌아가는 메커니즘이 보이고 응용 방안도 다양하다는 걸 알게 된다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 다이닝코드에서 광화문 검색&lt;/h4&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;897&quot; data-origin-height=&quot;1112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCBh4/btsL5jFb2oz/AOhNdx72H1pCQ2iH66l7fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCBh4/btsL5jFb2oz/AOhNdx72H1pCQ2iH66l7fK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCBh4/btsL5jFb2oz/AOhNdx72H1pCQ2iH66l7fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCBh4%2FbtsL5jFb2oz%2FAOhNdx72H1pCQ2iH66l7fK%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;897&quot; height=&quot;1112&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;1112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;F12 개발자 모드 - Network - Fetch/XHR 결과에서 맛집 정보를 담은 항목을 카피한다. cURL 형태로 복사해야 한다. (마우스 오른쪽 copy-cURL(bash) 이용&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. curl conver 사이트 접소해 파이썬 코드로 변환한다.&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1932&quot; data-origin-height=&quot;1013&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pATyf/btsL4cfYHuo/Rq0yXy0YIO8eJyFQDhJEEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pATyf/btsL4cfYHuo/Rq0yXy0YIO8eJyFQDhJEEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pATyf/btsL4cfYHuo/Rq0yXy0YIO8eJyFQDhJEEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpATyf%2FbtsL4cfYHuo%2FRq0yXy0YIO8eJyFQDhJEEk%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;1932&quot; height=&quot;1013&quot; data-origin-width=&quot;1932&quot; data-origin-height=&quot;1013&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. LLM 인공지능에 코드 작성 요청한다. (DeepSeek, Claude, ChatGpt 아무거나) 개인적으로 Claude가 만족도 높았음.&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, Output에 대한 정보를 인공지능이 모르기 때문에 형태를 알려줘야 한다. response부분을 일부 카피해서 인공지능 요청 시 포함해 물어본다.&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;1164&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7Ew55/btsL4yQGAnc/clWnQmZAIfr5Hv2lYrY070/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7Ew55/btsL4yQGAnc/clWnQmZAIfr5Hv2lYrY070/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7Ew55/btsL4yQGAnc/clWnQmZAIfr5Hv2lYrY070/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7Ew55%2FbtsL4yQGAnc%2FclWnQmZAIfr5Hv2lYrY070%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;1164&quot; height=&quot;530&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1738475031808&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests

headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
    'Connection': 'keep-alive',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Origin': 'https://www.diningcode.com',
    'Referer': 'https://www.diningcode.com/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-site',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
    'sec-ch-ua': '&quot;Not A(Brand&quot;;v=&quot;8&quot;, &quot;Chromium&quot;;v=&quot;132&quot;, &quot;Google Chrome&quot;;v=&quot;132&quot;',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '&quot;Windows&quot;',
}

data = {
    'query': '행당동',
    'addr': '',
    'keyword': '',
    'order': 'r_score',
    'distance': '',
    'rn_search_flag': 'on',
    'search_type': 'poi_search',
    'lat': '',
    'lng': '',
    'rect': '',
    's_type': '',
    'token': '',
    'mode': 'poi',
    'dc_flag': '1',
    'page': '2',
    'size': '20',
}

response = requests.post('https://im.diningcode.com/API/isearch/', headers=headers, data=data)
===========
{
    &quot;data&quot;: &quot;{\&quot;query\&quot;:\&quot;행당동\&quot;,\&quot;from\&quot;:20,\&quot;size\&quot;:20,\&quot;order\&quot;:\&quot;r_score\&quot;,\&quot;rn_search_flag\&quot;:\&quot;on\&quot;}&quot;,
    &quot;result_code&quot;: &quot;100&quot;,
    &quot;result_data&quot;: {
        &quot;params&quot;: {
            &quot;query&quot;: &quot;행당동&quot;,
            &quot;from&quot;: 20,
            &quot;size&quot;: 20,
            &quot;order&quot;: &quot;r_score&quot;,
            &quot;rn_search_flag&quot;: &quot;on&quot;
        },
        &quot;search_filter&quot;: [
            {
                &quot;group&quot;: &quot;이용자층&quot;,
                &quot;list&quot;: [
                    {
                        &quot;display&quot;: &quot;20대&quot;,
                        &quot;query&quot;: &quot;20대&quot;
                    },
                    {
                        &quot;display&quot;: &quot;30대&quot;,
                        &quot;query&quot;: &quot;30대&quot;
                    },
                    {
                        &quot;display&quot;: &quot;40대&quot;,
                        &quot;query&quot;: &quot;40대&quot;
                    },
                    {
                        &quot;display&quot;: &quot;50대&quot;,
                        &quot;query&quot;: &quot;50대&quot;
                    },
                    {
                        &quot;display&quot;: &quot;60대이상&quot;,
                        &quot;query&quot;: &quot;60대이상&quot;
                    },
                    {
                        &quot;display&quot;: &quot;여성&quot;,
                        &quot;query&quot;: &quot;여성&quot;
                    },
                    {
                        &quot;display&quot;: &quot;남성&quot;,
                        &quot;query&quot;: &quot;남성&quot;
                    }
                ]
            },
            {
                &quot;group&quot;: &quot;카테고리&quot;,
                &quot;list&quot;: [
                    {
                        &quot;display&quot;: &quot;밥집&quot;,
                        &quot;query&quot;: &quot;밥집&quot;
                    },
                    {
                        &quot;display&quot;: &quot;술집&quot;,
                        &quot;query&quot;: &quot;술집&quot;
                    },
                    {
                        &quot;display&quot;: &quot;고깃집&quot;,
                        &quot;query&quot;: &quot;고깃집&quot;
                    },
                    {
                        &quot;display&quot;: &quot;한식&quot;,
                        &quot;query&quot;: &quot;한식&quot;
                    },
                    {
                        &quot;display&quot;: &quot;카페&quot;,
                        &quot;query&quot;: &quot;카페&quot;
                    },
                    {
                        &quot;display&quot;: &quot;일식&quot;,
                        &quot;query&quot;: &quot;일식&quot;
                    },
                    {
                        &quot;display&quot;: &quot;횟집&quot;,
                        &quot;query&quot;: &quot;횟집&quot;
                    },
                    {
                        &quot;display&quot;: &quot;양식&quot;,
                        &quot;query&quot;: &quot;양식&quot;
                    },
                    {
                        &quot;display&quot;: &quot;중식&quot;,
                        &quot;query&quot;: &quot;중식&quot;
                    },
                    {
                        &quot;display&quot;: &quot;국물요리&quot;,
                        &quot;query&quot;: &quot;국물요리&quot;
                    },
                    {
                        &quot;display&quot;: &quot;해산물&quot;,
                        &quot;query&quot;: &quot;해산물&quot;
                    },
                    {
                        &quot;display&quot;: &quot;면요리&quot;,
                        &quot;query&quot;: &quot;면요리&quot;
                    },
                    {
                        &quot;display&quot;: &quot;이탈리안&quot;,
                        &quot;query&quot;: &quot;이탈리안&quot;
                    },
                    {
                        &quot;display&quot;: &quot;브런치&quot;,
                        &quot;query&quot;: &quot;브런치&quot;
                    },
                    {
                        &quot;display&quot;: &quot;뷔페&quot;,
                        &quot;query&quot;: &quot;뷔페&quot;
                    },
                    {
                        &quot;display&quot;: &quot;분식&quot;,
                        &quot;query&quot;: &quot;분식&quot;
                    },
                    {
                        &quot;display&quot;: &quot;태국음식&quot;,
                        &quot;query&quot;: &quot;태국음식&quot;
                    },
                    {
                        &quot;display&quot;: &quot;베트남음식&quot;,
                        &quot;query&quot;: &quot;베트남음식&quot;
                    },
                    {
                        &quot;display&quot;: &quot;패스트푸드&quot;,
                        &quot;query&quot;: &quot;패스트푸드&quot;
                    },
                    {
                        &quot;display&quot;: &quot;멕시칸&quot;,
                        &quot;query&quot;: &quot;멕시칸&quot;
                    },
                    {
                        &quot;display&quot;: &quot;프렌치&quot;,
                        &quot;query&quot;: &quot;프렌치&quot;
                    }
                ]
            },
            {
                &quot;group&quot;: &quot;방문목적&quot;,
                &quot;list&quot;: [
                    {
                        &quot;display&quot;: &quot;점심식사&quot;,
                        &quot;query&quot;: &quot;점심식사&quot;
                    },
                    {
                        &quot;display&quot;: &quot;아침식사&quot;,
                        &quot;query&quot;: &quot;아침식사&quot;
                    },
                    {
                        &quot;display&quot;: &quot;저녁식사&quot;,
                        &quot;query&quot;: &quot;저녁식사&quot;
                    },
                    {
                        &quot;display&quot;: &quot;가족외식&quot;,
                        &quot;query&quot;: &quot;가족외식&quot;
                    },
                    {
                        &quot;display&quot;: &quot;데이트&quot;,
                        &quot;query&quot;: &quot;데이트&quot;
                    },
                    {
                        &quot;display&quot;: &quot;회식&quot;,
                        &quot;query&quot;: &quot;회식&quot;
                    },
                    {
                        &quot;display&quot;: &quot;혼밥&quot;,
                        &quot;query&quot;: &quot;혼밥&quot;
                    },
                    {
                        &quot;display&quot;: &quot;식사모임&quot;,
                        &quot;query&quot;: &quot;식사모임&quot;
                    },
                    {
                        &quot;display&quot;: &quot;술모임&quot;,
                        &quot;query&quot;: &quot;술모임&quot;
                    },
                    {
                        &quot;display&quot;: &quot;접대&quot;,
                        &quot;query&quot;: &quot;접대&quot;
                    },
                    {
                        &quot;display&quot;: &quot;혼술&quot;,
                        &quot;query&quot;: &quot;혼술&quot;
                    },
                    {
                        &quot;display&quot;: &quot;아이동반&quot;,
                        &quot;query&quot;: &quot;아이동반&quot;
                    },
                    {
                        &quot;display&quot;: &quot;건강식&quot;,
                        &quot;query&quot;: &quot;건강식&quot;
                    },
                    {
                        &quot;display&quot;: &quot;간식&quot;,
                        &quot;query&quot;: &quot;간식&quot;
                    },
                    {
                        &quot;display&quot;: &quot;혼카페&quot;,
                        &quot;query&quot;: &quot;혼카페&quot;
                    },
                    {
                        &quot;display&quot;: &quot;다이어트&quot;,
                        &quot;query&quot;: &quot;다이어트&quot;
                    },
                    {
                        &quot;display&quot;: &quot;차모임&quot;,
                        &quot;query&quot;: &quot;차모임&quot;
                    },
                    {
                        &quot;display&quot;: &quot;실버푸드&quot;,
                        &quot;query&quot;: &quot;실버푸드&quot;
                    }
                ]
            },
            {
                &quot;group&quot;: &quot;편의기능&quot;,
                &quot;list&quot;: [
                    {
                        &quot;display&quot;: &quot;주차&quot;,
                        &quot;query&quot;: &quot;주차&quot;
                    },
                    {
                        &quot;display&quot;: &quot;개별룸&quot;,
                        &quot;query&quot;: &quot;개별룸&quot;
                    },
                    {
                        &quot;display&quot;: &quot;24시영업&quot;,
                        &quot;query&quot;: &quot;24시영업&quot;
                    },
                    {
                        &quot;display&quot;: &quot;반려동물동반&quot;,
                        &quot;query&quot;: &quot;반려동물동반&quot;
                    },
                    {
                        &quot;display&quot;: &quot;콜키지무료&quot;,
                        &quot;query&quot;: &quot;콜키지무료&quot;
                    },
                    {
                        &quot;display&quot;: &quot;야외좌석(테라스)&quot;,
                        &quot;query&quot;: &quot;야외좌석(테라스)&quot;
                    },
                    {
                        &quot;display&quot;: &quot;대형룸&quot;,
                        &quot;query&quot;: &quot;대형룸&quot;
                    },
                    {
                        &quot;display&quot;: &quot;놀이방&quot;,
                        &quot;query&quot;: &quot;놀이방&quot;
                    },
                    {
                        &quot;display&quot;: &quot;발렛가능&quot;,
                        &quot;query&quot;: &quot;발렛가능&quot;
                    },
                    {
                        &quot;display&quot;: &quot;드라이브스루&quot;,
                        &quot;query&quot;: &quot;드라이브스루&quot;
                    }
                ]
            },
            {
                &quot;group&quot;: &quot;분위기&quot;,
                &quot;list&quot;: [
                    {
                        &quot;display&quot;: &quot;가성비좋은&quot;,
                        &quot;query&quot;: &quot;가성비좋은&quot;
                    },
                    {
                        &quot;display&quot;: &quot;분위기좋은&quot;,
                        &quot;query&quot;: &quot;분위기좋은&quot;
                    },
                    {
                        &quot;display&quot;: &quot;고급스러운&quot;,
                        &quot;query&quot;: &quot;고급스러운&quot;
                    },
                    {
                        &quot;display&quot;: &quot;조용한&quot;,
                        &quot;query&quot;: &quot;조용한&quot;
                    },
                    {
                        &quot;display&quot;: &quot;예쁜&quot;,
                        &quot;query&quot;: &quot;예쁜&quot;
                    },
                    {
                        &quot;display&quot;: &quot;깔끔한&quot;,
                        &quot;query&quot;: &quot;깔끔한&quot;
                    },
                    {
                        &quot;display&quot;: &quot;뷰가좋은&quot;,
                        &quot;query&quot;: &quot;뷰가좋은&quot;
                    },
                    {
                        &quot;display&quot;: &quot;격식있는&quot;,
                        &quot;query&quot;: &quot;격식있는&quot;
                    },
                    {
                        &quot;display&quot;: &quot;이색적인&quot;,
                        &quot;query&quot;: &quot;이색적인&quot;
                    },
                    {
                        &quot;display&quot;: &quot;푸짐한&quot;,
                        &quot;query&quot;: &quot;푸짐한&quot;
                    },
                    {
                        &quot;display&quot;: &quot;지역주민이찾는&quot;,
                        &quot;query&quot;: &quot;지역주민이찾는&quot;
                    },
                    {
                        &quot;display&quot;: &quot;서민적인&quot;,
                        &quot;query&quot;: &quot;서민적인&quot;
                    },
                    {
                        &quot;display&quot;: &quot;시끌벅적한&quot;,
                        &quot;query&quot;: &quot;시끌벅적한&quot;
                    }
                ]
            },
            {
                &quot;group&quot;: &quot;인증맛집&quot;,
                &quot;list&quot;: [
                    {
                        &quot;display&quot;: &quot;다코숨은맛집&quot;,
                        &quot;query&quot;: &quot;다코숨은맛집&quot;
                    },
                    {
                        &quot;display&quot;: &quot;식객허영만의백반기행&quot;,
                        &quot;query&quot;: &quot;식객허영만의백반기행&quot;
                    },
                    {
                        &quot;display&quot;: &quot;수요미식회&quot;,
                        &quot;query&quot;: &quot;수요미식회&quot;
                    },
                    {
                        &quot;display&quot;: &quot;생활의달인&quot;,
                        &quot;query&quot;: &quot;생활의달인&quot;
                    },
                    {
                        &quot;display&quot;: &quot;성시경의먹을텐데&quot;,
                        &quot;query&quot;: &quot;성시경의먹을텐데&quot;
                    },
                    {
                        &quot;display&quot;: &quot;맛있는녀석들&quot;,
                        &quot;query&quot;: &quot;맛있는녀석들&quot;
                    },
                    {
                        &quot;display&quot;: &quot;백종원의3대천왕&quot;,
                        &quot;query&quot;: &quot;백종원의3대천왕&quot;
                    },
                    {
                        &quot;display&quot;: &quot;백년가게&quot;,
                        &quot;query&quot;: &quot;백년가게&quot;
                    },
                    {
                        &quot;display&quot;: &quot;미쉐린&quot;,
                        &quot;query&quot;: &quot;미쉐린&quot;
                    },
                    {
                        &quot;display&quot;: &quot;흑백요리사&quot;,
                        &quot;query&quot;: &quot;흑백요리사&quot;
                    },
                    {
                        &quot;display&quot;: &quot;최자로드&quot;,
                        &quot;query&quot;: &quot;최자로드&quot;
                    },
                    {
                        &quot;display&quot;: &quot;전지적참견시점&quot;,
                        &quot;query&quot;: &quot;전지적참견시점&quot;
                    },
                    {
                        &quot;display&quot;: &quot;한국인의밥상&quot;,
                        &quot;query&quot;: &quot;한국인의밥상&quot;
                    },
                    {
                        &quot;display&quot;: &quot;백종원의골목식당&quot;,
                        &quot;query&quot;: &quot;백종원의골목식당&quot;
                    }
                ]
            }
        ],
        &quot;search_order&quot;: [
            {
                &quot;display&quot;: &quot;연관순&quot;,
                &quot;order&quot;: &quot;r_score&quot;
            },
            {
                &quot;display&quot;: &quot;평점순&quot;,
                &quot;order&quot;: &quot;r_rate&quot;
            },
            {
                &quot;display&quot;: &quot;리뷰많은순&quot;,
                &quot;order&quot;: &quot;r_count&quot;
            },
            {
                &quot;display&quot;: &quot;좋아요많은순&quot;,
                &quot;order&quot;: &quot;l_count&quot;
            },
            {
                &quot;display&quot;: &quot;거리순&quot;,
                &quot;order&quot;: &quot;dist&quot;
            }
        ],
        &quot;poi_section&quot;: {
            &quot;type&quot;: &quot;area&quot;,
            &quot;search_type&quot;: &quot;ranking_search&quot;,
            &quot;distance&quot;: null,
            &quot;lat&quot;: &quot;&quot;,
            &quot;lng&quot;: &quot;&quot;,
            &quot;total_cnt&quot;: 613,
            &quot;list&quot;: [
                {
                    &quot;v_rid&quot;: &quot;jDskmsq3ZXZT&quot;,
                    &quot;nm&quot;: &quot;행운돈까스&quot;,
                    &quot;branch&quot;: null,
                    &quot;addr&quot;: &quot;서울특별시 성동구 행당동 158-44&quot;,
                    &quot;road_addr&quot;: &quot;서울특별시 성동구 마조로1길 2&quot;,
                    &quot;phone&quot;: &quot;02-2296-3406&quot;,
                    &quot;distance&quot;: &quot;&quot;,
                    &quot;category&quot;: &quot;돈까스&quot;,
                    &quot;keyword&quot;: [
                        {
                            &quot;term&quot;: &quot;혼밥&quot;,
                            &quot;mark&quot;: 0
                        },
                        {
                            &quot;term&quot;: &quot;서민적인&quot;,
                            &quot;mark&quot;: 0
                        },
                        {
                            &quot;term&quot;: &quot;포장&quot;,
                            &quot;mark&quot;: 0
                        }
                    ],
                    &quot;area&quot;: [
                        &quot;한양대&quot;
                    ],
                    &quot;lat&quot;: 37.5584167,
                    &quot;lng&quot;: 127.0403375,
                    &quot;open_status&quot;: &quot;영업 중&quot;,
                    &quot;score&quot;: 75,
                    &quot;image&quot;: &quot;https:\/\/d12zq4w4guyljn.cloudfront.net\/300_300_20240612022948_photo1_87b24f44814c.jpg&quot;,
                    &quot;user_score&quot;: 3.9,
                    &quot;my_favorites&quot;: {
                        &quot;favorites&quot;: &quot;N&quot;,
                        &quot;dt&quot;: &quot;&quot;
                    },
                    &quot;favorites_cnt&quot;: 103,
                    &quot;review_cnt&quot;: 25,
                    &quot;recommend_cnt&quot;: 18,
                    &quot;display_review&quot;: {
                        &quot;user_nm&quot;: null,
                        &quot;review_cont&quot;: &quot;1. 가성비 좋은 돈까스식당 2. 무난하게 먹을수 있는 돈까스 3. 현금 만원이상 결제시 콜라1병 써비스 한양대앞에 꾀 오래된 돈까스 전문점 돈가스 7,000원 정식(돈까스,함박,&quot;,
                        &quot;review_reg_dt&quot;: &quot;55년 전&quot;,
                        &quot;review_reg_dt2&quot;: &quot;55년 전&quot;,
                        &quot;user_level&quot;: {
                            &quot;cd&quot;: &quot;NORMAL_TASTER&quot;,
                            &quot;text&quot;: &quot;일반회원&quot;,
                            &quot;icon&quot;: &quot;&quot;
                        }
                    },
                    &quot;review_total_cnt&quot;: 18,
                    &quot;review_list&quot;: [
                        {
                            &quot;user_nm&quot;: null,
                            &quot;review_cont&quot;: &quot;1. 가성비 좋은 돈까스식당 2. 무난하게 먹을수 있는 돈까스 3. 현금 만원이상 결제시 콜라1병 써비스 한양대앞에 꾀 오래된 돈까스 전문점 돈가스 7,000원 정식(돈까스,함박,&quot;,
                            &quot;review_reg_dt&quot;: &quot;55년 전&quot;,
                            &quot;review_reg_dt2&quot;: &quot;55년 전&quot;,
                            &quot;user_level&quot;: {
                                &quot;cd&quot;: &quot;NORMAL_TASTER&quot;,
                                &quot;text&quot;: &quot;일반회원&quot;,
                                &quot;icon&quot;: &quot;&quot;
                            }
                        }
                    ]
                },
===========
맛집 검색 프로그램과 응답값을 참고하여 프로그램을 완성해줘.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인공지능은 놀라울 정도로 수준높은 코드를 작성한다. 물론 일부 보완이나 수정사항이 있을 거다. 그럴 때마다 재차 물어서 보완하자.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;검색결과값을 csv파일로 저장하는 코드를 추가해 줘.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;GUI&amp;nbsp;형태로&amp;nbsp;보기&amp;nbsp;편하게&amp;nbsp;코드를&amp;nbsp;수정해줘.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;위&amp;nbsp;코드에서&amp;nbsp;한글&amp;nbsp;인코딩을&amp;nbsp;추가해 줘.&amp;nbsp;csv파일&amp;nbsp;열면&amp;nbsp;한글이&amp;nbsp;깨지지&amp;nbsp;않도록&amp;nbsp;하려고해.&amp;nbsp;그리고&amp;nbsp;결과&amp;nbsp;창에서&amp;nbsp;항목별&amp;nbsp;sorting을&amp;nbsp;추가해줘.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;이&amp;nbsp;코드에&amp;nbsp;streamlit을&amp;nbsp;이용한&amp;nbsp;홈페이지&amp;nbsp;기능을&amp;nbsp;추가해 줄&amp;nbsp;있어?&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;출력결과&amp;nbsp;순번은&amp;nbsp;1번부터&amp;nbsp;시작해 줘.&amp;nbsp;그리고&amp;nbsp;csv파일&amp;nbsp;저장 시&amp;nbsp;한글이&amp;nbsp;깨져.&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;해결해 줘. &lt;br /&gt;1.&amp;nbsp;encoding='cp949'&amp;nbsp;사용&amp;nbsp;-&amp;nbsp;한국어&amp;nbsp;Windows의&amp;nbsp;기본&amp;nbsp;인코딩 &lt;br /&gt;2.&amp;nbsp;인코딩&amp;nbsp;실패&amp;nbsp;시&amp;nbsp;utf-8-sig로&amp;nbsp;폴백 하는&amp;nbsp;예외처리&amp;nbsp;추가 &lt;br /&gt;3.&amp;nbsp;data&amp;nbsp;부분을&amp;nbsp;encode('cp949')로&amp;nbsp;바이트&amp;nbsp;변환&lt;/blockquote&gt;
&lt;pre id=&quot;code_1738475479562&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
import pandas as pd
import streamlit as st
from io import StringIO, BytesIO

# Streamlit 페이지 설정
st.set_page_config(page_title=&quot;맛집 검색 프로그램&quot;, layout=&quot;wide&quot;)

# 검색 함수
def search_restaurants(query, page=1, size=20):
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
        'Connection': 'keep-alive',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Origin': 'https://www.diningcode.com',
        'Referer': 'https://www.diningcode.com/',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-site',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
        'sec-ch-ua': '&quot;Not A(Brand&quot;;v=&quot;8&quot;, &quot;Chromium&quot;;v=&quot;132&quot;, &quot;Google Chrome&quot;;v=&quot;132&quot;',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '&quot;Windows&quot;',
    }

    data = {
        'query': query,
        'addr': '',
        'keyword': '',
        'order': 'r_score',
        'distance': '',
        'rn_search_flag': 'on',
        'search_type': 'poi_search',
        'lat': '',
        'lng': '',
        'rect': '',
        's_type': '',
        'token': '',
        'mode': 'poi',
        'dc_flag': '1',
        'page': str(page),
        'size': str(size),
    }

    response = requests.post('https://im.diningcode.com/API/isearch/', headers=headers, data=data)
    
    if response.status_code == 200:
        return response.json()
    else:
        st.error(f&quot;API 요청 실패: {response.status_code}&quot;)
        return None

# 결과를 DataFrame으로 변환
def convert_to_dataframe(results):
    if not results or 'result_data' not in results or 'poi_section' not in results['result_data']:
        return None

    restaurants = results['result_data']['poi_section']['list']
    data = []
    for idx, restaurant in enumerate(restaurants, start=1):  # 순번을 1부터 시작
        name = restaurant['nm']
        address = restaurant['addr']
        phone = restaurant['phone']
        score = restaurant['user_score']
        review_count = restaurant['review_cnt']
        keywords = ', '.join([keyword['term'] for keyword in restaurant['keyword']])
        data.append([idx, name, address, phone, score, review_count, keywords])  # 순번 추가

    df = pd.DataFrame(data, columns=[&quot;순번&quot;, &quot;이름&quot;, &quot;주소&quot;, &quot;전화번호&quot;, &quot;평점&quot;, &quot;리뷰 수&quot;, &quot;키워드&quot;])
    return df

# CSV 파일로 저장 (cp949 우선 시도, 실패 시 utf-8-sig로 폴백)
def save_to_csv(df):
    if df is None or df.empty:
        st.warning(&quot;저장할 데이터가 없습니다.&quot;)
        return
    
    try:
        # CSV 파일 생성을 위한 메모리 버퍼
        csv_buffer = StringIO()
        
        # BOM 추가 및 CP949 인코딩으로 변환
        df.to_csv(csv_buffer, index=False, encoding='cp949')
        csv_str = csv_buffer.getvalue()
        
        # 다운로드 버튼 생성
        st.download_button(
            label=&quot;CSV 파일로 저장&quot;,
            data=csv_str.encode('cp949'),  # 바이트로 인코딩
            file_name=&quot;restaurants.csv&quot;,
            mime=&quot;text/csv&quot;,
        )
        
    except UnicodeEncodeError:
        # CP949로 변환이 안 되는 문자가 있는 경우 UTF-8로 폴백
        csv_buffer = StringIO()
        df.to_csv(csv_buffer, index=False, encoding='utf-8-sig')
        csv_str = csv_buffer.getvalue()
        
        st.download_button(
            label=&quot;CSV 파일로 저장&quot;,
            data=csv_str,
            file_name=&quot;restaurants.csv&quot;,
            mime=&quot;text/csv&quot;,
        )
# Streamlit UI
st.title(&quot;맛집 검색 프로그램&quot;)

# 검색어 입력
query = st.text_input(&quot;검색할 지역 또는 음식점 이름을 입력하세요:&quot;, &quot;&quot;)

# 페이지 및 결과 수 입력
col1, col2 = st.columns(2)
with col1:
    page = st.number_input(&quot;페이지 번호 (기본값: 1):&quot;, min_value=1, value=1)
with col2:
    size = st.number_input(&quot;결과 수 (기본값: 20):&quot;, min_value=1, value=20)

# 검색 버튼
if st.button(&quot;검색&quot;):
    if not query:
        st.warning(&quot;검색어를 입력하세요.&quot;)
    else:
        results = search_restaurants(query, page, size)
        if results:
            df = convert_to_dataframe(results)
            if df is not None:
                st.dataframe(df)  # 결과를 테이블로 표시
                save_to_csv(df)  # CSV 저장 버튼 표시&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 맛집 검색 프로그램 실행하기&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;streamlit&amp;nbsp;run&amp;nbsp;.\find_rest.py&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;1159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Goah4/btsL3hI3l8g/lmxGL1MaTZZ2EhGYu0rKe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Goah4/btsL3hI3l8g/lmxGL1MaTZZ2EhGYu0rKe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Goah4/btsL3hI3l8g/lmxGL1MaTZZ2EhGYu0rKe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGoah4%2FbtsL3hI3l8g%2FlmxGL1MaTZZ2EhGYu0rKe0%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;1622&quot; height=&quot;1159&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;1159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;csv파일 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6SrQS/btsL5j6icpo/KkvAfepeSfR1AIDzzszfc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6SrQS/btsL5j6icpo/KkvAfepeSfR1AIDzzszfc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6SrQS/btsL5j6icpo/KkvAfepeSfR1AIDzzszfc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6SrQS%2FbtsL5j6icpo%2FKkvAfepeSfR1AIDzzszfc0%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;1260&quot; height=&quot;701&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 마치며&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 정도면 유료 서비스와 견주어도 전혀 밀리 않는 거 같다. 10~30만원 주고 정보 수집하는 비용을 간단한 코딩과 인공지능 문의로 만들 수 있다. 파이썬과 인공지능에 대한 약간의 이해와 노력이 필요하긴 하다만, 이정도 관심이면 누가나 만들 수 있는 수준이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 개발 영역은 당연히 프로그래머의 몫이라 생각했었는데, 이젠 그 경계가 완전히 무서진 것 같다. 크몽이나 클래스 101에서 사용자 프로그램을 판매하는 개발자의 미래가 암울하다. 단순 개발이 아닌 좀 더 창의적인 프로그램을 제공하거나 사용자 교육을 통한 수익 창출을 노려봐야 하지 않을까...&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/747</guid>
      <comments>https://iamgus.tistory.com/747#entry747comment</comments>
      <pubDate>Sun, 2 Feb 2025 15:04:09 +0900</pubDate>
    </item>
    <item>
      <title>네이버 부동산 매물정보 수집 프로그램 만들기 10분 컷</title>
      <link>https://iamgus.tistory.com/746</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;네이버 부동산 매물정보를 실시간 수집해 주는 파이썬 코드를 작성해 보자.&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;네이버에서 부동산 정보를 가져올 때 API를 호출한다. 따라서 동일한 방식으로 API를 이용하면 동일한 결과를 가져올 수 있다.&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 네이버 부동산 들어가기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;1098&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EPtIv/btsL4JxugM3/oO5CF7B0DsnexmP1zg1bl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EPtIv/btsL4JxugM3/oO5CF7B0DsnexmP1zg1bl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EPtIv/btsL4JxugM3/oO5CF7B0DsnexmP1zg1bl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEPtIv%2FbtsL4JxugM3%2FoO5CF7B0DsnexmP1zg1bl1%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;1630&quot; height=&quot;1098&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;1098&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. F12 개발자 도구 - Newwork탭 - Fetch/XHR 에서 입출력 데이터 확인하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) Payload 입력값 확인&lt;/b&gt;&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;997&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uXTke/btsL47xVPZ8/UgJFnBYg1eopC8PNgqDSz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uXTke/btsL47xVPZ8/UgJFnBYg1eopC8PNgqDSz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uXTke/btsL47xVPZ8/UgJFnBYg1eopC8PNgqDSz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuXTke%2FbtsL47xVPZ8%2FUgJFnBYg1eopC8PNgqDSz1%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;997&quot; data-origin-width=&quot;763&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;&lt;b&gt;(2) 출력값 확인&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTie75/btsL4b82Crc/NcutM5bJkT6vajOukfyOUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTie75/btsL4b82Crc/NcutM5bJkT6vajOukfyOUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTie75/btsL4b82Crc/NcutM5bJkT6vajOukfyOUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTie75%2FbtsL4b82Crc%2FNcutM5bJkT6vajOukfyOUK%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;862&quot; height=&quot;573&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 정보 수집 파이썬 코드 작성하기 -&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) copy cURL (bash)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNEDVk/btsL3q6KMZi/OAYdlxHnZYb3k5rqkzCZ7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNEDVk/btsL3q6KMZi/OAYdlxHnZYb3k5rqkzCZ7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNEDVk/btsL3q6KMZi/OAYdlxHnZYb3k5rqkzCZ7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNEDVk%2FbtsL3q6KMZi%2FOAYdlxHnZYb3k5rqkzCZ7K%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;826&quot; height=&quot;558&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) Conver curl 사이트(&lt;a href=&quot;https://curlconverter.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://curlconverter.com/&lt;/a&gt;)에&amp;nbsp; url정보를 붙여넣기한 후&amp;nbsp; 파이썬 코드로 변환하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;1064&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pObKY/btsL4Y8Zlmk/3eHayGzldjOuKuD52dBoT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pObKY/btsL4Y8Zlmk/3eHayGzldjOuKuD52dBoT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pObKY/btsL4Y8Zlmk/3eHayGzldjOuKuD52dBoT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpObKY%2FbtsL4Y8Zlmk%2F3eHayGzldjOuKuD52dBoT1%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;1056&quot; height=&quot;1064&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;1064&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(3) LLM (claude나 chatgpt)에 코드 완성 요청하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 유형도 지정하여 부동산 매물정보 데이터 수집 프로그램을 만들어 달라고 요청한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738396802732&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests

cookies = {
    'NAC': 'ZJKPBUQKJE5r',
    'NNB': 'OAHWWQYBGDSGM',
    'nstore_session': '/ia4c1BC77FamzAb3rateo8J',
....
}

headers = {
    'accept': '*/*',
    'accept-language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
    'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IlJFQUxFU1RBVEUiLCJpYXQiOjE3MzgzODk3NDUsImV4cCI6MTczODQwMDU0NX0.AY-nNR5huRC1TgRObS7zT2-YWCY8Jf_fH7fsA0wGS_g',
    # 'cookie': 'NAC=ZJKPBUQKJE5r; NNB=OAHWWQYBGDSGM; nstore_session=/ia4c1BC77FamzAb3rateo8J; nstore_pagesession=i2G1HlqWoNyOclsnyfh-346631; m_loc=ddd0726a75d108211a108f4955324bbce9a02c6ed8e3e1fc1e8b20e9b32bb317; NV_WETR_LOCATION_RGN_M=&quot;MDkyMDA1OTA=&quot;; NV_WETR_LAST_ACCESS_RGN_M=&quot;MDkyMDA1OTA=&quot;; tooltipDisplayed=true; NFS=2; NACT=1; SRT30=1738389719; SRT5=1738389719; nhn.realestate.article.rlet_type_cd=A01; nhn.realestate.article.trade_type_cd=&quot;&quot;; nhn.realestate.article.ipaddress_city=1100000000; _fwb=171MlqbbWUUcWDRgwN5oMrc.1738389721868; landHomeFlashUseYn=Y; realestate.beta.lastclick.cortar=1120000000; _fwb=171MlqbbWUUcWDRgwN5oMrc.1738389721868; REALESTATE=Sat%20Feb%2001%202025%2015%3A02%3A25%20GMT%2B0900%20(Korean%20Standard%20Time); BUC=9n5lD7HfUveZp-PM7v9tRb-zlkd2Vtr2SPsCs2zcDdE=',
    'priority': 'u=1, i',
    'referer': 'https://new.land.naver.com/complexes/2977?ms=37.555408,127.0369511,17&amp;amp;a=APT&amp;amp;b=A1&amp;amp;e=RETAIL',
    'sec-ch-ua': '&quot;Not A(Brand&quot;;v=&quot;8&quot;, &quot;Chromium&quot;;v=&quot;132&quot;, &quot;Google Chrome&quot;;v=&quot;132&quot;',
......
}

response = requests.get(
    'https://new.land.naver.com/api/articles/complex/2977?realEstateType=APT&amp;amp;tradeType=A1&amp;amp;tag=%3A%3A%3A%3A%3A%3A%3A%3A&amp;amp;rentPriceMin=0&amp;amp;rentPriceMax=900000000&amp;amp;priceMin=0&amp;amp;priceMax=900000000&amp;amp;areaMin=0&amp;amp;areaMax=900000000&amp;amp;oldBuildYears&amp;amp;recentlyBuildYears&amp;amp;minHouseHoldCount&amp;amp;maxHouseHoldCount&amp;amp;showArticle=false&amp;amp;sameAddressGroup=false&amp;amp;minMaintenanceCost&amp;amp;maxMaintenanceCost&amp;amp;priceType=RETAIL&amp;amp;directions=&amp;amp;page=2&amp;amp;complexNo=2977&amp;amp;buildingNos=&amp;amp;areaNos=&amp;amp;type=list&amp;amp;order=rank',
    cookies=cookies,
    headers=headers,
)

# print(response.text)
============
 {
            &quot;articleNo&quot;: &quot;2504409914&quot;,
            &quot;articleName&quot;: &quot;서울숲한신더휴&quot;,
            &quot;articleStatus&quot;: &quot;R0&quot;,
            &quot;realEstateTypeCode&quot;: &quot;APT&quot;,
            &quot;realEstateTypeName&quot;: &quot;아파트&quot;,
            &quot;articleRealEstateTypeCode&quot;: &quot;A01&quot;,
            &quot;articleRealEstateTypeName&quot;: &quot;아파트&quot;,
            &quot;tradeTypeCode&quot;: &quot;A1&quot;,
            &quot;tradeTypeName&quot;: &quot;매매&quot;,
            
        },
==========
응답값을 참고하여 파이썬 코드를 완성해주세요. 이때 csv 파일로 부동산 호가 데이터를 저장해주세요.
한글이 깨지지 않게해줘.
url에 page값이 있습니다. 1부터 10페이지까지 수집되도록 수정해주세요.&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;(4) 완성된 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738396962731&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
import csv
import json
from datetime import datetime
import codecs
import time

def get_real_estate_data(complex_no, page=1):
    cookies = {
        'NAC': 'ZJKPBUQKJE5r',
        'NNB': 'OAHWWQYBGDSGM',
        'nstore_session': '/ia4c1BC77FamzAb3rateo8J',
        'nstore_pagesession': 'i2G1HlqWoNyOclsnyfh-346631',
        'm_loc': 'ddd0726a75d108211a108f4955324bbce9a02c6ed8e3e1fc1e8b20e9b32bb317',
        'NV_WETR_LOCATION_RGN_M': '&quot;MDkyMDA1OTA=&quot;',
        'NV_WETR_LAST_ACCESS_RGN_M': '&quot;MDkyMDA1OTA=&quot;',
        'tooltipDisplayed': 'true',
        'NFS': '2',
        'NACT': '1',
        'SRT30': '1738389719',
        'SRT5': '1738389719',
        'nhn.realestate.article.rlet_type_cd': 'A01',
        'nhn.realestate.article.trade_type_cd': '&quot;&quot;',
        'nhn.realestate.article.ipaddress_city': '1100000000',
        '_fwb': '171MlqbbWUUcWDRgwN5oMrc.1738389721868',
        'landHomeFlashUseYn': 'Y',
        'realestate.beta.lastclick.cortar': '1120000000',
        'REALESTATE': 'Sat%20Feb%2001%202025%2015%3A02%3A25%20GMT%2B0900%20(Korean%20Standard%20Time)',
        'BUC': '9n5lD7HfUveZp-PM7v9tRb-zlkd2Vtr2SPsCs2zcDdE=',
    }

    headers = {
        'accept': '*/*',
        'accept-language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
        'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IlJFQUxFU1RBVEUiLCJpYXQiOjE3MzgzODk3NDUsImV4cCI6MTczODQwMDU0NX0.AY-nNR5huRC1TgRObS7zT2-YWCY8Jf_fH7fsA0wGS_g',
        'priority': 'u=1, i',
        'referer': f'https://new.land.naver.com/complexes/{complex_no}?ms=37.555408,127.0369511,17&amp;amp;a=APT&amp;amp;b=A1&amp;amp;e=RETAIL',
        'sec-ch-ua': '&quot;Not A(Brand&quot;;v=&quot;8&quot;, &quot;Chromium&quot;;v=&quot;132&quot;, &quot;Google Chrome&quot;;v=&quot;132&quot;',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '&quot;Windows&quot;',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36',
    }

    url = f'https://new.land.naver.com/api/articles/complex/{complex_no}'
    params = {
        'realEstateType': 'APT',
        'tradeType': 'A1',
        'tag': '::::::::',
        'rentPriceMin': '0',
        'rentPriceMax': '900000000',
        'priceMin': '0',
        'priceMax': '900000000',
        'areaMin': '0',
        'areaMax': '900000000',
        'showArticle': 'false',
        'sameAddressGroup': 'false',
        'priceType': 'RETAIL',
        'page': str(page),
        'complexNo': str(complex_no),
        'type': 'list',
        'order': 'rank'
    }

    response = requests.get(url, params=params, cookies=cookies, headers=headers)
    return response.json()

def save_to_csv(all_data, filename):
    # 한글 필드명 정의
    fieldnames = [
        ('articleNo', '매물번호'),
        ('articleName', '단지명'),
        ('realEstateTypeName', '부동산 유형'),
        ('tradeTypeName', '거래 유형'),
        ('floorInfo', '층수'),
        ('dealOrWarrantPrc', '거래가격'),
        ('areaName', '면적명'),
        ('area1', '공급면적'),
        ('area2', '전용면적'),
        ('direction', '방향'),
        ('articleConfirmYmd', '확인일자'),
        ('articleFeatureDesc', '특징설명'),
        ('buildingName', '동'),
        ('realtorName', '부동산'),
        ('latitude', '위도'),
        ('longitude', '경도')
    ]

    # Excel에서 한글을 올바르게 표시하기 위해 BOM을 추가하여 파일 생성
    with codecs.open(filename, 'w', encoding='utf-8-sig') as csvfile:
        writer = csv.writer(csvfile)
        
        # 한글 헤더 작성
        writer.writerow([field[1] for field in fieldnames])
        
        # 데이터 작성
        for article in all_data:
            row = []
            for field in fieldnames:
                value = article.get(field[0], '')
                # None 값 처리
                if value is None:
                    value = ''
                row.append(value)
            writer.writerow(row)

def main():
    complex_no = 2976  # 단지 번호
    current_date = datetime.now().strftime('%Y%m%d')
    filename = f'real_estate_data_{complex_no}_{current_date}.csv'
    
    try:
        all_articles = []  # 전체 페이지의 데이터를 저장할 리스트
        
        # 1페이지부터 10페이지까지 수집
        for page in range(1, 11):
            print(f&quot;{page}페이지 데이터 수집 중...&quot;)
            
            # API에서 데이터 가져오기
            data = get_real_estate_data(complex_no, page)
            
            # 페이지의 매물 목록 가져오기
            articles = data.get('articleList', [])
            
            # 매물이 없으면 반복 중단
            if not articles:
                print(f&quot;{page-1}페이지까지 수집 완료 (더 이상 데이터가 없습니다)&quot;)
                break
                
            # 전체 리스트에 추가
            all_articles.extend(articles)
            
            # 서버 부하를 줄이기 위한 딜레이
            time.sleep(1)
        
        # 전체 데이터를 CSV로 저장
        save_to_csv(all_articles, filename)
        print(f&quot;전체 {len(all_articles)}개의 매물 데이터가 {filename}에 저장되었습니다.&quot;)
        
    except Exception as e:
        print(f&quot;오류가 발생했습니다: {str(e)}&quot;)

if __name__ == &quot;__main__&quot;:
    main()&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;size18&quot;&gt;3. 프로그램 실행 결과 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아파트 매물정보 csv파일이 생성된다. 매매정보를 한눈에 볼 수 있고 정기적으로 데이터를 수집해 가격 변동을 확인하는 등 다양한 정보로 이용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ypHUS/btsL5BrWRZc/2l55nOekK9AMvLanSBnwcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ypHUS/btsL5BrWRZc/2l55nOekK9AMvLanSBnwcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ypHUS/btsL5BrWRZc/2l55nOekK9AMvLanSBnwcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FypHUS%2FbtsL5BrWRZc%2F2l55nOekK9AMvLanSBnwcK%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;499&quot; height=&quot;57&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;57&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;1511&quot; data-origin-height=&quot;607&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vutYw/btsL4AguVVK/oVHoTKaczbuSqrrBGIbMlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vutYw/btsL4AguVVK/oVHoTKaczbuSqrrBGIbMlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vutYw/btsL4AguVVK/oVHoTKaczbuSqrrBGIbMlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvutYw%2FbtsL4AguVVK%2FoVHoTKaczbuSqrrBGIbMlK%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;1511&quot; height=&quot;607&quot; data-origin-width=&quot;1511&quot; data-origin-height=&quot;607&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. GUI나 streamlit 홈페이지 형태로 확장하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 LLM에 GUI나 Streamlit 홈페이지 형태로 UI를 함께 구축하게 할 수 있다. 데이터 관리 및 보기가 훨씬 좋아진다.&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;**** 다음 유튜브 영상을 참고해 작성하였습니다.&amp;nbsp; : &lt;a href=&quot;https://youtu.be/V4tjbUQ46Uw?si=PtLVIk-f-DP-mN5H&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/V4tjbUQ46Uw?si=PtLVIk-f-DP-mN5H&lt;/a&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/746</guid>
      <comments>https://iamgus.tistory.com/746#entry746comment</comments>
      <pubDate>Sat, 1 Feb 2025 17:10:40 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 코드로 네이버 뉴스기사 요약하기 -DeepSeek ChatGPT Claude</title>
      <link>https://iamgus.tistory.com/745</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;지난 포스팅에 네이버 API를 이용해 뉴스기사를 가져오는 코드를 작성했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/744&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.27 - [코드리뷰/chatGPT(Python)코드] - 네이버 API 이용해 헤드라인 뉴스 기사 가져오기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파이썬 코드에서 네이버 API를 호출해 간단하게 기사 제목과 기사링크를 가져오는 방식을 설명하였는데, 이번엔 한 걸음 더 들어가 기사 요약을 하는 프로그램을 만들어 보자.&amp;nbsp;&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;size18&quot;&gt;&lt;b&gt;1. 검색어를 입력하자.&lt;/b&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;946&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck5IwJ/btsL1Xw4jgR/69drucc5XpXmlPRBBwDN11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck5IwJ/btsL1Xw4jgR/69drucc5XpXmlPRBBwDN11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck5IwJ/btsL1Xw4jgR/69drucc5XpXmlPRBBwDN11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck5IwJ%2FbtsL1Xw4jgR%2F69drucc5XpXmlPRBBwDN11%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;946&quot; height=&quot;117&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 네이버 API 호출&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버 API 사용 인증이 완료되면 기사를 검색해 결과를 가져온다.&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# API 요청 URL&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;a href=&quot;https://openapi.naver.com/v1/search/news.json?query=&quot;&gt;https://openapi.naver.com/v1/search/news.json?query=&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;encoded_query&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;amp;display=5&amp;amp;start=1&quot;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 기사 가져오기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기사 링크를 입력해 요약하는 코드를 작성한다.&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;article_content&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;get_article_content&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'link'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;])&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;article_content&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;summary&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;summarize_text&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;article_content&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;요약: &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;summary&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;요약: 기사 내용을 가져올 수 없습니다.&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기사 html 코드를 가져와 정제 (Clean Html)하고 요약본을 만든다. 뉴스 기사를 가져올 때는 API가 아닌 웹 크롤링을 이용한다. BeautifulSoup으로 html을 파싱한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. 기사 요약하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기사 전문에서 최대 3줄을 요약해 출력한다. 기사 요약 오픈소스 라이브러리를 이용해 보았으나 제대로 된 값을 가져오지 못했다. 웹 페이지 마다 html 구성이 다 다르다 보니 한 라이브러리에서 이들을 모두 수용하기는 어려웠을 것으로 판단된다. 아쉽지만 기사 몇 줄을 가져오는 방식으로 진행했다.&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;summarize_text&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;max_sentences&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;):&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&quot;&quot;텍스트 요약 함수 (간단한 추출적 요약)&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;not&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;요약 불가&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# 문장 분리&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;sentences&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;re&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #d16969;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #d16969;&quot;&gt;.!?&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #d16969;&quot;&gt;\s&lt;/span&gt;&lt;span style=&quot;color: #d7ba7d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #d16969;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;sentences&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;strip&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'.'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;sentences&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;strip&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;()) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;not&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;sentences&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;요약 불가&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# 간단한 요약: 첫 몇 문장 선택&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;summary&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;' '&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;sentences&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[:&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;max_sentences&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;])&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;summary&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 좋은 방법이 있다면 돈이 들어간다. 바로 chatGpt나 claude같은 LLM 모델의 API를 이용하는 것이다. clean 코드를 만들어 API를 호출해 기사를 요약하라고 하면 꽤 괜찮은 결과를 보여줄 것이다. 문제는 비용이다.&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;296&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E4364/btsL2kL45k4/KkRjFBqxZy21JXHEvqJ5Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E4364/btsL2kL45k4/KkRjFBqxZy21JXHEvqJ5Rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E4364/btsL2kL45k4/KkRjFBqxZy21JXHEvqJ5Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE4364%2FbtsL2kL45k4%2FKkRjFBqxZy21JXHEvqJ5Rk%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;296&quot; height=&quot;174&quot; data-origin-width=&quot;296&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 DeepSeek가 혜성처럼 나타나 LLM 생태계를 파괴하고 있다. 사용자 입장에선 즐거운 일이다. 사용료가 내려갈 것이기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGGeWR/btsL3zuMuvl/BTpX70MooRXRE9BcA0s8j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGGeWR/btsL3zuMuvl/BTpX70MooRXRE9BcA0s8j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGGeWR/btsL3zuMuvl/BTpX70MooRXRE9BcA0s8j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGGeWR%2FbtsL3zuMuvl%2FBTpX70MooRXRE9BcA0s8j1%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;483&quot; height=&quot;172&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DeepSeek는 성능면에서 chatgpt 최신버전인 o1을 넘어선 결과도 보여주긴 하지만 아직 단정하긴 이르다. 몇 번 사용해 보니 안정성이나 친절함은 부족한 듯하다. 하지만 산출물은 꽤 만족스러웠다. API서비스는 준비 중인 것 같았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tVcXj/btsL2GIcG8L/PVln1J3cJFcfOff0yLERLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tVcXj/btsL2GIcG8L/PVln1J3cJFcfOff0yLERLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tVcXj/btsL2GIcG8L/PVln1J3cJFcfOff0yLERLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtVcXj%2FbtsL2GIcG8L%2FPVln1J3cJFcfOff0yLERLK%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;648&quot; height=&quot;268&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;268&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;pre id=&quot;code_1738232887761&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
import json
from urllib.parse import quote
from bs4 import BeautifulSoup
import re

def clean_html_text(html_text):
    &quot;&quot;&quot;HTML 텍스트를 정제하는 함수&quot;&quot;&quot;
    # BeautifulSoup 객체 생성
    soup = BeautifulSoup(html_text, 'html.parser')
    
    # 스크립트, 스타일 태그 제거
    for script in soup([&quot;script&quot;, &quot;style&quot;]):
        script.decompose()
    
    # 텍스트 추출 및 정제
    text = soup.get_text()
    lines = [line.strip() for line in text.splitlines() if line.strip()]
    text = ' '.join(lines)
    
    # 불필요한 공백 제거
    text = re.sub(r'\s+', ' ', text).strip()
    return text

def get_article_content(url):
    &quot;&quot;&quot;뉴스 기사 내용을 가져오는 함수&quot;&quot;&quot;
    try:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        
        # HTML 파싱
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 네이버 뉴스의 경우
        if 'news.naver.com' in url:
            article = soup.select_one('#dic_area')
            if article:
                return clean_html_text(str(article))
        
        # 다른 언론사 사이트의 경우
        article = soup.find('article') or soup.find(class_=re.compile('article|content|news'))
        if article:
            return clean_html_text(str(article))
        
        return None
    except Exception as e:
        print(f&quot;기사 내용 가져오기 실패: {str(e)}&quot;)
        return None

def summarize_text(text, max_sentences=3):
    &quot;&quot;&quot;텍스트 요약 함수 (간단한 추출적 요약)&quot;&quot;&quot;
    if not text:
        return &quot;요약 불가&quot;
        
    # 문장 분리
    sentences = re.split(r'[.!?]\s+', text)
    sentences = [s.strip() + '.' for s in sentences if len(s.strip()) &amp;gt; 10]
    
    if not sentences:
        return &quot;요약 불가&quot;
    
    # 간단한 요약: 첫 몇 문장 선택
    summary = ' '.join(sentences[:max_sentences])
    return summary

def search_naver_news():
    # 네이버 API 인증 정보
    client_id = &quot;네이버 API에서 발급&quot;  # 네이버 개발자 센터에서 발급
    client_secret = &quot;네이버 API에서 발급&quot;

    # 검색어 입력 받기
    query = input(&quot;검색어를 입력하세요: &quot;)
    encoded_query = quote(query)

    # API 요청 URL
    url = f&quot;https://openapi.naver.com/v1/search/news.json?query={encoded_query}&amp;amp;display=5&amp;amp;start=1&quot;

    # 헤더 설정
    headers = {
        &quot;X-Naver-Client-Id&quot;: client_id,
        &quot;X-Naver-Client-Secret&quot;: client_secret
    }

    try:
        # API 요청 보내기
        response = requests.get(url, headers=headers)
        
        # 응답 확인
        if response.status_code == 200:
            result = json.loads(response.text)
            
            # 검색 결과 출력
            print(f&quot;\n'{query}' 검색 결과:\n&quot;)
            for item in result['items']:
                # HTML 태그 제거
                title = item['title'].replace('&amp;lt;b&amp;gt;', '').replace('&amp;lt;/b&amp;gt;', '')
                print(f&quot;제목: {title}&quot;)
                print(f&quot;링크: {item['link']}&quot;)
                
                # 기사 내용 가져오기 및 요약
                print(&quot;기사 요약 중...&quot;)
                article_content = get_article_content(item['link'])
                if article_content:
                    summary = summarize_text(article_content)
                    print(f&quot;요약: {summary}&quot;)
                else:
                    print(&quot;요약: 기사 내용을 가져올 수 없습니다.&quot;)
                
                print(&quot;-&quot; * 100)
                print()
        else:
            print(f&quot;Error Code: {response.status_code}&quot;)
            print(&quot;에러가 발생했습니다. 다시 시도해주세요.&quot;)

    except Exception as e:
        print(f&quot;오류가 발생했습니다: {str(e)}&quot;)

if __name__ == &quot;__main__&quot;:
    search_naver_news()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/745</guid>
      <comments>https://iamgus.tistory.com/745#entry745comment</comments>
      <pubDate>Thu, 30 Jan 2025 19:56:22 +0900</pubDate>
    </item>
    <item>
      <title>네이버 API 이용해 헤드라인 뉴스 기사 가져오기</title>
      <link>https://iamgus.tistory.com/744</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;웹 크롤링을 통해 자료를 수집할 때 가장 큰 문제점은&lt;/b&gt;&lt;/span&gt; 허가를 받지 않고 데이터를 수집한다는 거다. 언제 내 크롤러가 차단을 당해도 할 말이 없다. 웹 사이트 개편이라도 하면 크롤링 소스를 모두 수정해야 하는 상황에 봉착하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇다면 공식적인 방법은 뭐가 있을까? &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;바로 API를 이용&lt;/b&gt;&lt;/span&gt;하는거다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버를 예로 들면 로그인부터 뉴스, 쇼핑, 카페 데이터 검색을 위한 다양한 API를 제공한다. 사용한도는 있지만 꽤 넉넉하게 무료제공한다. 이 API를 이용해 뉴스기사를 수집해 보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 네이버 API 신청&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버 데이터랩에 접속해 오픈 api를 신청한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Client ID와 Client Secret 를 발급해 준다. 네이버 API를 이용하는 키라고 보면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developers.naver.com/products/service-api/datalab/datalab.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developers.naver.com/products/service-api/datalab/datalab.md&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737974682584&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;데이터랩 - SERVICE-API&quot; data-og-description=&quot;데이터랩 통합검색어 트렌드 통합검색어 트렌드는 네이버 통합검색에서 발생하는 검색어를 연령별, 성별, 기기별(PC, 모바일)로 세분화해서 조회할 수 있는 API입니다. 분석하고 싶은 주제군을 &quot; data-og-host=&quot;developers.naver.com&quot; data-og-source-url=&quot;https://developers.naver.com/products/service-api/datalab/datalab.md&quot; data-og-url=&quot;https://developers.naver.com/products/service-api/datalab/datalab.md&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developers.naver.com/products/service-api/datalab/datalab.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.naver.com/products/service-api/datalab/datalab.md&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;데이터랩 - SERVICE-API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;데이터랩 통합검색어 트렌드 통합검색어 트렌드는 네이버 통합검색에서 발생하는 검색어를 연령별, 성별, 기기별(PC, 모바일)로 세분화해서 조회할 수 있는 API입니다. 분석하고 싶은 주제군을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 네이버 헤드라인 뉴스 가져오기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 코드로 작성한다. API 사용법은 네이버 데이터랩의 다큐멘트를 참고하자.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737974962725&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests

client_id = &quot;HhqddhnYN8aaaaaaaaaa&quot;  # 네이버 개발자 센터에서 발급
client_secret = &quot;h_Bxbbbbbb&quot;        # 네이버 개발자 센터에서 발급
url = &quot;https://openapi.naver.com/v1/search/news.json&quot;
headers = {
    &quot;X-Naver-Client-Id&quot;: client_id,
    &quot;X-Naver-Client-Secret&quot;: client_secret,
}
params = {&quot;query&quot;: &quot;헤드라인&quot;, &quot;display&quot;: 10, &quot;sort&quot;: &quot;date&quot;}
response = requests.get(url, headers=headers, params=params)

news_data = response.json()
for no,item in enumerate(news_data['items'],1):
    print(f&quot;{str(no)} : {item['title']} {item['link']} &quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&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;1660&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjXtI6/btsL2l4QGqe/YYq703NwfMakRcIlTboqJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjXtI6/btsL2l4QGqe/YYq703NwfMakRcIlTboqJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjXtI6/btsL2l4QGqe/YYq703NwfMakRcIlTboqJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjXtI6%2FbtsL2l4QGqe%2FYYq703NwfMakRcIlTboqJ0%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;1660&quot; height=&quot;388&quot; data-origin-width=&quot;1660&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;웹크롤링과 API사용 장단점을 비교하면 다음과 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 154px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;항&lt;b&gt;목&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;웹 크롤링&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;API 사용&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;데이터 접근성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;웹 페이지에 표시되는 모든 데이터 가능&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;API가 제공하는 데이터로 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;안정성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;웹 페이지 구조 변경 시 작동 실패 가능성 있음&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;안정적이며 유지보수가 적음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;법적 문제&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;법적 이슈 가능성 있음&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;공식 제공이므로 안전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;속도와 효율성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;HTML 파싱으로 추가 처리 필요&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;가공된 데이터로 효율적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;사용 제약&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;요청 빈도 조절 필요&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;호출 횟수 및 사용량 제한 존재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;설정 난이도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;HTML 분석 및 유지보수 필요&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;인증 설정 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;웹 크롤링&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API가 없는 서비스에서 데이터를 수집하거나, API에서 제공하지 않는 세부 데이터를 크롤링해야 할 때 적합.&lt;/li&gt;
&lt;li&gt;비공식적으로 데이터를 빠르게 확보하려는 경우 유용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;API&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;안정성과 법적 안전성이 중요하거나, 간단한 방식으로 데이터를 수집하고 싶을 때 적합.&lt;/li&gt;
&lt;li&gt;공식적인 데이터 사용을 원하는 경우 최선.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/744</guid>
      <comments>https://iamgus.tistory.com/744#entry744comment</comments>
      <pubDate>Mon, 27 Jan 2025 20:05:03 +0900</pubDate>
    </item>
    <item>
      <title>블로그 포스팅 자동화 구글 애드센스 수익 이어질까?</title>
      <link>https://iamgus.tistory.com/743</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론부터 말하면 구글이나 네이버 헤드라인 뉴스를 크롤링해 블로그 포스팅을 자동화하고 이를 통해 구글 애드센스 수익을 올리는 것은 가능&lt;/b&gt;하다. 아주 미약하게나마 수익이 난다는 것이지 실질적인 수익이라 말하기 어렵다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최신 뉴스는 검색 수요가 많아 트래픽을 유도할 가능성이 높다. 또한 특정 키워드에 대한 순위를 잘 잡으면 방문자가 늘어날 것이다. 재수 좋으면 광고까지 클릭하게 된다. 정기적인 발행까지 된다면 활성화된 사이트로 간주해 SEO 점수가 개선될 것이다.&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;b&gt;첫 번째는 바로 저작권 문제다.&amp;nbsp;&lt;/b&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;두 번째로 SEO 페널티다.&lt;/b&gt; 구글은 중복 컨텐츠를 탐지해 페널티를 부여한다. 만약 뉴스 컨텐츠를 그대로 올리면 원 출처보다 SEO 순위에서 밀릴 가능성이 크다. 단순 복제 사이트로 분류되면 검색 엔진에서 제거되는 최악의 사태도 올 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;세 번째는 사용자에게 가치를 제공하기 어렵다.&amp;nbsp;&lt;/b&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;해결책은 문제점을 개선하는 것이다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;첫째 독창적이고 부가 가치 있는 컨텐츠를 게시한다.&lt;/b&gt; 크롤링한 헤드라인을 참고하되, 내용을 요약하거나 개인적인 의견, 분석을 추가한다. &quot;오늘의 주요 뉴스와 영향 분석&quot; 같은 형태로 가공한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;둘째 요약 컨텐츠를 제공한다.&lt;/b&gt; 헤드라인을 보여주고 기사링크를 요약해 함께 보여준다. 기사요약은 Google News API나 ChatGPT API를 이용하면 구현가능하다. 전자는 무료지만 결과가 만족스럽지 않고 잘 되지 않았다. 반면 후자는 꽤 높은 수준의 요약본을 제공한다. 유료모델이라 확실한 성능을 보여주는 듯하다. 계속 발전하고 있어서 만족도는 더 높아질 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 실제 만들어 보자. 요약을 무료로 해주는 라이브러리를 이용한다. 기사링크를 입력값으로 라이브러리를 호출한다.&lt;/p&gt;
&lt;pre id=&quot;code_1737886765759&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup
from datetime import datetime
from transformers import pipeline

# Hugging Face 요약 파이프라인 로드
# summarizer = pipeline(&quot;summarization&quot;, model=&quot;facebook/bart-large-cnn&quot;)
summarizer = pipeline(&quot;summarization&quot;, model=&quot;facebook/mbart-large-cc25&quot;)

def fetch_news():
    try:
        # 웹사이트 접속
        url = &quot;https://www.blockmedia.co.kr/&quot;
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        
        soup = BeautifulSoup(response.text, 'html.parser')
        news_links = []

        # 뉴스 기사 찾기
        articles = soup.find_all('article', class_='l-post')
        
        for article in articles[:10]:  # 상위 10개 뉴스
            try:
                # 날짜 추출
                date_element = article.find('time', class_='post-date')
                date = date_element.text.strip() if date_element else &quot;날짜 없음&quot;
                
                # 제목과 링크 추출
                title_element = article.find('h2', class_='post-title')
                title_link = title_element.find('a') if title_element else None
                
                if title_link:
                    title = title_link.text.strip()
                    link = title_link['href']
                    
                    # 이미지 URL 추출
                    img_element = article.find('span', class_='img')
                    image_url = img_element.get('data-bgsrc', '') if img_element else &quot;&quot;
                    news_links.append({&quot;title&quot;: title, &quot;link&quot;: link})

            except Exception as e:
                print(f&quot;기사 파싱 중 에러 발생: {str(e)}&quot;)
                continue
        return news_links
        
    except requests.exceptions.RequestException as e:
        print(f&quot;웹사이트 접속 중 에러 발생: {str(e)}&quot;)
        return None
    except Exception as e:
        print(f&quot;에러 발생: {str(e)}&quot;)
        return None


def fetch_article_content(url):
    try:
        response = requests.get(url)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, &quot;html.parser&quot;)
        
        # 기사 본문 추출
        paragraphs = soup.find_all(&quot;p&quot;)
        content = &quot; &quot;.join([para.text for para in paragraphs])
        return content if content else None
    except Exception as e:
        print(f&quot;Error fetching article content: {e}&quot;)
        return None

def summarize_content(content):
    try:
        # 공백 제거 및 내용 정리
        content = content.strip()
        
        # 내용 길이 확인
        if len(content) &amp;lt; 50:
            return &quot;요약할 내용이 너무 짧습니다.&quot;
        
        summary = summarizer(content, 
                             max_length=130, 
                             min_length=30, 
                             do_sample=False)
        return summary[0]['summary_text'] if summary else &quot;요약 불가&quot;
    except Exception as e:
        print(f&quot;요약 중 오류: {e}&quot;)
        return &quot;요약 불가&quot;

if __name__ == &quot;__main__&quot;:
    news = fetch_news()
    for idx, article in enumerate(news, start=1):
        print(f&quot;\n[{idx}] {article['title']}&quot;)
        print(f&quot;Link: {article['link']}&quot;)
        
        content = fetch_article_content(article['link'])
        if content:
            summary = summarize_content(content)
            print(f&quot;Summary: {summary}&quot;)
        else:
            print(&quot;Content could not be retrieved.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로그램 실행 결과는 실망스러웠다&lt;/b&gt;. 기사 링크를 입력으로 던져주고 요약본을 리턴하는 방식인데, 제대로 기사 요약은 하지 못했다. 대부분 요약불가로 에러를 뱉어냈다. 무료 버전의 한계인가?&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;[8]&amp;nbsp;코인베이스&amp;nbsp;CEO,&amp;nbsp;&amp;ldquo;코인&amp;nbsp;상장&amp;nbsp;방식&amp;nbsp;재검토&amp;nbsp;필요&amp;hellip;매주&amp;nbsp;100만개&amp;nbsp;신규&amp;nbsp;코인&amp;nbsp;생성&amp;rdquo; &lt;br /&gt;Link:&amp;nbsp;&lt;a href=&quot;https://www.blockmedia.co.kr/archives/849248&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.blockmedia.co.kr/archives/849248&lt;/a&gt;&lt;br /&gt;Summary:&amp;nbsp;에서는&amp;nbsp;블록미디어&amp;nbsp;이정화&amp;nbsp;기자]&amp;nbsp;코인&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp;기자]&amp;nbsp; &lt;br /&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;규제&amp;nbsp;당국의&amp;nbsp;규제&amp;nbsp;당국의&amp;nbsp;규제&amp;nbsp;당국조차&amp;nbsp;감당하기&amp;nbsp;어려운&amp;nbsp;상황고&amp;nbsp;지적했다.&amp;nbsp;암스트롱은&amp;nbsp;규제&amp;nbsp;당국의&amp;nbsp;접근&amp;nbsp;방식에도&amp;nbsp;문제를&amp;nbsp;제기했다.&amp;nbsp;그는&amp;nbsp;&amp;ldquo;모든&amp;nbsp;토큰에&amp;nbsp;대해&amp;nbsp;각각&amp;nbsp;승인 &lt;br /&gt;&lt;br /&gt;[9]&amp;nbsp;매도&amp;nbsp;폭탄&amp;nbsp;멈춘&amp;nbsp;외국인,&amp;nbsp;본격&amp;nbsp;귀환할까[설&amp;nbsp;이후&amp;nbsp;증시전망②] &lt;br /&gt;Link:&amp;nbsp;&lt;a href=&quot;https://www.blockmedia.co.kr/archives/849222&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.blockmedia.co.kr/archives/849222&lt;/a&gt;&lt;br /&gt;요약&amp;nbsp;중&amp;nbsp;오류:&amp;nbsp;index&amp;nbsp;out&amp;nbsp;of&amp;nbsp;range&amp;nbsp;in&amp;nbsp;self &lt;br /&gt;Summary:&amp;nbsp;요약&amp;nbsp;불가&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChatGpt에 기사링크를 던지고 요약해보라 했다. 그 결과는 깔끔했다.&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;1468&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eaQa5j/btsL1fYKUYf/hj6PMOMwdhJuJ5hn6QKy90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eaQa5j/btsL1fYKUYf/hj6PMOMwdhJuJ5hn6QKy90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eaQa5j/btsL1fYKUYf/hj6PMOMwdhJuJ5hn6QKy90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeaQa5j%2FbtsL1fYKUYf%2Fhj6PMOMwdhJuJ5hn6QKy90%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;1468&quot; height=&quot;654&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;654&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;1171&quot; data-origin-height=&quot;908&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GFT5u/btsL1A17IWM/w8U9mYJkkTXEXaqfwLLCv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GFT5u/btsL1A17IWM/w8U9mYJkkTXEXaqfwLLCv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GFT5u/btsL1A17IWM/w8U9mYJkkTXEXaqfwLLCv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGFT5u%2FbtsL1A17IWM%2Fw8U9mYJkkTXEXaqfwLLCv0%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;1171&quot; height=&quot;908&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;908&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론은 인공지능 LLM 모델을 이용할 수 밖에 없지 않겠는가...&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/743</guid>
      <comments>https://iamgus.tistory.com/743#entry743comment</comments>
      <pubDate>Sun, 26 Jan 2025 19:31:22 +0900</pubDate>
    </item>
    <item>
      <title>BeautifulSoup 이용해 웹 데이터 추출하기 - select, select_one, find, find_all</title>
      <link>https://iamgus.tistory.com/742</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;BeautifulSoup의 메서드 select, select_one, find, find_all은 HTML 문서에서 데이터를 추출하는 데 사용됩니다. 웹 사이트마다 다양한 방식으로 페이지를 구성되어 있어서 각 메서드에 대한 완벽한 이해가 필요합니다. 메서드 정의와 예제를 통해 사용법을 익혀보아요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlK2q2/btsLL5tydvD/zc31gsxPzbGJ9mGknxkKp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlK2q2/btsLL5tydvD/zc31gsxPzbGJ9mGknxkKp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlK2q2/btsLL5tydvD/zc31gsxPzbGJ9mGknxkKp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlK2q2%2FbtsLL5tydvD%2Fzc31gsxPzbGJ9mGknxkKp1%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;1174&quot; height=&quot;296&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. &lt;b&gt;find()&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건에 맞는 &lt;b&gt;첫 번째 태그&lt;/b&gt;를 반환합니다.&lt;/li&gt;
&lt;li&gt;태그 이름, 속성, 문자열 조건 등을 사용해 검색할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제&lt;/h3&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre id=&quot;code_1736670556535&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from bs4 import BeautifulSoup

html = &quot;&quot;&quot;
&amp;lt;html&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;content&quot;&amp;gt;
            &amp;lt;p class=&quot;title&quot;&amp;gt;Title 1&amp;lt;/p&amp;gt;
            &amp;lt;p class=&quot;description&quot;&amp;gt;Description 1&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&quot;&quot;&quot;

soup = BeautifulSoup(html, 'html.parser')

# 첫 번째 &amp;lt;p&amp;gt; 태그 찾기
first_p = soup.find('p')
print(first_p.text)  # 출력: &quot;Title 1&quot;

# 클래스가 'description'인 첫 번째 &amp;lt;p&amp;gt; 태그 찾기
description_p = soup.find('p', class_='description')
print(description_p.text)  # 출력: &quot;Description 1&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. &lt;b&gt;find_all()&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건에 맞는 &lt;b&gt;모든 태그&lt;/b&gt;를 리스트로 반환합니다.&lt;/li&gt;
&lt;li&gt;limit 매개변수를 사용해 반환 개수를 제한할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제&lt;/h3&gt;
&lt;pre id=&quot;code_1736670589134&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모든 &amp;lt;p&amp;gt; 태그 찾기
all_p = soup.find_all('p')
for p in all_p:
    print(p.text)

# 출력:
# &quot;Title 1&quot;
# &quot;Description 1&quot;

# 클래스가 'description'인 모든 태그 찾기
all_descriptions = soup.find_all('p', class_='description')
for desc in all_descriptions:
    print(desc.text)  # 출력: &quot;Description 1&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. &lt;b&gt;select()&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CSS 선택자를 사용하여 조건에 맞는 &lt;b&gt;모든 태그&lt;/b&gt;를 리스트로 반환합니다.&lt;/li&gt;
&lt;li&gt;보다 복잡한 조건을 간단히 처리할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제&lt;/h3&gt;
&lt;pre id=&quot;code_1736670655843&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모든 &amp;lt;p&amp;gt; 태그 선택
all_p = soup.select('p')
for p in all_p:
    print(p.text)

# 출력:
# &quot;Title 1&quot;
# &quot;Description 1&quot;

# 특정 클래스 선택
title_p = soup.select('.title')
print(title_p[0].text)  # 출력: &quot;Title 1&quot;

# &amp;lt;div&amp;gt; 내부의 &amp;lt;p&amp;gt; 태그 선택
div_p = soup.select('div.content &amp;gt; p')
for p in div_p:
    print(p.text)

# 출력:
# &quot;Title 1&quot;
# &quot;Description 1&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. &lt;b&gt;select_one()&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CSS 선택자를 사용하여 조건에 맞는 &lt;b&gt;첫 번째 태그&lt;/b&gt;를 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제&lt;/h3&gt;
&lt;pre id=&quot;code_1736670679720&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 클래스가 'title'인 첫 번째 태그 선택
title_p = soup.select_one('.title')
print(title_p.text)  # 출력: &quot;Title 1&quot;

# &amp;lt;div&amp;gt; 내부의 첫 번째 &amp;lt;p&amp;gt; 태그 선택
first_div_p = soup.select_one('div.content &amp;gt; p')
print(first_div_p.text)  # 출력: &quot;Title 1&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;차이점 요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;find, find_all은 태그를 조건으로 select, select_one은 css 선택자를 이용한다. find_all, select는 반환값이 복수개를 가정해 사용하므로 리턴값은 리스트이다. 물론, 하나만 리턴하는 경우도 리스트를 반환하기 때문에 바로 text로 값을 확인할 수 없으므로 list[]형태로 값을 출력하도록 한다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;find()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;태그 조건&lt;/td&gt;
&lt;td&gt;첫 번째 태그 (Tag)&lt;/td&gt;
&lt;td&gt;단일 요소를 찾을 때 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;find_all()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;태그 조건&lt;/td&gt;
&lt;td&gt;모든 태그의 리스트 (list[Tag])&lt;/td&gt;
&lt;td&gt;여러 요소를 찾을 때 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;select()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;CSS 선택자&lt;/td&gt;
&lt;td&gt;모든 태그의 리스트 (list[Tag])&lt;/td&gt;
&lt;td&gt;복잡한 CSS 조건의 다수 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;select_one()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;CSS 선택자&lt;/td&gt;
&lt;td&gt;첫 번째 태그 (Tag)&lt;/td&gt;
&lt;td&gt;복잡한 CSS 조건의 단일 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;단일 요소&lt;/b&gt;를 찾을 때: find, select_one&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다수의 요소&lt;/b&gt;를 찾을 때: find_all, select&lt;/li&gt;
&lt;li&gt;&lt;b&gt;복잡한 선택 조건&lt;/b&gt;이 필요한 경우: select, select_one&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적절한 메서드를 사용해 효율적으로 데이터를 추출할 수 있습니다.  &lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/742</guid>
      <comments>https://iamgus.tistory.com/742#entry742comment</comments>
      <pubDate>Sun, 12 Jan 2025 17:42:45 +0900</pubDate>
    </item>
    <item>
      <title>비트코인 헤드라인 뉴스 사이트 자동으로 만들기</title>
      <link>https://iamgus.tistory.com/741</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;b&gt;1. 뉴스 원천은 어디?&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록미디어 최신 뉴스를 사용한다.&amp;nbsp; (&lt;a href=&quot;https://www.blockmedia.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.blockmedia.co.kr/&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;1085&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxul5q/btsLKGVEl3A/o2jUHOgGfq1axp8jSpKgj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxul5q/btsLKGVEl3A/o2jUHOgGfq1axp8jSpKgj1/img.png&quot; data-alt=&quot;코인 최신 뉴스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxul5q/btsLKGVEl3A/o2jUHOgGfq1axp8jSpKgj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxul5q%2FbtsLKGVEl3A%2Fo2jUHOgGfq1axp8jSpKgj1%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;584&quot; height=&quot;1085&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;1085&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;코인 최신 뉴스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 기사 스크래핑은 누가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인공지능을 이용한다. Claude로 시작해 ChatGpt로 마무리했다. 무료로 사용하다 보니 사용 제한이 걸렸기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 코드 작성을 위한 사이트 분석&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude에 블로미디어 url을 입력하고 뉴스기사 스크래핑을 요청했는데 결과가 제대로 나오지 않았다. 그래서 최신 기사가 있는 웹 페이지 위치를 알려주었다.&amp;nbsp; 여기 copy element 소스를 Claude에 입력하고 기사 스크래핑을 했다.&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;1038&quot; data-origin-height=&quot;1097&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KUUpN/btsLJjUNDBJ/oQKcPS8AziX2bLN0831Flk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KUUpN/btsLJjUNDBJ/oQKcPS8AziX2bLN0831Flk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KUUpN/btsLJjUNDBJ/oQKcPS8AziX2bLN0831Flk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKUUpN%2FbtsLJjUNDBJ%2FoQKcPS8AziX2bLN0831Flk%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;1038&quot; height=&quot;1097&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;1097&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 스크래핑 소스코드 작성해줘.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;claude는 다음 기능을 주요하게 구현하며 깔끔한 결과를 도출했다.&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;/li&gt;
&lt;li&gt;제목, 링크, 날짜 정보를 추출&lt;/li&gt;
&lt;li&gt;데이터를 DataFrame으로 변환&lt;/li&gt;
&lt;li&gt;CSV 파일로 저장&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1736578053423&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime
import time

def scrape_blockmedia():
    # 기본 URL 설정
    url = &quot;https://www.blockmedia.co.kr/&quot;
    
    try:
        # User-Agent 설정
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        
        # 웹페이지 요청
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        response.encoding = 'utf-8'
        
        # BeautifulSoup 객체 생성
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 뉴스 기사 컨테이너 찾기
        news_items = []
        articles = soup.find_all('article', class_='l-post')
        
        for article in articles:
            try:
                # 날짜 추출
                date_element = article.find('time', class_='post-date')
                date = date_element.text.strip() if date_element else &quot;날짜 없음&quot;
                
                # 제목과 링크 추출
                title_element = article.find('h2', class_='post-title')
                title_link = title_element.find('a') if title_element else None
                
                title = title_link.text.strip() if title_link else &quot;제목 없음&quot;
                link = title_link['href'] if title_link else &quot;&quot;
                
                # 이미지 URL 추출
                img_element = article.find('span', class_='img')
                image_url = img_element.get('data-bgsrc', '') if img_element else &quot;&quot;
                
                news_items.append({
                    'title': title,
                    'link': link,
                    'date': date,
                    'image_url': image_url,
                    'scraped_time': datetime.now().strftime(&quot;%Y-%m-%d %H:%M:%S&quot;)
                })
            except Exception as e:
                print(f&quot;기사 파싱 중 에러 발생: {str(e)}&quot;)
                continue
        
        # DataFrame 생성
        df = pd.DataFrame(news_items)
        
        # CSV 파일로 저장
        filename = f&quot;blockmedia_news_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv&quot;
        df.to_csv(filename, index=False, encoding='utf-8-sig')
        
        print(f&quot;스크래핑 완료: {len(news_items)}개의 기사가 {filename}에 저장되었습니다.&quot;)
        return df
        
    except requests.exceptions.RequestException as e:
        print(f&quot;웹사이트 접속 중 에러 발생: {str(e)}&quot;)
        return None
    except Exception as e:
        print(f&quot;예상치 못한 에러 발생: {str(e)}&quot;)
        return None

if __name__ == &quot;__main__&quot;:
    # 실행
    df = scrape_blockmedia()
    
    if df is not None:
        # 결과 출력
        print(&quot;\n최근 뉴스 목록:&quot;)
        for idx, row in df.iterrows():
            print(f&quot;\n[{row['date']}] {row['title']}&quot;)
            print(f&quot;링크: {row['link']}&quot;)&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;1364&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/limzb/btsLJ59vVEw/w805RH4GFnAxg5PyqVoiKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/limzb/btsLJ59vVEw/w805RH4GFnAxg5PyqVoiKK/img.png&quot; data-alt=&quot;최신 뉴스 자동 추출 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/limzb/btsLJ59vVEw/w805RH4GFnAxg5PyqVoiKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flimzb%2FbtsLJ59vVEw%2Fw805RH4GFnAxg5PyqVoiKK%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;1364&quot; height=&quot;366&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최신 뉴스 자동 추출 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 출력결과를 웹 페이지로 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #262624; color: #e5e5e2; text-align: start;&quot;&gt;추출된 헤드라인 뉴스만 html과 css를 이용해 파일로 출력하는 코드를 작성해 줘&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chatgpt에 이전 코드를 올려 작업하게 했다. html과 css를 적절하게 구성해 깔끔한 뉴스 매거진을 만들었다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736578345731&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup
from datetime import datetime

def create_news_html():
    # CSS 스타일을 별도의 문자열로 정의
    css_style = &quot;&quot;&quot;
    body {
        font-family: 'Arial', sans-serif;
        margin: 0;
        padding: 20px;
        background-color: #f5f5f5;
    }
    .container {
        max-width: 1200px;
        margin: 0 auto;
        background-color: white;
        padding: 20px;
        border-radius: 10px;
        box-shadow: 0 0 10px rgba(0,0,0,0.1);
    }
    .header {
        background-color: #2c3e50;
        color: white;
        padding: 20px;
        border-radius: 8px;
        margin-bottom: 20px;
    }
    .header h1 {
        margin: 0;
        font-size: 24px;
    }
    .news-list {
        list-style: none;
        padding: 0;
    }
    .news-item {
        background-color: white;
        border: 1px solid #e0e0e0;
        border-radius: 8px;
        margin-bottom: 15px;
        padding: 15px;
        transition: transform 0.2s ease;
    }
    .news-item:hover {
        transform: translateX(10px);
    }
    .news-link {
        text-decoration: none;
        color: #2c3e50;
        display: block;
    }
    .news-title {
        font-size: 18px;
        font-weight: bold;
        margin-bottom: 8px;
    }
    .news-date {
        font-size: 14px;
        color: #666;
    }
    .news-meta {
        display: flex;
        justify-content: space-between;
        align-items: center;
    }
    .news-image {
        width: 200px;
        height: 120px;
        object-fit: cover;
        border-radius: 4px;
        margin-left: 15px;
    }
    .generated-time {
        text-align: center;
        color: #666;
        font-size: 14px;
        margin-top: 20px;
        padding-top: 20px;
        border-top: 1px solid #e0e0e0;
    }
    &quot;&quot;&quot;

    # HTML 템플릿
    html_template = f&quot;&quot;&quot;
    &amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html lang=&quot;ko&quot;&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
        &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
        &amp;lt;title&amp;gt;블록미디어 헤드라인 뉴스&amp;lt;/title&amp;gt;
        &amp;lt;style&amp;gt;
        {css_style}
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;container&quot;&amp;gt;
            &amp;lt;div class=&quot;header&quot;&amp;gt;
                &amp;lt;h1&amp;gt;블록미디어 헤드라인 뉴스&amp;lt;/h1&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;ul class=&quot;news-list&quot;&amp;gt;
                {{news_items}}
            &amp;lt;/ul&amp;gt;
            &amp;lt;div class=&quot;generated-time&quot;&amp;gt;
                생성 시간: {{generated_time}}
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
    &quot;&quot;&quot;
    
    try:
        # 웹사이트 접속
        url = &quot;https://www.blockmedia.co.kr/&quot;
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        
        soup = BeautifulSoup(response.text, 'html.parser')
        news_items = []
        
        # 뉴스 기사 찾기
        articles = soup.find_all('article', class_='l-post')
        
        for article in articles:
            try:
                # 날짜 추출
                date_element = article.find('time', class_='post-date')
                date = date_element.text.strip() if date_element else &quot;날짜 없음&quot;
                
                # 제목과 링크 추출
                title_element = article.find('h2', class_='post-title')
                title_link = title_element.find('a') if title_element else None
                
                if title_link:
                    title = title_link.text.strip()
                    link = title_link['href']
                    
                    # 이미지 URL 추출
                    img_element = article.find('span', class_='img')
                    image_url = img_element.get('data-bgsrc', '') if img_element else &quot;&quot;
                    
                    # 뉴스 아이템 HTML 생성
                    news_item_html = f&quot;&quot;&quot;
                    &amp;lt;li class=&quot;news-item&quot;&amp;gt;
                        &amp;lt;a href=&quot;{link}&quot; class=&quot;news-link&quot; target=&quot;_blank&quot;&amp;gt;
                            &amp;lt;div class=&quot;news-meta&quot;&amp;gt;
                                &amp;lt;div&amp;gt;
                                    &amp;lt;div class=&quot;news-title&quot;&amp;gt;{title}&amp;lt;/div&amp;gt;
                                    &amp;lt;div class=&quot;news-date&quot;&amp;gt;{date}&amp;lt;/div&amp;gt;
                                &amp;lt;/div&amp;gt;
                                &amp;lt;img src=&quot;{image_url}&quot; alt=&quot;{title}&quot; class=&quot;news-image&quot; onerror=&quot;this.style.display='none'&quot;&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/a&amp;gt;
                    &amp;lt;/li&amp;gt;
                    &quot;&quot;&quot;
                    news_items.append(news_item_html)
            
            except Exception as e:
                print(f&quot;기사 파싱 중 에러 발생: {str(e)}&quot;)
                continue
        
        # 현재 시간 포맷팅
        current_time = datetime.now().strftime(&quot;%Y-%m-%d %H:%M:%S&quot;)
        
        # 최종 HTML 생성
        # final_html = html_template.format(
        #     news_items=&quot;\n&quot;.join(news_items),
        #     generated_time=current_time
        # )

        # 최종 HTML 생성
        final_html = html_template.replace(&quot;{news_items}&quot;, &quot;\n&quot;.join(news_items)).replace(&quot;{generated_time}&quot;, current_time)

        # 파일로 저장
        filename = f&quot;blockmedia_news_{datetime.now().strftime('%Y%m%d_%H%M%S')}.html&quot;
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(final_html)
            
        print(f&quot;HTML 파일이 생성되었습니다: {filename}&quot;)
        
    except requests.exceptions.RequestException as e:
        print(f&quot;웹사이트 접속 중 에러 발생: {str(e)}&quot;)
    except Exception as e:
        print(f&quot;에러 발생: {str(e)}&quot;)

if __name__ == &quot;__main__&quot;:
    create_news_html()&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;1881&quot; data-origin-height=&quot;1204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kWOgN/btsLKKKpEjf/Bqc8ClEX8h9y4CSAHaFiK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kWOgN/btsLKKKpEjf/Bqc8ClEX8h9y4CSAHaFiK1/img.png&quot; data-alt=&quot;chatgpt 최신 뉴스 헤드라인 메거진 만들기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kWOgN/btsLKKKpEjf/Bqc8ClEX8h9y4CSAHaFiK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkWOgN%2FbtsLKKKpEjf%2FBqc8ClEX8h9y4CSAHaFiK1%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;1881&quot; height=&quot;1204&quot; data-origin-width=&quot;1881&quot; data-origin-height=&quot;1204&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;chatgpt 최신 뉴스 헤드라인 메거진 만들기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. 마치며&lt;/b&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;b&gt;7. 부록 : 효율적인 프롬프트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코드의 주요 기능:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹사이트에서 최신 뉴스 기사를 스크래핑&lt;/li&gt;
&lt;li&gt;제목, 링크, 날짜 정보를 추출&lt;/li&gt;
&lt;li&gt;데이터를 DataFrame으로 변환&lt;/li&gt;
&lt;li&gt;CSV 파일로 저장&lt;/li&gt;
&lt;li&gt;이미지 URL 추출 ('data-bgsrc' 속성 사용)&lt;/li&gt;
&lt;li&gt;더 자세한 에러 메시지 출력&lt;/li&gt;
&lt;li&gt;결과 출력 형식 개선&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드를 실행하면 블록미디어의 최신 뉴스 기사들을 스크래핑하여 CSV 파일로 저장하고, 콘솔에 결과를 출력합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹 페이지 만들기 프롬프트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프런트엔드 (HTML/CSS/JavaScript):&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모던한 카드 기반 뉴스 레이아웃&lt;/li&gt;
&lt;li&gt;반응형 디자인&lt;/li&gt;
&lt;li&gt;뉴스 카드 호버 효과&lt;/li&gt;
&lt;li&gt;이미지, 제목, 요약, 날짜 표시&lt;/li&gt;
&lt;li&gt;클릭 시 원본 기사로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전체 요약&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뉴스 스크래핑:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;블록미디어 웹사이트에서 최신 뉴스 추출&lt;/li&gt;
&lt;li&gt;제목, 링크, 날짜, 이미지 URL 수집&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HTML 생성:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반응형 디자인&lt;/li&gt;
&lt;li&gt;깔끔한 카드 스타일 레이아웃&lt;/li&gt;
&lt;li&gt;호버 효과&lt;/li&gt;
&lt;li&gt;이미지 표시 (이미지 로드 실패 시 자동으로 숨김)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스타일링:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모던한 디자인&lt;/li&gt;
&lt;li&gt;그림자 효과&lt;/li&gt;
&lt;li&gt;부드러운 애니메이션&lt;/li&gt;
&lt;li&gt;읽기 좋은 타이포그래피&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파일 저장:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타임스탬프가 포함된 파일명으로 저장&lt;/li&gt;
&lt;li&gt;UTF-8 인코딩 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/741</guid>
      <comments>https://iamgus.tistory.com/741#entry741comment</comments>
      <pubDate>Sat, 11 Jan 2025 16:05:54 +0900</pubDate>
    </item>
    <item>
      <title>라면 레시피로 쉽게 이해하는 Docker</title>
      <link>https://iamgus.tistory.com/740</link>
      <description>&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Docker는 이미지이자 컨테이너다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;세상에서 가장 맛있는 라면을 만드는 식당이 있다. 그 라면을 먹기 위해 식당 앞은 손님들로 장사진을 친다. 하지만 물리적 공간 제한으로 고작 20명만 먹을 수 있다. 나머지는 발걸음을 돌려야 한다. 요리사는 좀 더 많은 사람들에게&amp;nbsp; 라면을 판매할 수 없을까 고민한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chVQmM/btsLByRhsT7/ZLlvICL2bVpVp7qGgWMND0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chVQmM/btsLByRhsT7/ZLlvICL2bVpVp7qGgWMND0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chVQmM/btsLByRhsT7/ZLlvICL2bVpVp7qGgWMND0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchVQmM%2FbtsLByRhsT7%2FZLlvICL2bVpVp7qGgWMND0%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;585&quot; height=&quot;685&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;685&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그는 라면 레시피와 라면 제조기를 판매하기로 마음머고 레시피를 웹 사이트에 게시한다. 라면 제조기는 이 레시피를 입력하면 식당에서 판매하는 라면과 100% 같은 맛과 풍미를&amp;nbsp; 느끼게 요리해 준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;발걸음을 돌린 손님은 이 레시피를 내려받아 라면 제조기에 입력한다. 5분 뒤에 세상에서 가장 맛있는 라면을 먹을 수 있게 된다. 이제 더이상 라면을 먹기 위해 긴 줄을 설 필요가 없다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1Egag/btsLCEjdbQA/5ka8vOzF5H9ynbx3oSU2Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1Egag/btsLCEjdbQA/5ka8vOzF5H9ynbx3oSU2Lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1Egag/btsLCEjdbQA/5ka8vOzF5H9ynbx3oSU2Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1Egag%2FbtsLCEjdbQA%2F5ka8vOzF5H9ynbx3oSU2Lk%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;1148&quot; height=&quot;930&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;930&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Docker는 라면 레시피이자 라면을 만드는 기계다. 어디서나 완벽한 격리되고 누구나 동일한 환경에서 이용하게 한다. 레시피란 간단한 종이 쪼가리 혹은 이미지를 이용해 보관하고 있다가 컨테이너로 변신하여 작동하게 하는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;chatgpt가 설명하는 docker 개념을 보자. &lt;/span&gt;&lt;/p&gt;
&lt;h3 data-pm-slice=&quot;1 5 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;1. Docker란 무엇인가?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;개념&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Docker는 애플리케이션과 그 실행 환경을 컨테이너라는 독립된 단위로 패키징하여 실행할 수 있도록 돕는 플랫폼입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;실생활 비유&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;이동식 도시락 상자&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;도시락 상자 안에 음식, 젓가락, 냅킨 등 필요한 모든 것을 담아 어디서든 먹을 수 있는 상태를 제공.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Docker는 애플리케이션과 실행에 필요한 모든 것을 컨테이너에 담아 어디서나 동일하게 실행 가능.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;컨테이너 화물&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;물건을 규격화된 컨테이너에 담아 전 세계로 운송.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Docker는 소프트웨어를 컨테이너에 담아 다양한 환경에서 동일하게 실행 가능.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;실생활 구체적 비유&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;친구들이 집에 놀러 오는데 각자 좋아하는 음식을 만들어 가져오라고 한다면, 각 음식은 포장 용기에 담겨 냄비나 그릇을 빌리지 않아도 바로 먹을 수 있습니다. Docker는 이렇게 필요한 준비물과 애플리케이션을 하나로 묶어 가져오는 역할을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;2. Docker의 주요 개념&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;이미지(Image)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;애플리케이션과 실행 환경을 포함한 읽기 전용 템플릿.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;비유&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 레시피 - 요리를 만드는 데 필요한 모든 지침이 포함된 문서.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;컨테이너(Container)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;이미지를 기반으로 실행되는 독립적인 환경.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;비유&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 도시락 상자 - 레시피로 만들어진 음식이 담긴 상태.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;레지스트리(Registry)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;이미지를 저장하고 공유하는 저장소.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;비유&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 음식 배달 플랫폼 - 다양한 도시락 레시피가 등록된 곳.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;3. 실생활 예시로 배우는 Docker&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;true&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;예시 1: 카페테리아와 Docker&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;카페테리아에서 고객마다 선호하는 음료를 제공합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Docker 컨테이너는 특정 음료(애플리케이션)와 그 준비 도구(실행 환경)를 담고 있어, 고객이 주문하면 즉시 제공 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;예시 2: 홈 파티 준비하기&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;손님마다 다양한 음식 요구가 있을 때, 각각의 도시락 상자에 맞춤 메뉴를 준비.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Docker는 각각의 애플리케이션(음식)을 독립적으로 준비하고 격리하여 충돌 없이 제공합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;4. 실습: 나만의 컨테이너 만들기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;목표&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;간단한 Nginx 웹 서버 컨테이너를 실행하여 정적 웹 페이지를 호스팅.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;실습 단계&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;Docker 설치 확인:&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;docker --version&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Nginx 컨테이너 실행:&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;docker run -d -p 8080:80 nginx&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;브라우저에서 &lt;/span&gt;&lt;span&gt;http://localhost:8080&lt;/span&gt;&lt;span&gt;으로 접속하여 Nginx 기본 페이지 확인.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;컨테이너 중지 및 삭제:&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;docker ps docker stop &amp;lt;container_id&amp;gt; docker rm &amp;lt;container_id&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;5. Docker의 이점과 한계&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;이점&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;애플리케이션 환경을 표준화하여 개발과 배포를 간소화.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;시스템 자원을 효율적으로 사용.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;다양한 플랫폼에서 동일한 환경 제공.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;한계&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;컨테이너 내부 디버깅이 복잡할 수 있음.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;고성능 애플리케이션의 경우 오버헤드 발생 가능.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;6. 마무리 및 다음 단계&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;요약&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Docker는 소프트웨어 실행 환경을 표준화하여 개발 및 배포를 효율화하는 강력한 도구.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;실생활 예시로 Docker 개념을 쉽게 이해하고 간단한 실습을 통해 실무 활용 가능성을 확인.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;추가 학습&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Docker Compose를 사용하여 복잡한 애플리케이션 관리.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Kubernetes로 컨테이너 오케스트레이션 학습.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/740</guid>
      <comments>https://iamgus.tistory.com/740#entry740comment</comments>
      <pubDate>Wed, 1 Jan 2025 15:32:49 +0900</pubDate>
    </item>
    <item>
      <title>웹 페이지 조회 건수 보여주기 - docker compose 이용</title>
      <link>https://iamgus.tistory.com/739</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹 사이트 접속할 때 조회 건수를 보여주는 페이지를 만들어 보자. 파이썬 flask와 redis를 이용한다. flask는 초경량 웹서버, redis는 간단한 기록을 담당한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;app.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735458348509&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask
from redis import Redis
import os

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    redis.incr('hits')
    return f'안녕하세요! 이 페이지는 {redis.get(&quot;hits&quot;).decode(&quot;utf-8&quot;)}번 조회되었습니다!\n'

if __name__ == &quot;__main__&quot;:
    app.run(host=&quot;0.0.0.0&quot;, debug=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flask 웹 서버와 redis를 이용해 조회건수를 보여주는 소스다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;requirements.txt&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;flask&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;redis&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker 이미지 만들 때 필요한 패키지를 작성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Dockerfile&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735458500852&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.9-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD [&quot;python&quot;, &quot;app.py&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker 구동 시 참고할 정보다. requirements.txt를 읽어 모듈을 설치하고 app.py를 구동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;docker-compose.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735458566930&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'
services:
  web:
    build: .
    ports:
      - &quot;5000:5000&quot;
    volumes:
      - .:/app
    depends_on:
      - redis
  redis:
    image: redis:alpine&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;flask와 redis를 하나의 네트워크, 즉 격리된 공간에서 상호작용하기 위해 docker compose를 이용한다. 순서는 의존성이 있는 redis를 먼저 구동하고 flask 웹을 띄운다.&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;1. 서비스 구동하기 ( docker compose up )&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0yaIW/btsLBuU7mZI/T5OcWtcJdBkYL1hsEooUGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0yaIW/btsLBuU7mZI/T5OcWtcJdBkYL1hsEooUGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0yaIW/btsLBuU7mZI/T5OcWtcJdBkYL1hsEooUGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0yaIW%2FbtsLBuU7mZI%2FT5OcWtcJdBkYL1hsEooUGk%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;679&quot; height=&quot;252&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;redis와 flask 서비스가 ready 상태가 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 웹 사이트 접근하기 ( http://127.0.0.1:5000/ )&lt;/b&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;651&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CKKcz/btsLBeZhrUz/nnt99X06pq0S8Rjr1k9oK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CKKcz/btsLBeZhrUz/nnt99X06pq0S8Rjr1k9oK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CKKcz/btsLBeZhrUz/nnt99X06pq0S8Rjr1k9oK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCKKcz%2FbtsLBeZhrUz%2Fnnt99X06pq0S8Rjr1k9oK1%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;651&quot; height=&quot;256&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5000번 포트를 통해 flask 웹서버에 접근한다. 페이지 방문 건수가 기록되고 조회된다. 페이지를 새로고침 하면 1씩 늘어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 서비스 중지하기 (Ctrl + c)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nK3hO/btsLCngEsu6/78mL1SZFU4sxeR7mjqXxW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nK3hO/btsLCngEsu6/78mL1SZFU4sxeR7mjqXxW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nK3hO/btsLCngEsu6/78mL1SZFU4sxeR7mjqXxW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnK3hO%2FbtsLCngEsu6%2F78mL1SZFU4sxeR7mjqXxW1%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;1069&quot; height=&quot;230&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flask, redis 컨테이너만 stop 된다. 다시 서비스 기동 후 웹 사이트 접속하면 이전 카운트에 +1인 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 서비스 완전 종료하기 (docker compose down )&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b143M8/btsLzB2s2Un/KD0Nkxmbgo1NTGxozsW5K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b143M8/btsLzB2s2Un/KD0Nkxmbgo1NTGxozsW5K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b143M8/btsLzB2s2Un/KD0Nkxmbgo1NTGxozsW5K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb143M8%2FbtsLzB2s2Un%2FKD0Nkxmbgo1NTGxozsW5K1%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;991&quot; height=&quot;228&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flask, redis 뿐만 아니라 Network도 모두 제거된다. 따라서 방문자 카운트가 모두 초기화되어 웹 사이트 접속하면 방문 카운트가 1이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 docker compose를 사용하는가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;편리함이다. 만약 이를 사용하지 않는다면,&amp;nbsp; 컨테이너 간 동일한 격리공간을 만들어 flask와 redis 서비스를 연결시켜야 한다. docker compose 는 이런 번거로움을 해결해 준다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/739</guid>
      <comments>https://iamgus.tistory.com/739#entry739comment</comments>
      <pubDate>Sun, 29 Dec 2024 17:07:03 +0900</pubDate>
    </item>
    <item>
      <title>뉴스 기사 추출하는 코드 만들어 줄래? 3탄 docker 결과 파일 가져오기</title>
      <link>https://iamgus.tistory.com/738</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://iamgus.tistory.com/736&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.12.27 - [코드리뷰/chatGPT(Python)코드] - 뉴스 기사 추출하는 코드 만들어 줄래? 1탄 (Chatgpt / Claude)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735382055176&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;뉴스 기사 추출하는 코드 만들어 줄래? 1탄 (Chatgpt / Claude)&quot; data-og-description=&quot;네이버 최신 뉴스 헤드라인을 추출해 보자.&amp;nbsp;일반적으로 웹 데이터를 추출하는 것을 웹크롤링이라 한다. 주로 파이썬을 이용해 웹 페이지 분석 후 필요한 데이터를 가져오는 코드를 작성하는데,&quot; data-og-host=&quot;iamgus.tistory.com&quot; data-og-source-url=&quot;https://iamgus.tistory.com/736&quot; data-og-url=&quot;https://iamgus.tistory.com/736&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fyxib/hyXSEdGAum/16f5kWfJzuPoTipRJ8ognk/img.png?width=643&amp;amp;height=1076&amp;amp;face=0_0_643_1076,https://scrap.kakaocdn.net/dn/8fDnG/hyXSua4r7u/rB5r4B2rZKIlBhFI27tlD0/img.png?width=643&amp;amp;height=1076&amp;amp;face=0_0_643_1076,https://scrap.kakaocdn.net/dn/BCzzg/hyXSu9WQCQ/0RiNvkxH2MJXaXpIpqW2jk/img.png?width=2540&amp;amp;height=814&amp;amp;face=0_0_2540_814&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/736&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iamgus.tistory.com/736&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fyxib/hyXSEdGAum/16f5kWfJzuPoTipRJ8ognk/img.png?width=643&amp;amp;height=1076&amp;amp;face=0_0_643_1076,https://scrap.kakaocdn.net/dn/8fDnG/hyXSua4r7u/rB5r4B2rZKIlBhFI27tlD0/img.png?width=643&amp;amp;height=1076&amp;amp;face=0_0_643_1076,https://scrap.kakaocdn.net/dn/BCzzg/hyXSu9WQCQ/0RiNvkxH2MJXaXpIpqW2jk/img.png?width=2540&amp;amp;height=814&amp;amp;face=0_0_2540_814');&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;뉴스 기사 추출하는 코드 만들어 줄래? 1탄 (Chatgpt / Claude)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;네이버 최신 뉴스 헤드라인을 추출해 보자.&amp;nbsp;일반적으로 웹 데이터를 추출하는 것을 웹크롤링이라 한다. 주로 파이썬을 이용해 웹 페이지 분석 후 필요한 데이터를 가져오는 코드를 작성하는데,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iamgus.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/737&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.12.27 - [분류 전체보기] - 뉴스 기사 추출하는 코드 만들어 줄래? 2탄 docker 올려보자&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735382063418&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;뉴스 기사 추출하는 코드 만들어 줄래? 2탄 docker 올려보자&quot; data-og-description=&quot;지난 시간에 인공지능에 지시해 만든 웹 크롤링 프로그램을 docker로 배포해 보자.&amp;nbsp;2024.12.27 - [코드리뷰/chatGPT(Python)코드] - 뉴스 기사 추출하는 코드 만들어 줄래? (Chatgpt / Claude)&amp;nbsp;뉴스 기사 추출하&quot; data-og-host=&quot;iamgus.tistory.com&quot; data-og-source-url=&quot;https://iamgus.tistory.com/737&quot; data-og-url=&quot;https://iamgus.tistory.com/737&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buTdKx/hyXSsdc6aF/pyDuORZM7gEqg0NhQWmR31/img.png?width=800&amp;amp;height=77&amp;amp;face=0_0_800_77,https://scrap.kakaocdn.net/dn/bbj1QD/hyXSsdc6cA/eQXzhkXJ2bKXyDg06ww7Rk/img.png?width=800&amp;amp;height=77&amp;amp;face=0_0_800_77,https://scrap.kakaocdn.net/dn/kFyfm/hyXSs5m7f3/WyiU68HQkHBRtK7V0I5GL0/img.png?width=1478&amp;amp;height=568&amp;amp;face=0_0_1478_568&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/737&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iamgus.tistory.com/737&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buTdKx/hyXSsdc6aF/pyDuORZM7gEqg0NhQWmR31/img.png?width=800&amp;amp;height=77&amp;amp;face=0_0_800_77,https://scrap.kakaocdn.net/dn/bbj1QD/hyXSsdc6cA/eQXzhkXJ2bKXyDg06ww7Rk/img.png?width=800&amp;amp;height=77&amp;amp;face=0_0_800_77,https://scrap.kakaocdn.net/dn/kFyfm/hyXSs5m7f3/WyiU68HQkHBRtK7V0I5GL0/img.png?width=1478&amp;amp;height=568&amp;amp;face=0_0_1478_568');&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;뉴스 기사 추출하는 코드 만들어 줄래? 2탄 docker 올려보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;지난 시간에 인공지능에 지시해 만든 웹 크롤링 프로그램을 docker로 배포해 보자.&amp;nbsp;2024.12.27 - [코드리뷰/chatGPT(Python)코드] - 뉴스 기사 추출하는 코드 만들어 줄래? (Chatgpt / Claude)&amp;nbsp;뉴스 기사 추출하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iamgus.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 하려고 하는 것&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뉴스기사 수집한 결과 파일을 로컬에 복사한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;docker가 생성한 컨테이너 내부에 들어가 보자.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;docker 컨테이너에 로컬 디렉토리를 마운트 시키자.&lt;/li&gt;
&lt;li&gt;표준시간대를 한국시간으로 설정하자.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Actions&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) 뉴스기사 수집 결과 파일 가져오기 (컨테이너 --&amp;gt; 로컬 pc)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2가지 방법이 있다. 하나는 컨테이너에 들어가서 로컬로 카피하는 방법과 처음부터 로컬 디렉터리를 마운트 시키는 방법이다.&amp;nbsp; 전자를 위해서는 약간의 작업이 필요하다. 뉴스기사 크롤링이 끝나면 프로세스가 종료된다. 그러면 컨테이너도 함께 정지하기 때문에 내부에 접속할 수 없다. 그래서 news소스를 수정한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1735382504108&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if __name__ == &quot;__main__&quot;:
    while True:  # 무한 루프
        try:
            headlines_df = get_naver_news_headlines()
            
            ...
            ...
            # 다음 크롤링까지 대기 (예: 1시간)
            time.sleep(3600)  # 3600초 = 1시간
            
        except Exception as e:
            print(f&quot;에러 발생: {e}&quot;)
            time.sleep(300)  # 에러 발생시 5분 대기 후 재시도&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;dockerfile에 컨테이너에 디렉토리가 생성될 수 있도록 코드를 추가한다.&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# output 디렉토리 생성&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;-p&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;/app/output&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;chmod&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;777&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;/app/output&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker 이미지를 만든다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;gt; docker build -t news .&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker 컨테이너를 실행한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;gt; docker run --name news-container news&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;gt; docker ps&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1846&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wnpC8/btsLBKJ3JBm/2R58xDKrhSkbxkWjLqOFDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wnpC8/btsLBKJ3JBm/2R58xDKrhSkbxkWjLqOFDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wnpC8/btsLBKJ3JBm/2R58xDKrhSkbxkWjLqOFDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwnpC8%2FbtsLBKJ3JBm%2F2R58xDKrhSkbxkWjLqOFDK%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;1846&quot; height=&quot;112&quot; data-origin-width=&quot;1846&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너에 접속해 output 파일 조회하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; docker exec -it news-container bash&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; ls output&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lS1aZ/btsLAA2rF4i/Dn1Ljg4Ptozn08Jp05NXq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lS1aZ/btsLAA2rF4i/Dn1Ljg4Ptozn08Jp05NXq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lS1aZ/btsLAA2rF4i/Dn1Ljg4Ptozn08Jp05NXq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlS1aZ%2FbtsLAA2rF4i%2FDn1Ljg4Ptozn08Jp05NXq0%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;1706&quot; height=&quot;109&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 pc에 카피하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;gt; docker cp&amp;nbsp;&amp;nbsp;news-container:/app/output ./output&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;791&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r8ORT/btsLzq7ol2B/bFxgNMF8hCobHR9RGAOgTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r8ORT/btsLzq7ol2B/bFxgNMF8hCobHR9RGAOgTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r8ORT/btsLzq7ol2B/bFxgNMF8hCobHR9RGAOgTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr8ORT%2FbtsLzq7ol2B%2FbFxgNMF8hCobHR9RGAOgTK%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;791&quot; height=&quot;547&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;547&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;&amp;gt; docker stop news-container&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) 뉴스기사 수집 결과 파일 마운트 시키기&amp;nbsp;&lt;/b&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;&amp;gt; docker stop news-container&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;gt; docker run --name news-container -v ${PWD}/output:/app/output -d news&amp;nbsp; &amp;nbsp; (백그라운드에서 수행 -d옵션)&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;1855&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmm0Lu/btsLBxw9N00/94l6Aw5Ia8aJfBAGveJxFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmm0Lu/btsLBxw9N00/94l6Aw5Ia8aJfBAGveJxFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmm0Lu/btsLBxw9N00/94l6Aw5Ia8aJfBAGveJxFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdmm0Lu%2FbtsLBxw9N00%2F94l6Aw5Ia8aJfBAGveJxFk%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;1855&quot; height=&quot;116&quot; data-origin-width=&quot;1855&quot; data-origin-height=&quot;116&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efQxje/btsLASB1GZC/VW9oOF0xeIN73WqeA2H5e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efQxje/btsLASB1GZC/VW9oOF0xeIN73WqeA2H5e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efQxje/btsLASB1GZC/VW9oOF0xeIN73WqeA2H5e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefQxje%2FbtsLASB1GZC%2FVW9oOF0xeIN73WqeA2H5e1%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;841&quot; height=&quot;325&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker 컨테이너 정보 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; docker inspect news-container&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;1157&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oahvZ/btsLAB1m28q/lxEUNHjWT1jzJ4srAzocG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oahvZ/btsLAB1m28q/lxEUNHjWT1jzJ4srAzocG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oahvZ/btsLAB1m28q/lxEUNHjWT1jzJ4srAzocG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoahvZ%2FbtsLAB1m28q%2FlxEUNHjWT1jzJ4srAzocG0%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;1157&quot; height=&quot;374&quot; data-origin-width=&quot;1157&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;컨테이너 상태 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; docker stats&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1511&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S81NP/btsLA6UjVOy/cBDFeWBaRQheytO1ZeKQ3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S81NP/btsLA6UjVOy/cBDFeWBaRQheytO1ZeKQ3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S81NP/btsLA6UjVOy/cBDFeWBaRQheytO1ZeKQ3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS81NP%2FbtsLA6UjVOy%2FcBDFeWBaRQheytO1ZeKQ3K%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;1511&quot; height=&quot;103&quot; data-origin-width=&quot;1511&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 stop&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; docker stop news-container&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2032&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GpEcL/btsLzqGj2Wl/VB6KnWKf13Nwof61ahbfQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GpEcL/btsLzqGj2Wl/VB6KnWKf13Nwof61ahbfQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GpEcL/btsLzqGj2Wl/VB6KnWKf13Nwof61ahbfQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGpEcL%2FbtsLzqGj2Wl%2FVB6KnWKf13Nwof61ahbfQ1%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;2032&quot; height=&quot;239&quot; data-origin-width=&quot;2032&quot; data-origin-height=&quot;239&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>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/738</guid>
      <comments>https://iamgus.tistory.com/738#entry738comment</comments>
      <pubDate>Sat, 28 Dec 2024 20:18:14 +0900</pubDate>
    </item>
    <item>
      <title>뉴스 기사 추출하는 코드 만들어 줄래? 2탄 docker 올려보자</title>
      <link>https://iamgus.tistory.com/737</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지난 시간에 인공지능에 지시해 만든 웹 크롤링 프로그램을 docker로 배포해 보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/736&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.12.27 - [코드리뷰/chatGPT(Python)코드] - 뉴스 기사 추출하는 코드 만들어 줄래? (Chatgpt / Claude)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735291860924&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;뉴스 기사 추출하는 코드 만들어 줄래?  (Chatgpt / Claude)&quot; data-og-description=&quot;네이버 최신 뉴스 헤드라인을 추출해 보자.&amp;nbsp;일반적으로 웹 데이터를 추출하는 것을 웹크롤링이라 한다. 주로 파이썬을 이용해 웹 페이지 분석 후 필요한 데이터를 가져오는 코드를 작성하는데,&quot; data-og-host=&quot;iamgus.tistory.com&quot; data-og-source-url=&quot;https://iamgus.tistory.com/736&quot; data-og-url=&quot;https://iamgus.tistory.com/736&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e5gsX/hyXSzJVjY3/hAp3cKefcGMUBMInS4VTq0/img.png?width=643&amp;amp;height=1076&amp;amp;face=0_0_643_1076,https://scrap.kakaocdn.net/dn/boAW9d/hyXSCGFWIN/7ECtNNeokq57DhRUNMdP5K/img.png?width=643&amp;amp;height=1076&amp;amp;face=0_0_643_1076,https://scrap.kakaocdn.net/dn/djV5NA/hyXSrLTXCN/yeuO9twYW5P0SXmTIiEL4K/img.png?width=2540&amp;amp;height=814&amp;amp;face=0_0_2540_814&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/736&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iamgus.tistory.com/736&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e5gsX/hyXSzJVjY3/hAp3cKefcGMUBMInS4VTq0/img.png?width=643&amp;amp;height=1076&amp;amp;face=0_0_643_1076,https://scrap.kakaocdn.net/dn/boAW9d/hyXSCGFWIN/7ECtNNeokq57DhRUNMdP5K/img.png?width=643&amp;amp;height=1076&amp;amp;face=0_0_643_1076,https://scrap.kakaocdn.net/dn/djV5NA/hyXSrLTXCN/yeuO9twYW5P0SXmTIiEL4K/img.png?width=2540&amp;amp;height=814&amp;amp;face=0_0_2540_814');&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;뉴스 기사 추출하는 코드 만들어 줄래? (Chatgpt / Claude)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;네이버 최신 뉴스 헤드라인을 추출해 보자.&amp;nbsp;일반적으로 웹 데이터를 추출하는 것을 웹크롤링이라 한다. 주로 파이썬을 이용해 웹 페이지 분석 후 필요한 데이터를 가져오는 코드를 작성하는데,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iamgus.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점은 이미지로 배포하고 실행할 때는 컨테이너에 올리기 때문에 호환성 문제와 독립된 환경을 가질 수 있다. 즉, 파이썬 설치하거나 selenium은 같은 패키지 등을 배포하는 작업 없이 docker 이미지에 다 포함시키면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점은 docker를 어느정도 이해하고 있어야 한다. 명령어를 익히고 몇 가지 샘플을 만들어 보는 게 필요하다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. dockerfile 만들기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롤링 소스와 같은 디렉토리에 dockerfile을 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1735290298761&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 베이스 이미지 설정
FROM python:3.10-slim

# 필요한 OS 패키지 설치
RUN apt-get update &amp;amp;&amp;amp; apt-get install -y \
    wget \
    curl \
    unzip \
    chromium-driver \
    &amp;amp;&amp;amp; apt-get clean

# 작업 디렉토리 설정
WORKDIR /app

# Python 의존성 파일 복사 및 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 애플리케이션 소스 복사
COPY . .

# 포트 열기 (선택)
EXPOSE 5000

# 애플리케이션 실행 명령
CMD [&quot;python&quot;, &quot;news_s.py&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. requirements.txt 파일 작성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 크롤링에 사용할 패키지 목록을 작성한다. docker 이미지 생성 시 자동 설치한다. 버전을 명시하지 않으면 최신버전을 받아온다. numpy와 pandas는 버전이 맞지 않으면 에러가 난다. 호환 버전을 명시하는 게 좋다.&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;selenium&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4.10.0&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;numpy&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.23.5&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;pandas&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1.5.3&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;openpyxl&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3.1.2&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 만들어도 된다.&amp;nbsp; &lt;b&gt;pip freeze &amp;gt; requirements.txt&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. docker 이미지 만들기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;docker&amp;nbsp;build&amp;nbsp;-t&amp;nbsp;news-scraper:latest&amp;nbsp;.&lt;/b&gt;&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;4. docer 이미지 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker images&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;991&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nCV5x/btsLBhORL9p/4bsNtkC7gBgPLbulI5TRZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nCV5x/btsLBhORL9p/4bsNtkC7gBgPLbulI5TRZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nCV5x/btsLBhORL9p/4bsNtkC7gBgPLbulI5TRZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnCV5x%2FbtsLBhORL9p%2F4bsNtkC7gBgPLbulI5TRZ0%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;991&quot; height=&quot;104&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. docker 실행하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker&amp;nbsp;run&amp;nbsp;--name&amp;nbsp;news-scraper-container&amp;nbsp;-v&amp;nbsp;${PWD}/output:/app/output&amp;nbsp;news-scraper:latest&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1478&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCG1b1/btsLzZ9mNLm/yPxln2ad51NEhvkYheFsKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCG1b1/btsLzZ9mNLm/yPxln2ad51NEhvkYheFsKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCG1b1/btsLzZ9mNLm/yPxln2ad51NEhvkYheFsKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCG1b1%2FbtsLzZ9mNLm%2FyPxln2ad51NEhvkYheFsKK%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;1478&quot; height=&quot;568&quot; data-origin-width=&quot;1478&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재실행하려면 docker&amp;nbsp;start&amp;nbsp;news-scraper-container&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. docker 컨테이너 확인&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2162&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/claSdK/btsLBxKsBwE/XiqNLQTgv0JXkkkdF21a31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/claSdK/btsLBxKsBwE/XiqNLQTgv0JXkkkdF21a31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/claSdK/btsLBxKsBwE/XiqNLQTgv0JXkkkdF21a31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclaSdK%2FbtsLBxKsBwE%2FXiqNLQTgv0JXkkkdF21a31%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;2162&quot; height=&quot;107&quot; data-origin-width=&quot;2162&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. docker 로그 확인&lt;/h4&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;1336&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cORYGy/btsLAyi2RfU/k7DIznGawjZXnMbJ0wdkek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cORYGy/btsLAyi2RfU/k7DIznGawjZXnMbJ0wdkek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cORYGy/btsLAyi2RfU/k7DIznGawjZXnMbJ0wdkek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcORYGy%2FbtsLAyi2RfU%2Fk7DIznGawjZXnMbJ0wdkek%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;1336&quot; height=&quot;264&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;264&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K35jx/btsLAg39iwT/PKtAHgzQUbO8K4MyOY7610/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K35jx/btsLAg39iwT/PKtAHgzQUbO8K4MyOY7610/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K35jx/btsLAg39iwT/PKtAHgzQUbO8K4MyOY7610/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK35jx%2FbtsLAg39iwT%2FPKtAHgzQUbO8K4MyOY7610%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;1280&quot; height=&quot;262&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. docker 컨테이너 삭제&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker&amp;nbsp;rm&amp;nbsp;news-scraper-container&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9. docker 이미지 삭제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) docker 이미지 id 찾기&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;992&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w4Jqy/btsLAeFkigu/l361uxcbnQrQkPQhTOF2hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w4Jqy/btsLAeFkigu/l361uxcbnQrQkPQhTOF2hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w4Jqy/btsLAeFkigu/l361uxcbnQrQkPQhTOF2hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw4Jqy%2FbtsLAeFkigu%2Fl361uxcbnQrQkPQhTOF2hk%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;992&quot; height=&quot;96&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) docker 이미지 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker&amp;nbsp;rmi&amp;nbsp;d3da5e1f8e0d&lt;/p&gt;</description>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/737</guid>
      <comments>https://iamgus.tistory.com/737#entry737comment</comments>
      <pubDate>Fri, 27 Dec 2024 18:34:31 +0900</pubDate>
    </item>
    <item>
      <title>뉴스 기사 추출하는 코드 만들어 줄래? 1탄 (Chatgpt / Claude)</title>
      <link>https://iamgus.tistory.com/736</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;이런 어렵고 복잡한 부분은 인공지능에게 작업하게 하고 우리는 그 결과에 피드백을 제공하면 원하는 결과물을 얻을 수 있지 않을까 생각한다. 인공지능과의 채팅은 누구든 할 수 있으니 말이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 어떤 데이터를 추출할 것인가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버 뉴스 기사 웹 페이지에 접속해&amp;nbsp; URL 을 카피하자&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; &lt;a href=&quot;https://news.naver.com/section/104&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://news.naver.com/section/104&lt;/a&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;643&quot; data-origin-height=&quot;1076&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z0SSY/btsLzesnOfp/7gPEHYSCqJXrWUlmiO1dxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z0SSY/btsLzesnOfp/7gPEHYSCqJXrWUlmiO1dxK/img.png&quot; data-alt=&quot;네이버 뉴스 헤드랑ㄴ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z0SSY/btsLzesnOfp/7gPEHYSCqJXrWUlmiO1dxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz0SSY%2FbtsLzesnOfp%2F7gPEHYSCqJXrWUlmiO1dxK%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;491&quot; height=&quot;822&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;1076&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네이버 뉴스 헤드랑ㄴ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 웹 페이지 정보 추출 지시 (claude)&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;a href=&quot;https://news.naver.com/section/104&quot;&gt;https://news.naver.com/section/104&lt;/a&gt;&amp;nbsp;웹페이지에서 헤드라인 뉴스 5개 정보를 가져오는 소스를 작성해 줘. 파이썬으로 코드 작성하고 제목/내용/기사링크/이미지링크/출처를 추출해 줘&lt;/blockquote&gt;
&lt;pre id=&quot;code_1735285789152&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime

def get_naver_news_headlines():
    # 네이버 뉴스 세계 섹션 URL
    url = &quot;https://news.naver.com/section/104&quot;
    
    # User-Agent 설정
    headers = {
        &quot;User-Agent&quot;: &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36&quot;
    }
    
    try:
        # 웹페이지 요청
        response = requests.get(url, headers=headers)
        response.raise_for_status()  # 오류 체크
        
        # BeautifulSoup으로 파싱
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 뉴스 항목들을 담을 리스트
        news_items = []
        
        # 메인 뉴스 컨테이너 찾기
        news_list = soup.select('.newspaper_wrp')[:5]  # 상위 5개 뉴스만 가져오기
        
        for item in news_list:
            try:
                # 제목
                title = item.select_one('.newspaper_text').get_text(strip=True)
                
                # 내용 (서브텍스트)
                content = item.select_one('.newspaper_subtext').get_text(strip=True) if item.select_one('.newspaper_subtext') else &quot;내용 없음&quot;
                
                # 링크
                link = &quot;https://news.naver.com&quot; + item.select_one('a')['href']
                
                # 이미지 링크
                img_tag = item.select_one('img')
                image_link = img_tag['src'] if img_tag else &quot;이미지 없음&quot;
                
                # 출처
                source = item.select_one('.newspaper_item_source').get_text(strip=True) if item.select_one('.newspaper_item_source') else &quot;출처 없음&quot;
                
                news_items.append({
                    '제목': title,
                    '내용': content,
                    '링크': link,
                    '이미지_링크': image_link,
                    '출처': source
                })
                
            except AttributeError as e:
                print(f&quot;파싱 오류 발생: {e}&quot;)
                continue
        
        # DataFrame 생성
        df = pd.DataFrame(news_items)
        
        # 결과 출력
        print(&quot;\n=== 네이버 뉴스 헤드라인 ===&quot;)
        for idx, row in df.iterrows():
            print(f&quot;\n[뉴스 {idx+1}]&quot;)
            print(f&quot;제목: {row['제목']}&quot;)
            print(f&quot;내용: {row['내용']}&quot;)
            print(f&quot;링크: {row['링크']}&quot;)
            print(f&quot;이미지: {row['이미지_링크']}&quot;)
            print(f&quot;출처: {row['출처']}&quot;)
            print(&quot;-&quot; * 50)
        
        return df
        
    except requests.RequestException as e:
        print(f&quot;요청 중 오류 발생: {e}&quot;)
        return None

if __name__ == &quot;__main__&quot;:
    headlines_df = get_naver_news_headlines()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드를 복사해 vscode에서 돌렸는데 뉴스 헤드라인을 전혀 가져오지 못했다. 아래 코드가 문제였다. 크롤링을 위한 대상 클래스에 엉뚱한 값이 들어가 있었다. 실제 뉴스기사 웹 페이지에는 newspaper_wrp 클래스가 없었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt; &lt;span style=&quot;color: #abb2bf; text-align: left;&quot;&gt;&lt;span style=&quot;color: #5c6370;&quot;&gt;# 메인 뉴스 컨테이너 찾기&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #abb2bf; text-align: left;&quot;&gt;&lt;span&gt; news_list &lt;/span&gt;&lt;span style=&quot;color: #61afef;&quot;&gt;=&lt;/span&gt;&lt;span&gt; soup&lt;/span&gt;&lt;span style=&quot;color: #abb2bf;&quot;&gt;.&lt;/span&gt;&lt;span&gt;select&lt;/span&gt;&lt;span style=&quot;color: #abb2bf;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #98c379;&quot;&gt;'.newspaper_wrp'&lt;/span&gt;&lt;span style=&quot;color: #abb2bf;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #abb2bf;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #abb2bf;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #d19a66;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #abb2bf;&quot;&gt;]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #5c6370;&quot;&gt;# 상위 5개 뉴스만 가져오기&lt;/span&gt;&lt;/span&gt; &lt;/i&gt;&lt;/b&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;(1) 웹 페이지에서 F12 눌러 개발자 모드로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 헤드라인 뉴스 대상 선정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2ZCqY/btsLAugFBSI/fZupARkZtI4yzLhflemwQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2ZCqY/btsLAugFBSI/fZupARkZtI4yzLhflemwQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2ZCqY/btsLAugFBSI/fZupARkZtI4yzLhflemwQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2ZCqY%2FbtsLAugFBSI%2FfZupARkZtI4yzLhflemwQ0%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;2540&quot; height=&quot;814&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;(3) 소스 카피 (copy element) 후 파일저장&amp;nbsp; (핵심)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by82ev/btsLzeMEAy9/7muN4WaTpyxZiQAeKrHA60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by82ev/btsLzeMEAy9/7muN4WaTpyxZiQAeKrHA60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by82ev/btsLzeMEAy9/7muN4WaTpyxZiQAeKrHA60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby82ev%2FbtsLzeMEAy9%2F7muN4WaTpyxZiQAeKrHA60%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;573&quot; height=&quot;522&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;(4) claude에 첨부파일을 올려 다시 작업지시&amp;nbsp; (핵심)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wyqu0/btsLAW462QG/ofhybxb2fgRSx3XdrFzTg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wyqu0/btsLAW462QG/ofhybxb2fgRSx3XdrFzTg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wyqu0/btsLAW462QG/ofhybxb2fgRSx3XdrFzTg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwyqu0%2FbtsLAW462QG%2Fofhybxb2fgRSx3XdrFzTg1%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;605&quot; height=&quot;395&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(5) claude가 만든 코드&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1735286470518&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTML 문서를 분석해보니 실제 네이버 뉴스의 DOM 구조가 있네요. 이를 바탕으로 더 정확한 크롤링 코드를 작성해드리겠습니다.



```python
import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime

def get_naver_news_headlines():
    # 네이버 뉴스 세계 섹션 URL
    url = &quot;https://news.naver.com/section/104&quot;
    
    # User-Agent 설정
    headers = {
        &quot;User-Agent&quot;: &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36&quot;
    }
    
    try:
        # 웹페이지 요청
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        
        # BeautifulSoup으로 파싱
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 뉴스 항목들을 담을 리스트
        news_items = []
        
        # 상위 5개 뉴스 항목 찾기
        news_list = soup.select('li.sa_item')[:5]
        
        for item in news_list:
            try:
                # 제목 추출
                title = item.select_one('.sa_text_strong').get_text(strip=True)
                
                # 내용 추출
                content = item.select_one('.sa_text_lede').get_text(strip=True)
                
                # 링크 추출 (href 속성)
                link = item.select_one('.sa_text_title')['href']
                
                # 이미지 링크 추출
                img_tag = item.select_one('.sa_thumb img')
                image_link = img_tag['src'] if img_tag else &quot;이미지 없음&quot;
                
                # 출처 추출
                source = item.select_one('.sa_text_press').get_text(strip=True)
                
                news_items.append({
                    '제목': title,
                    '내용': content,
                    '링크': link,
                    '이미지_링크': image_link,
                    '출처': source
                })
                
            except AttributeError as e:
                print(f&quot;파싱 오류 발생: {e}&quot;)
                continue
        
        # DataFrame 생성
        df = pd.DataFrame(news_items)
        
        # 결과 출력
        print(&quot;\n=== 네이버 뉴스 헤드라인 ===&quot;)
        for idx, row in df.iterrows():
            print(f&quot;\n[뉴스 {idx+1}]&quot;)
            print(f&quot;제목: {row['제목']}&quot;)
            print(f&quot;내용: {row['내용']}&quot;)
            print(f&quot;링크: {row['링크']}&quot;)
            print(f&quot;이미지: {row['이미지_링크']}&quot;)
            print(f&quot;출처: {row['출처']}&quot;)
            print(&quot;-&quot; * 50)
        
        return df
        
    except requests.RequestException as e:
        print(f&quot;요청 중 오류 발생: {e}&quot;)
        return None

if __name__ == &quot;__main__&quot;:
    headlines_df = get_naver_news_headlines()

```

주요 변경사항:
1. 실제 DOM 구조에 맞게 선택자 수정:
   - 뉴스 항목: `li.sa_item`
   - 제목: `.sa_text_strong`
   - 내용: `.sa_text_lede`
   - 링크: `.sa_text_title[href]`
   - 이미지: `.sa_thumb img[src]`
   - 출처: `.sa_text_press`

2. 에러 처리 강화:
   - 각 항목별 예외처리
   - 이미지가 없는 경우 처리

이 코드를 실행하면 네이버 뉴스 세계면의 상위 5개 헤드라인을 정확하게 추출할 수 있습니다. 필요한 수정사항이 있으시다면 말씀해 주세요!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(6) 작업 돌려보기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vs code에서 실행하니 이미지 링크 정보 추출 시 에러가 발생한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #262624; color: #e5e5e2; text-align: start;&quot;&gt;에러 디버깅해 줘. C:\Users\gus\Documents\dev\dockerLab&amp;gt; py news.py Traceback (most recent call last): File &quot;C:\Users\gus\Documents\dev\dockerLab\news.py&quot;, line 80, in &amp;lt;module&amp;gt; headlines_df = get_naver_news_headlines() ^^^^^^^^^^^^^^^^^^^^^^^^^^ File &quot;C:\Users\gus\Documents\dev\dockerLab\news.py&quot;, line 42, in get_naver_news_headlines image_link = img_tag['src'] if img_tag else &quot;이미지 없음&quot; ~~~~~~~^^^^^^^ File &quot;C:\Users\gus\Documents\dev\dockerLab\.venv\Lib\site-packages\bs4\element.py&quot;, line 1573, in &lt;/span&gt;&lt;b&gt;getitem&lt;/b&gt;&lt;span style=&quot;background-color: #262624; color: #e5e5e2; text-align: start;&quot;&gt; return self.attrs[key] ~~~~~~~~~~^^^^^ KeyError: 'src'&lt;/span&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;이미지 태그의 속성 접근 부분에서 에러가 발생했네요. 실제 HTML을 보니 이미지가 지연 로딩(lazy loading)되는 구조라 'src' 대신 다른 속성을 사용하고 있습니다. 수정된 코드를 작성해 드리겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가변적이거나 지연되는 경우 beautfiul soup을 이용해 데이터 추출이 어렵다. 그래서 다른 방법을 알려달라고 했더니&amp;nbsp; selenium을 추천한다.&lt;/p&gt;
&lt;pre id=&quot;code_1735286814566&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BeautifulSoup만으로는 지연 로딩된 이미지의 실제 URL을 가져오기가 어렵습니다. 이는 JavaScript가 실행되어야 실제 이미지가 로드되기 때문입니다. 이를 해결하기 위해서는 두 가지 방법을 제안드립니다:

Selenium을 사용하는 방법:

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
import pandas as pd
from datetime import datetime

def get_naver_news_headlines():
    # Chrome WebDriver 설정
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')  # 헤드리스 모드 실행
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-dev-shm-usage')
    
    try:
        # WebDriver 초기화
        driver = webdriver.Chrome(options=options)
        
        # 네이버 뉴스 세계 섹션 접속
        driver.get(&quot;https://news.naver.com/section/104&quot;)
        
        # 이미지가 로드될 때까지 대기 (최대 10초)
        wait = WebDriverWait(driver, 10)
        wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'img._LAZY_LOADING')))
        
        # 뉴스 항목들을 담을 리스트
        news_items = []
        
        # 상위 5개 뉴스 항목 찾기
        news_list = driver.find_elements(By.CSS_SELECTOR, 'li.sa_item:not(.is_blind)')[:5]
        
        for item in news_list:
            try:
                # 제목 추출
                title = item.find_element(By.CSS_SELECTOR, '.sa_text_strong').text
                
                # 내용 추출
                content = item.find_element(By.CSS_SELECTOR, '.sa_text_lede').text
                
                # 링크 추출
                link = item.find_element(By.CSS_SELECTOR, 'a.sa_text_title').get_attribute('href')
                
                # 이미지 링크 추출
                try:
                    img = item.find_element(By.CSS_SELECTOR, 'img._LAZY_LOADING')
                    image_link = img.get_attribute('src')
                except:
                    image_link = &quot;이미지 없음&quot;
                
                # 출처 추출
                source = item.find_element(By.CSS_SELECTOR, '.sa_text_press').text
                
                news_items.append({
                    '제목': title,
                    '내용': content,
                    '링크': link,
                    '이미지_링크': image_link,
                    '출처': source
                })
                
            except Exception as e:
                print(f&quot;파싱 오류 발생: {str(e)}&quot;)
                continue
                
        # WebDriver 종료
        driver.quit()
        
        # DataFrame 생성
        df = pd.DataFrame(news_items)
        
        # 결과 출력
        print(&quot;\n=== 네이버 뉴스 헤드라인 ===&quot;)
        for idx, row in df.iterrows():
            print(f&quot;\n[뉴스 {idx+1}]&quot;)
            print(f&quot;제목: {row['제목']}&quot;)
            print(f&quot;내용: {row['내용']}&quot;)
            print(f&quot;링크: {row['링크']}&quot;)
            print(f&quot;이미지: {row['이미지_링크']}&quot;)
            print(f&quot;출처: {row['출처']}&quot;)
            print(&quot;-&quot; * 50)
        
        return df
        
    except Exception as e:
        print(f&quot;오류 발생: {e}&quot;)
        return None
    finally:
        try:
            driver.quit()
        except:
            pass

if __name__ == &quot;__main__&quot;:
    headlines_df = get_naver_news_headlines()

JavaScript 렌더링 없이 이미지 URL을 추출하는 방법:


네이버 뉴스의 경우, 이미지 URL이 특정 패턴을 따르는 경우가 많습니다
기사 ID를 추출하여 이미지 URL을 구성할 수 있습니다
하지만 이 방법은 네이버의 URL 구조가 변경되면 작동하지 않을 수 있습니다&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;3. 인공지능에게 작업을 효율적으로 시키자.&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;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/736</guid>
      <comments>https://iamgus.tistory.com/736#entry736comment</comments>
      <pubDate>Fri, 27 Dec 2024 17:16:25 +0900</pubDate>
    </item>
    <item>
      <title>Docker 이해하는 세상에서 제일 쉬운 예제 만들기 - 도커허브에 올리기</title>
      <link>https://iamgus.tistory.com/735</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Docker를 언제 어디서든 사용하려면 공유 공간에 이미지를 올려야 한다. 디폴트는 도커허브다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hub.docker.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hub.docker.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734853138148&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;Docker Hub Container Image Library | App Containerization&quot; data-og-description=&quot;Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.&quot; data-og-host=&quot;hub.docker.com&quot; data-og-source-url=&quot;https://hub.docker.com/&quot; data-og-url=&quot;https://hub.docker.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dztZ82/hyXSzhTUso/y5UzZA3X08YkIcNZKmxH7K/img.png?width=3372&amp;amp;height=1896&amp;amp;face=0_0_3372_1896,https://scrap.kakaocdn.net/dn/bFN5cz/hyXOdgv2gS/lYsK2TIjfqslQlXPWYt74k/img.png?width=2560&amp;amp;height=1030&amp;amp;face=0_0_2560_1030,https://scrap.kakaocdn.net/dn/bniR0t/hyXSycefdK/LfTrPCM3H5Bzevkr6YbjyK/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://hub.docker.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hub.docker.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dztZ82/hyXSzhTUso/y5UzZA3X08YkIcNZKmxH7K/img.png?width=3372&amp;amp;height=1896&amp;amp;face=0_0_3372_1896,https://scrap.kakaocdn.net/dn/bFN5cz/hyXOdgv2gS/lYsK2TIjfqslQlXPWYt74k/img.png?width=2560&amp;amp;height=1030&amp;amp;face=0_0_2560_1030,https://scrap.kakaocdn.net/dn/bniR0t/hyXSycefdK/LfTrPCM3H5Bzevkr6YbjyK/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&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;Docker Hub Container Image Library | App Containerization&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hub.docker.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;size18&quot;&gt;&lt;b&gt;1. docker hub login 하기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) docker hub에 사용자 계정을 만든다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) CLI로 docker credential을 생성한다. docker hub id/pwd 인증을 하는 단계로 성공하면 credential이 생성된다. 그다음부터는 인증창 없이 바로 접속된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734855148860&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker login&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;1402&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvwe0Z/btsLtUFJmBj/gqaMPAsXeaNCcODej54hb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvwe0Z/btsLtUFJmBj/gqaMPAsXeaNCcODej54hb0/img.png&quot; data-alt=&quot;docker login&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvwe0Z/btsLtUFJmBj/gqaMPAsXeaNCcODej54hb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvwe0Z%2FbtsLtUFJmBj%2FgqaMPAsXeaNCcODej54hb0%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;1402&quot; height=&quot;325&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker login&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 docker 사이트 링크를 띄워 인증한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ctrl + click&amp;nbsp; -&amp;gt; 브라우저 실행하고 입력창에 코드를 넣고&amp;nbsp; 엔터를 친다. 맞으면 login이 성공한다.&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;608&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgMirZ/btsLrYP4njC/7SU7FZ9CGLY3pwhOKiKg50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgMirZ/btsLrYP4njC/7SU7FZ9CGLY3pwhOKiKg50/img.png&quot; data-alt=&quot;docker login&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgMirZ/btsLrYP4njC/7SU7FZ9CGLY3pwhOKiKg50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgMirZ%2FbtsLrYP4njC%2F7SU7FZ9CGLY3pwhOKiKg50%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;355&quot; height=&quot;473&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker login&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. docker images 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 강좌에서 만든 hello-docker를 이용해 이미지를 만들자. 주의할 점은 docker hub 사용자명과 이미지 버전을 넣어서 만드는 게 좋다. 이를 이해하려면 공유 저장소가 docker hub만 있는 게 아니라 구글이나 아마존, github 등 여러 곳에 올릴 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# docker 이미지를 내리는 명령어다. 레지스트리 주소가 바로 저장소 사이트이다. 생략하면 docker hub 사이트가 디폴트값으로 설정된다.&amp;nbsp;&lt;br /&gt;docker&amp;nbsp;pull&amp;nbsp;[레지스트리주소]/[이미지명]:[태그] &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#&amp;nbsp;예시 &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#&amp;nbsp;Google&amp;nbsp;Container&amp;nbsp;Registry&amp;nbsp;(GCR) &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;docker&amp;nbsp;pull&amp;nbsp;gcr.io/google-containers/nginx:latest &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#&amp;nbsp;Amazon&amp;nbsp;Elastic&amp;nbsp;Container&amp;nbsp;Registry&amp;nbsp;(ECR) &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;docker&amp;nbsp;pull&amp;nbsp;[aws_account_id].dkr.ecr.[region].amazonaws.com/nginx:latest &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#&amp;nbsp;GitHub&amp;nbsp;Container&amp;nbsp;Registry &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;docker&amp;nbsp;pull&amp;nbsp;ghcr.io/OWNER/IMAGE_NAME:latest &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#&amp;nbsp;Azure&amp;nbsp;Container&amp;nbsp;Registry&amp;nbsp;(ACR) &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;docker&amp;nbsp;pull&amp;nbsp;myregistry.azurecr.io/nginx:latest&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker hub에 이미지를 올려 보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) docker hub 사용자명과 버전을 넣어 이미지를 빌드한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734853600790&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build -t user1/hello-docker:v1 .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dockder hub 사용자명 user1과 hello-docker 이미지 버전을 v1으로 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 이미지 확인&lt;/p&gt;
&lt;pre id=&quot;code_1734853757982&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker images&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;951&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AXqOk/btsLsBfVyOH/NZJORubTCLgFnOxuv4Ixh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AXqOk/btsLsBfVyOH/NZJORubTCLgFnOxuv4Ixh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AXqOk/btsLsBfVyOH/NZJORubTCLgFnOxuv4Ixh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAXqOk%2FbtsLsBfVyOH%2FNZJORubTCLgFnOxuv4Ixh1%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;951&quot; height=&quot;127&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 만약 docker hub사용자명과 버전없이 이미지를 생성하면 이미지를 바로 등록할 수 없다. tag 명령어를 이용해 사용자명과 버전을 명시한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker &lt;span style=&quot;color: #f89009;&quot;&gt;tag&lt;/span&gt; hello-docker &lt;span style=&quot;color: #f89009;&quot;&gt;user1&lt;/span&gt;/hello-docker:&lt;span style=&quot;color: #f89009;&quot;&gt;v2&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;3. docker hub에 push하기&amp;nbsp; (docker hub 레지스트리에 이미지 등록하기)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734854132544&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker push jandbond/hello-docker:v1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker hub 사이트에서 이미지 등록 확인하자.&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;1413&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8P8JV/btsLsqFybiV/36S0tEsgOTZxSPXRJtO760/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8P8JV/btsLsqFybiV/36S0tEsgOTZxSPXRJtO760/img.png&quot; data-alt=&quot;docker hub 레지스트리 이미지 등록확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8P8JV/btsLsqFybiV/36S0tEsgOTZxSPXRJtO760/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8P8JV%2FbtsLsqFybiV%2F36S0tEsgOTZxSPXRJtO760%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;1413&quot; height=&quot;263&quot; data-origin-width=&quot;1413&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker hub 레지스트리 이미지 등록확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v2 버전을 하나 더 push하자&lt;/p&gt;
&lt;pre id=&quot;code_1734854269262&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker push jandbond/hello-docker:v2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v2가 올라간 걸 확인하자.&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;1398&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LhV9B/btsLse6hp7v/CoPSNE1KPsCvXe9mdZ3QP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LhV9B/btsLse6hp7v/CoPSNE1KPsCvXe9mdZ3QP1/img.png&quot; data-alt=&quot;docker hub 레지스트리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LhV9B/btsLse6hp7v/CoPSNE1KPsCvXe9mdZ3QP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLhV9B%2FbtsLse6hp7v%2FCoPSNE1KPsCvXe9mdZ3QP1%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;1398&quot; height=&quot;357&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker hub 레지스트리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자, 이제부터 전 세계 사람들이 내가 만든 docker 이미지를 사용할 수 있다. 얼마나 대단한가!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. docker hub에서 이미지 내려받기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 로컬 이미지 확인 : 내려받거나 생성된 이미지가 있으면 삭제하자.&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;860&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qmSkV/btsLrjNWWq5/Ons8237TU3TIhE0WrXizq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qmSkV/btsLrjNWWq5/Ons8237TU3TIhE0WrXizq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qmSkV/btsLrjNWWq5/Ons8237TU3TIhE0WrXizq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqmSkV%2FbtsLrjNWWq5%2FOns8237TU3TIhE0WrXizq0%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;860&quot; height=&quot;64&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 이미지 pull&lt;/p&gt;
&lt;pre id=&quot;code_1734854607255&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull user1/hello-docker:v1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker hub에서 hello-docker v1버전을 내려받는다. docker images 명령어로 확인하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cW8fm2/btsLqBByCEq/K6ZmLfAAz7Ka0Tzgu7AKKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cW8fm2/btsLqBByCEq/K6ZmLfAAz7Ka0Tzgu7AKKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cW8fm2/btsLqBByCEq/K6ZmLfAAz7Ka0Tzgu7AKKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcW8fm2%2FbtsLqBByCEq%2FK6ZmLfAAz7Ka0Tzgu7AKKk%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;976&quot; height=&quot;111&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3) 이미지를 컨테이너에 올려 실행하자&lt;/p&gt;
&lt;pre id=&quot;code_1734854724081&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run user1/hello-docker:v1&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;370&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JV2jK/btsLsLWWykY/1FSYdKI9CPYC9tx21i7pTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JV2jK/btsLsLWWykY/1FSYdKI9CPYC9tx21i7pTk/img.png&quot; data-alt=&quot;docker run 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JV2jK/btsLsLWWykY/1FSYdKI9CPYC9tx21i7pTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJV2jK%2FbtsLsLWWykY%2F1FSYdKI9CPYC9tx21i7pTk%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;370&quot; height=&quot;79&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker run 결과&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;docker 명령어 연습이 필요하면 아래 포스팅 참고하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/734&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.12.22 - [코드리뷰] - Docker 이해하는 세상에서 제일 쉬운 예제 만들기 - 기본 명령어 1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734855552234&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;Docker 이해하는 세상에서 제일 쉬운 예제 만들기 - 기본 명령어 1&quot; data-og-description=&quot;Docker 이해하기 위한 세상에서 제일 간단한 프로그램을 만들어 보자.&amp;nbsp;&amp;quot;Hello, Docker World!&amp;quot;&amp;nbsp; &amp;nbsp; &amp;nbsp;출력하기Docker를 한 줄로 정의하면, 개발, 실행 환경과 관계없이 언제 어디서든 프로그램을 실행할 수&quot; data-og-host=&quot;iamgus.tistory.com&quot; data-og-source-url=&quot;https://iamgus.tistory.com/734&quot; data-og-url=&quot;https://iamgus.tistory.com/734&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2h88i/hyXSv0RZby/m7mfvrIaKWQVycfTOKQHf0/img.png?width=509&amp;amp;height=552&amp;amp;face=0_0_509_552,https://scrap.kakaocdn.net/dn/ED2vH/hyXSpzAy12/N45wN4TxOdz0JDPWQuPDnK/img.png?width=509&amp;amp;height=552&amp;amp;face=0_0_509_552,https://scrap.kakaocdn.net/dn/d78V5h/hyXOktapXz/TXGChLyXCBfUdBKkDsEEQk/img.png?width=509&amp;amp;height=552&amp;amp;face=0_0_509_552&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/734&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iamgus.tistory.com/734&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2h88i/hyXSv0RZby/m7mfvrIaKWQVycfTOKQHf0/img.png?width=509&amp;amp;height=552&amp;amp;face=0_0_509_552,https://scrap.kakaocdn.net/dn/ED2vH/hyXSpzAy12/N45wN4TxOdz0JDPWQuPDnK/img.png?width=509&amp;amp;height=552&amp;amp;face=0_0_509_552,https://scrap.kakaocdn.net/dn/d78V5h/hyXOktapXz/TXGChLyXCBfUdBKkDsEEQk/img.png?width=509&amp;amp;height=552&amp;amp;face=0_0_509_552');&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;Docker 이해하는 세상에서 제일 쉬운 예제 만들기 - 기본 명령어 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker 이해하기 위한 세상에서 제일 간단한 프로그램을 만들어 보자.&amp;nbsp;&quot;Hello, Docker World!&quot;&amp;nbsp; &amp;nbsp; &amp;nbsp;출력하기Docker를 한 줄로 정의하면, 개발, 실행 환경과 관계없이 언제 어디서든 프로그램을 실행할 수&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iamgus.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;</description>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/735</guid>
      <comments>https://iamgus.tistory.com/735#entry735comment</comments>
      <pubDate>Sun, 22 Dec 2024 17:20:49 +0900</pubDate>
    </item>
    <item>
      <title>Docker 이해하는 세상에서 제일 쉬운 예제 만들기 - 기본 명령어 1</title>
      <link>https://iamgus.tistory.com/734</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 이해하기 위한 세상에서 제일 간단한 프로그램을 만들어 보자.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&quot;Hello, Docker World!&quot;&amp;nbsp; &amp;nbsp; &amp;nbsp;출력하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker를 한 줄로 정의하면, 개발, 실행 환경과 관계없이 언제 어디서든 프로그램을 실행할 수 있고 같은 결과를 가져오는 일종의 가상환경이다. 개발환경과 실행가능한 바이너리/라이브러리까지 모두 하나의 이미지로 만들고 필요할 때 도커에 컨테이너로 구성해 사용한다. 일반적인 가상화 컴퓨팅보다 훨씬 효율적으로 자원을 사용하며 사용법이 간단한다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 만들어 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Docker 설치하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.docker.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.docker.com/&lt;/a&gt;&amp;nbsp; &amp;nbsp;접속해 자신의 OS에 맞는 설치파일을 다운로드하여 설치한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbge2p/btsLtfwKl4N/GIaSlvuDLy2K9HjlP50DL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbge2p/btsLtfwKl4N/GIaSlvuDLy2K9HjlP50DL1/img.png&quot; data-alt=&quot;docker 설치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbge2p/btsLtfwKl4N/GIaSlvuDLy2K9HjlP50DL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbge2p%2FbtsLtfwKl4N%2FGIaSlvuDLy2K9HjlP50DL1%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;509&quot; height=&quot;552&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. docker에서 실행할 간단한 프로그램을 만들자.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734847957120&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;Hello, Docker World!&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 소스로 만든 &quot;Hello~&quot; 출력문이다.&amp;nbsp; hello.py로 저장하고&amp;nbsp; py hello.py로 실행해 보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. docker 이미지 설정파일 작성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734847903426&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.8-slim
WORKDIR /app
COPY hello.py .
CMD [&quot;python&quot;, &quot;hello.py&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dockerfile 이름으로 파일을 생성하고 hello.py파일을 실행하게 한다. docker에 pyhone설치, 워킹디렉터리, 대상소스 복사해 python으로 실행하게 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. docker 이미지 만들기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734848261489&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build -t hello-docker .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-t: 이미지의 태그(이름)를 지정&lt;/li&gt;
&lt;li&gt;.: 현재 디렉토리의 Dockerfile 사용&lt;/li&gt;
&lt;li&gt;실행 결과: &quot;hello-docker&quot;라는 이름의 이미지가 생성됨&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1734848339100&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker images&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬에 있는 모든 도커 이미지 목록을 보여줌&lt;/li&gt;
&lt;li&gt;hello-docker 이미지가 목록에 표시됨&lt;/li&gt;
&lt;/ul&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;867&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eqsRv3/btsLqNBODu9/EMBXuXQIM6irqb5WcIv7x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eqsRv3/btsLqNBODu9/EMBXuXQIM6irqb5WcIv7x1/img.png&quot; data-alt=&quot;docker 이미지 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eqsRv3/btsLqNBODu9/EMBXuXQIM6irqb5WcIv7x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeqsRv3%2FbtsLqNBODu9%2FEMBXuXQIM6irqb5WcIv7x1%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;867&quot; height=&quot;112&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker 이미지 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5. docker 이미지로 컨테이너를 실행해 보자.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734848473502&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run hello-docker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생성한 이미지로 컨테이너를 실행&lt;/li&gt;
&lt;li&gt;&quot;Hello, Docker World!&quot; 메시지가 출력됨&lt;/li&gt;
&lt;li&gt;프로그램 실행 후 컨테이너는 자동으로 종료됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8i94c/btsLqQkY7Mo/KLbW7c5hsN7LmZ1qB7mETk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8i94c/btsLqQkY7Mo/KLbW7c5hsN7LmZ1qB7mETk/img.png&quot; data-alt=&quot;docker 이미지 컨테이너로 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8i94c/btsLqQkY7Mo/KLbW7c5hsN7LmZ1qB7mETk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8i94c%2FbtsLqQkY7Mo%2FKLbW7c5hsN7LmZ1qB7mETk%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;912&quot; height=&quot;78&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker 이미지 컨테이너로 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734848560019&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 컨테이너 표시 (중지된 것 포함)&lt;/li&gt;
&lt;li&gt;방금 실행했던 hello-docker 컨테이너가 'Exited' 상태로 보임&lt;/li&gt;
&lt;/ul&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;1520&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I2t03/btsLsekR66E/i0W9GUtiwHPEkL6hlXUy5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I2t03/btsLsekR66E/i0W9GUtiwHPEkL6hlXUy5K/img.png&quot; data-alt=&quot;dockder ps -a&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I2t03/btsLsekR66E/i0W9GUtiwHPEkL6hlXUy5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI2t03%2FbtsLsekR66E%2Fi0W9GUtiwHPEkL6hlXUy5K%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;1520&quot; height=&quot;109&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dockder ps -a&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;6. 컨테이너 삭제하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734848730073&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker rm [컨테이너ID]&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;1174&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NoPp0/btsLs1SRN4A/IttkAW8c5yUM4RkSUAPFek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NoPp0/btsLs1SRN4A/IttkAW8c5yUM4RkSUAPFek/img.png&quot; data-alt=&quot;docker 컨테이너 삭제하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NoPp0/btsLs1SRN4A/IttkAW8c5yUM4RkSUAPFek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNoPp0%2FbtsLs1SRN4A%2FIttkAW8c5yUM4RkSUAPFek%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;1174&quot; height=&quot;136&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker 컨테이너 삭제하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;7. 이미지 삭제하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734848787523&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker rmi hello-docker&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;hello-docker 이미지를 삭제&lt;/li&gt;
&lt;/ul&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;1111&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/poQBp/btsLs1SRRxt/rTCrT7g6EUehYNQHGi7buk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/poQBp/btsLs1SRRxt/rTCrT7g6EUehYNQHGi7buk/img.png&quot; data-alt=&quot;docker 이미지 삭제 명령어&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/poQBp/btsLs1SRRxt/rTCrT7g6EUehYNQHGi7buk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpoQBp%2FbtsLs1SRRxt%2FrTCrT7g6EUehYNQHGi7buk%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;1111&quot; height=&quot;114&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker 이미지 삭제 명령어&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코드리뷰</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/734</guid>
      <comments>https://iamgus.tistory.com/734#entry734comment</comments>
      <pubDate>Sun, 22 Dec 2024 15:33:21 +0900</pubDate>
    </item>
    <item>
      <title>오늘의 뉴스 헤드라인 추출하기 - 도커와 파이썬 크롤러</title>
      <link>https://iamgus.tistory.com/733</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;b&gt;1. 파이썬 코드 (뉴스 크롤링)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734174368738&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup

def fetch_headlines():
    url = &quot;https://news.naver.com/section/104&quot;
    headers = {
        &quot;User-Agent&quot;: &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36&quot;
    }
    response = requests.get(url, headers=headers)
    response.raise_for_status()  # HTTP 요청이 성공했는지 확인

    soup = BeautifulSoup(response.text, &quot;html.parser&quot;)

    # 결과를 저장할 리스트
    news_headlines = []

    # 헤드라인 리스트 추출
    headline_items = soup.find_all('li', class_='sa_item _SECTION_HEADLINE')
    try:
        for item in headline_items:
            title_tag = item.find('a', class_='sa_text_title')
            press_tag = item.find('div', class_='sa_text_press')
            lede_tag = item.find('div', class_='sa_text_lede')
            
            if title_tag:
                title = title_tag.get_text(strip=True)  # 제목 추출
                link = title_tag['href']  # 링크 추출
            else:
                title, link = None, None
            
            press = press_tag.get_text(strip=True) if press_tag else None  # 언론사 추출
            lede = lede_tag.get_text(strip=True) if lede_tag else None  # 리드 내용 추출
            
            news_headlines.append({
                &quot;title&quot;: title,
                &quot;link&quot;: link,
                &quot;press&quot;: press,
                &quot;lede&quot;: lede
            })
        return news_headlines
    except requests.exceptions.RequestException as e:
        print(f&quot;HTTP 요청 중 오류 발생: {e}&quot;)
        return []

    


if __name__ == &quot;__main__&quot;:
    headlines = fetch_headlines()
    if headlines:
        print(&quot;헤드라인 뉴스:&quot;)
        for idx, lines in enumerate(headlines, start=1):
            print(f&quot;{idx}:{lines['title']}-{lines['press']}&quot;)
            print(f&quot;링크: {lines['link']}&quot;)
            print(f&quot;리드: {lines['lede']}\n&quot;)
    else:
        print(&quot;뉴스를 가져오지 못했습니다.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 파이썬 모듈 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;requirements.txt 파일을 만들어 크롤링에 필요한 requests, beautifulsoup4를 추가한다.&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;354&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czEVo8/btsLifyCONc/QLckZ5f3SVybhEr4DyqEEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czEVo8/btsLifyCONc/QLckZ5f3SVybhEr4DyqEEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czEVo8/btsLifyCONc/QLckZ5f3SVybhEr4DyqEEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczEVo8%2FbtsLifyCONc%2FQLckZ5f3SVybhEr4DyqEEK%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;354&quot; height=&quot;152&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.docker 환경 파일&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734174492433&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Python 베이스 이미지
FROM python:3.10-slim

# 작업 디렉토리 생성
WORKDIR /app

# 종속성 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 크롤러 복사
COPY . .

# 실행 명령 설정
CMD [&quot;python&quot;, &quot;news.py&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 도커 이미지 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n-news-crawler 이름으로 크롤링 프로그램을 저장한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker&amp;nbsp;build&amp;nbsp;-t&amp;nbsp;n-news-crawler&amp;nbsp;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 도커 컨테이너 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;docker run --rm n-news-crawler&amp;nbsp; &amp;nbsp; # n-news-crawler를 도커에서 가져와 실행하고 완료되면 지운다.&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;1430&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpjMQn/btsLiKkt2C9/umHiKgqrRM5Ox4pstWodk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpjMQn/btsLiKkt2C9/umHiKgqrRM5Ox4pstWodk1/img.png&quot; data-alt=&quot;도커 실행화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpjMQn/btsLiKkt2C9/umHiKgqrRM5Ox4pstWodk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpjMQn%2FbtsLiKkt2C9%2FumHiKgqrRM5Ox4pstWodk1%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;1430&quot; height=&quot;516&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;도커 실행화면&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/733</guid>
      <comments>https://iamgus.tistory.com/733#entry733comment</comments>
      <pubDate>Sat, 14 Dec 2024 20:20:12 +0900</pubDate>
    </item>
    <item>
      <title>쿠바네티스 hello world 페이지 만들기</title>
      <link>https://iamgus.tistory.com/732</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지난 시간에 쿠바네티스 환경 구축 및 간단한 서비스를 만들어 보았다. 이번에는 한 걸음 더 들어가서 웹 사이트에 접속해 hello world가 출력되는 페이지를 만들어 보자. 함께 따라 해보면 쿠바네티스 돌아가는 원리가 보일 것이다.&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;a href=&quot;https://iamgus.tistory.com/731&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.12.01 - [코드리뷰] - 내 PC에 도커와 쿠바네티스 구축하기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1733664955316&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;내 PC에 도커와 쿠바네티스 구축하기&quot; data-og-description=&quot;가상화 개발이 기본인 세상이다. 도커와 쿠바네티스를 모른다면 클라우드 개발이 불가능하다는 인식을 가져야 한다. 쉬운 이해를 위해 내 pc에 도커와 쿠바네티스를 설치하고 nginx 웹서버를 구&quot; data-og-host=&quot;iamgus.tistory.com&quot; data-og-source-url=&quot;https://iamgus.tistory.com/731&quot; data-og-url=&quot;https://iamgus.tistory.com/731&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b6hB2I/hyXGLdNpzA/0rUThto9nUPHCwGjEbtUOK/img.png?width=800&amp;amp;height=849&amp;amp;face=0_0_800_849,https://scrap.kakaocdn.net/dn/bqjIfk/hyXGLSqJwA/rNCXKd70j07xkTgGk3Bnb0/img.png?width=800&amp;amp;height=849&amp;amp;face=0_0_800_849,https://scrap.kakaocdn.net/dn/bIdoW3/hyXKu2u1I7/gQylap3AqYrgBGQ9qQdVm0/img.png?width=839&amp;amp;height=891&amp;amp;face=0_0_839_891&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/731&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iamgus.tistory.com/731&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b6hB2I/hyXGLdNpzA/0rUThto9nUPHCwGjEbtUOK/img.png?width=800&amp;amp;height=849&amp;amp;face=0_0_800_849,https://scrap.kakaocdn.net/dn/bqjIfk/hyXGLSqJwA/rNCXKd70j07xkTgGk3Bnb0/img.png?width=800&amp;amp;height=849&amp;amp;face=0_0_800_849,https://scrap.kakaocdn.net/dn/bIdoW3/hyXKu2u1I7/gQylap3AqYrgBGQ9qQdVm0/img.png?width=839&amp;amp;height=891&amp;amp;face=0_0_839_891');&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;내 PC에 도커와 쿠바네티스 구축하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;가상화 개발이 기본인 세상이다. 도커와 쿠바네티스를 모른다면 클라우드 개발이 불가능하다는 인식을 가져야 한다. 쉬운 이해를 위해 내 pc에 도커와 쿠바네티스를 설치하고 nginx 웹서버를 구&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iamgus.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬에 쿠바네티스를 올리고 hello world 페이지를 위한 서비스를 등록하자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. &lt;span&gt;Deployment &lt;/span&gt;&lt;span&gt;생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nginx-deployment.yaml 파일로 저장한다. 쿠바네티스에 올라갈 deploy yaml파일이다. 이 코드에서 핵심은 configMap을 설정하는 거다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;volumes&lt;/span&gt;&lt;span style=&quot;color: #686868;&quot;&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #686868;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #686868;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #894d34;&quot;&gt;index-html&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #686868;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;configMap&lt;/span&gt;&lt;span style=&quot;color: #686868;&quot;&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #686868;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #686868;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #894d34;&quot;&gt;nginx-hello-config&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733665048526&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		apiVersion: apps/v1
		kind: Deployment
		metadata:
		  name: nginx-hello
		spec:
		  replicas: 3
		  selector:
		    matchLabels:
		      app: nginx-hello
		  template:
		    metadata:
		      labels:
		        app: nginx-hello
		    spec:
		      containers:
		      - name: nginx-hello
		        image: nginx:latest
		        ports:
		        - containerPort: 80
		        volumeMounts:
		        - name: index-html
		          mountPath: /usr/share/nginx/html
		      volumes:
		      - name: index-html
		        configMap:
          name: nginx-hello-config&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. configMap 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;nginx-configmap.yaml 파일로 저장하자. 2개의 html페이지를 포함한다. index.html과 about.html이다. 전자는 웹 사이트 디폴트 페이즈, 즉 도메인 접속했을 때 나오는 첫 번째 페이지다. &lt;/span&gt;Hello, Kubernetes World! &lt;span&gt;를 웹 페이지 출력한다. 그 아래 웹 링크를 추가해 클릭하면 about.html로 이동한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733665247393&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		apiVersion: v1
		kind: ConfigMap
		metadata:
		  name: nginx-hello-config
		data:
		  index.html: |
		    &amp;lt;!DOCTYPE html&amp;gt;
		    &amp;lt;html&amp;gt;
		    &amp;lt;head&amp;gt;
		        &amp;lt;title&amp;gt;Hello World&amp;lt;/title&amp;gt;
		        &amp;lt;style&amp;gt;
		            body { 
		                font-family: Arial, sans-serif; 
		                display: flex;
		                justify-content: center;
		                align-items: center;
		                height: 100vh;
		                margin: 0;
		                background-color: #f0f0f0;
		            }
		            .container {
		                text-align: center;
		                background-color: white;
		                padding: 30px;
		                border-radius: 10px;
		                box-shadow: 0 4px 6px rgba(0,0,0,0.1);
		            }
		        &amp;lt;/style&amp;gt;
		    &amp;lt;/head&amp;gt;
		    &amp;lt;body&amp;gt;
		        &amp;lt;div class=&quot;container&quot;&amp;gt;
		            &amp;lt;h1&amp;gt;Hello, Kubernetes World!&amp;lt;/h1&amp;gt;
		            &amp;lt;p&amp;gt;&amp;lt;a href=&quot;/about.html&quot;&amp;gt;About Us&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
		        &amp;lt;/div&amp;gt;
		    &amp;lt;/body&amp;gt;
		    &amp;lt;/html&amp;gt;
		  about.html: |
		    &amp;lt;!DOCTYPE html&amp;gt;
		    &amp;lt;html&amp;gt;
		    &amp;lt;head&amp;gt;
		        &amp;lt;title&amp;gt;About&amp;lt;/title&amp;gt;
		    &amp;lt;/head&amp;gt;
		    &amp;lt;body&amp;gt;
		        &amp;lt;h1&amp;gt;About Us&amp;lt;/h1&amp;gt;
		        &amp;lt;p&amp;gt;This is the about page.&amp;lt;/p&amp;gt;
		    &amp;lt;/body&amp;gt;
		    &amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. &lt;span&gt;Service &lt;/span&gt;&lt;span&gt;생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nginx-service.yaml 파일로 저장한다. 웹 페이지 접속을 위한 port를 지정한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1733665468920&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		apiVersion: v1
		kind: Service
		metadata:
		  name: nginx-hello-nodeport
		spec:
		  type: NodePort
		  ports:
		  - port: 80
		    targetPort: 80
		    # 30000-32767 범위의 포트를 지정할 수 있습니다.
		    # 명시하지 않으면 쿠버네티스가 자동으로 할당합니다.
		    # nodePort: 30080
		  selector:
		    app: nginx-hello&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;4. 배포 및 확인 단계&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;powershell이나 cmd창에서 yaml파일을 등록한다. 실제 쿠바네티스에 리소스를 올리는 단계다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# &lt;/span&gt;&lt;span&gt;리소스 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl apply -f nginx-deployment.yaml&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl apply -f nginx-configmap.yaml&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl apply -f nginx-service.yaml&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;span&gt;# &lt;/span&gt;&lt;span&gt;배포 상태 확인&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl get deployments&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl get services&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl get pods&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;&lt;span&gt;5. Port forwarding&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 pc환경에서 쿠바네티스를 돌리면 필수 작업이다. 명시적으로 지정하지 않으면 접속이 되지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl port-forward service/nginx-hello-nodeport 30805:80&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. 웹 사이트 접속 - 출력 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:30805&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;472&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nPKn5/btsLbb20GLp/pfLL7XBoqJwfePoT9ow91k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nPKn5/btsLbb20GLp/pfLL7XBoqJwfePoT9ow91k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nPKn5/btsLbb20GLp/pfLL7XBoqJwfePoT9ow91k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnPKn5%2FbtsLbb20GLp%2FpfLL7XBoqJwfePoT9ow91k%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;472&quot; height=&quot;412&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;412&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>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/732</guid>
      <comments>https://iamgus.tistory.com/732#entry732comment</comments>
      <pubDate>Sun, 8 Dec 2024 22:52:13 +0900</pubDate>
    </item>
    <item>
      <title>내 PC에 도커와 쿠바네티스 구축하기</title>
      <link>https://iamgus.tistory.com/731</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;가상화 개발이 기본인 세상이다. 도커와 쿠바네티스를 모른다면 클라우드 개발이 불가능하다는 인식을 가져야 한다. 쉬운 이해를 위해 내 pc에 도커와 쿠바네티스를 설치하고 nginx 웹서버를 구축해보았다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Kubernetes&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;nginx &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;웹서버&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;구성하기]&lt;/span&gt;&lt;/h2&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;839&quot; data-origin-height=&quot;891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U928T/btsK4rjBbxN/xAQ8ZAaBuWwNP0Phg6IKkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U928T/btsK4rjBbxN/xAQ8ZAaBuWwNP0Phg6IKkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U928T/btsK4rjBbxN/xAQ8ZAaBuWwNP0Phg6IKkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU928T%2FbtsK4rjBbxN%2FxAQ8ZAaBuWwNP0Phg6IKkk%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;839&quot; height=&quot;891&quot; data-origin-width=&quot;839&quot; data-origin-height=&quot;891&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/r1R7u/btsK4hBtBva/VEucJD7lE16jYJYkKNPG31/%EB%82%B4%20%EB%85%B8%ED%8A%B8%EB%B6%81%EC%97%90%20Kubernetes%20%ED%99%98%EA%B2%BD%20%EA%B5%AC%EC%84%B1.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;내 노트북에 Kubernetes 환경 구성.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.25MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/731</guid>
      <comments>https://iamgus.tistory.com/731#entry731comment</comments>
      <pubDate>Sun, 1 Dec 2024 19:57:09 +0900</pubDate>
    </item>
    <item>
      <title>코드 한 줄로 프로그램 배포하기</title>
      <link>https://iamgus.tistory.com/730</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 초보자를 위한 나만의 쿠팡 크롤러 UI 만들기&amp;nbsp; 다섯번 영상입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;배포하기-001.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzwPud/btsKbVf0Rl3/wX54RAGSsrxAUxpqR8K3F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzwPud/btsKbVf0Rl3/wX54RAGSsrxAUxpqR8K3F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzwPud/btsKbVf0Rl3/wX54RAGSsrxAUxpqR8K3F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzwPud%2FbtsKbVf0Rl3%2FwX54RAGSsrxAUxpqR8K3F1%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;1280&quot; height=&quot;720&quot; data-filename=&quot;배포하기-001.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 영상을 끝까지 보고나면 파이썬이 설치되어 있지 않은 컴퓨터에서도 프로그램을 실행할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;바로 exe 실행 파일이 만들어 집니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://youtu.be/oLWZoKGpznw&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/oLWZoKGpznw&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=oLWZoKGpznw&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/wtbNZ/hyXlN2dngn/dqcbcc13SmSxFiuVDRAtpk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/fXfDA/hyXhJ1vybX/Y4KeSkcm5ScKopWCNEW5kK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;코드 한 줄로 내 프로그램 배포할 수 있어?&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/oLWZoKGpznw&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 크롤러 소스코드입니다. 조금씩 고도화하고 있어요.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1729257786307&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tkinter as tk
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import tkinter.messagebox as msg
from datetime import datetime
from tkinter import ttk
import csv
from threading import Thread

# 키보드(엔터) 입력 처리
def on_enter_key(event):
    btnSearch.invoke()

# Selenium 설정 함수
def setup_selenium():
    chrome_options = Options()
    chrome_options.add_argument(&quot;--headless&quot;)  # 헤드리스 모드 설정
    chrome_options.add_argument(&quot;--no-sandbox&quot;)  # 리눅스 환경에서 필요할 수 있는 옵션
    chrome_options.add_argument(&quot;--disable-dev-shm-usage&quot;)  # 메모리 부족 문제 해결을 위한 옵션
    chrome_options.add_argument(&quot;--disable-gpu&quot;)  # GPU 비활성화 (옵션)
    chrome_options.add_argument(&quot;--window-size=300,200&quot;)
    # chrome_options.add_argument(&quot;--no-startup-window&quot;)  # 브라우저 시작시 화면이 나타나지 않게 함
    chrome_options.add_argument(
        &quot;user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&quot;
        )  # User-Agent 설정

    driver = webdriver.Chrome(options=chrome_options)
    return driver

# 상품 검색
def crawl_website() :
    # 진행 상태 초기화
    progress_var.set(0)
    # loading_bar.pack(fill=tk.X, expand=True, padx=10)
    loading_bar.pack(fill=tk.X, padx=5,pady=7)
    loading_bar.start()
    # 리스트 삭제 
    for item in result_tree.get_children():
        result_tree.delete(item)
    keyword = entKeyword.get()

    # 웹 드라이버 시작
    driver = setup_selenium()
    driver.get (f&quot;https://www.coupang.com/np/search?q={keyword}&quot;)
    driver.implicitly_wait(5)
    results = driver.find_elements(By.CLASS_NAME, &quot;descriptions-inner&quot;)
    # 페이지 제목 출력
    print(driver.title + &quot;-&quot; + str(len(results)))
    for rank, r in enumerate(results,1) :
        max_cnt = 20 # 최대 검색건수
        if rank &amp;gt; 20 : break
        try :
            name = r.find_element(By.CLASS_NAME, &quot;name&quot;)
            price = r.find_element(By.CLASS_NAME, &quot;price&quot;)
            
            sale_price = price.find_element(By.CLASS_NAME, &quot;sale&quot;)
            if sale_price :
                last_price = sale_price.find_element(By.CLASS_NAME,&quot;price-value&quot;)
                print(f&quot;{rank}위 {name.text} {last_price.text}&quot;)
                result_tree.insert('', tk.END, values=(rank,name.text,last_price.text) )
            else :
                base_price = price.find_element(By.CLASS_NAME,&quot;price-info&quot;)
                print(f&quot;{rank}위 {name.text}  {base_price.text} &quot;)
                result_tree.insert('',tk.END, values=(rank,name.text,base_price.text) )
            
            # result_tree.update_idletasks() # UI 즉시 업데이트
            progress_var.set(rank / max_cnt * 100)  # 진행률 업데이트

        except :
            print(f&quot;skip&quot;)
    driver.quit()
    loading_bar.stop()
    loading_bar.pack_forget()
# 검색결과 treeview 입력 중지
def btn_exit_click() :
    win.quit()

# 파일 저장
def save_file():
    if len(result_tree.get_children()) == 0 : 
        msg.showwarning(&quot;저장&quot;,&quot;저장할 데이터가 없습니다.&quot;)
        return
    &quot;&quot;&quot;Treeview의 모든 항목을 CSV 파일로 저장&quot;&quot;&quot;
    now = datetime.now()
    file_name = entKeyword.get() + &quot;_&quot; + now.strftime(&quot;%y%m%d_%H%M&quot;)
    
    with open(f&quot;./data/{file_name}.csv&quot;, mode='w', newline='', encoding='euc-kr') as file:
        writer = csv.writer(file)
        # 열 제목 추가
        writer.writerow([&quot;순위&quot;, &quot;상품명&quot;, &quot;가격&quot;])
        
        for item in result_tree.get_children():
            writer.writerow(result_tree.item(item)[&quot;values&quot;])  # 항목의 값을 가져와서 저장
            
    msg.showinfo(&quot;저장 완료&quot;, f&quot;검색결과를 '{file_name}.csv'로 저장하였습니다.&quot;)

# 스레드를 사용해 크롤링 실행
def start_crawling():
    thread = Thread(target=crawl_website)
    thread.start()

# 메인 윈도우 설정
win = tk.Tk()
win.geometry(&quot;600x550&quot;)
win.title(&quot;쿠팡 크롤러&quot;)

# 스타일 설정
style = ttk.Style()
style.configure(&quot;TButton&quot;, font=(&quot;맑은 고딕&quot;, 12), padding=4)
style.configure(&quot;TLabel&quot;, font=(&quot;맑은 고딕&quot;, 12))
style.configure(&quot;TEntry&quot;, font=(&quot;맑은 고딕&quot;, 12), padding=4, relief=&quot;solid&quot;)

# 검색 필드 프레임(위)
top_frame = ttk.Frame(win)
top_frame.pack(side=tk.TOP, pady=10)

lblKeyword = ttk.Label(top_frame,text=&quot;Keyword&quot;)
lblKeyword.pack(side=tk.LEFT, padx=10)

entKeyword = ttk.Entry(top_frame,width=30)
entKeyword.pack(side=tk.LEFT, padx=10)
entKeyword.focus() 
entKeyword.bind(&quot;&amp;lt;Return&amp;gt;&quot;,on_enter_key)

btnSearch = ttk.Button(top_frame, text=&quot;쿠팡검색&quot;)
btnSearch.config(command=start_crawling)
btnSearch.pack(side=tk.LEFT, padx=10)

# 로딩 스피너 (진행 바)
loading_bar = ttk.Progressbar(top_frame, mode='indeterminate')
# loading_bar.pack(pady=5)

# 검색 결과 프레임(중간)
result_frame = ttk.Frame(win)
result_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

columns = (&quot;순위&quot;,&quot;상품명&quot;,&quot;가격&quot;)
result_tree = ttk.Treeview(result_frame, columns=columns, show=&quot;headings&quot;)
result_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
result_tree.heading(&quot;순위&quot;, text=&quot;순위&quot;)
result_tree.column(&quot;순위&quot;,width=50,stretch=False, anchor=tk.E)
result_tree.heading(&quot;상품명&quot;, text=&quot;상품명&quot;)
result_tree.column(&quot;상품명&quot;,stretch=True, anchor=tk.W)
result_tree.heading(&quot;가격&quot;, text=&quot;가격&quot;)
result_tree.column(&quot;가격&quot;,width=100,stretch=False, anchor=tk.E)

scrollbar_y = ttk.Scrollbar(result_frame,orient=tk.VERTICAL,command=result_tree.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
result_tree.config(yscrollcommand=scrollbar_y.set)

# Progressbar 생성
progress_var = tk.DoubleVar()  # 진행 상태 값을 저장할 변수
progress_bar = ttk.Progressbar(win, orient=&quot;horizontal&quot;, length=400, mode=&quot;determinate&quot;, variable=progress_var)
progress_bar.pack(pady=2, side=tk.TOP, fill=tk.X, padx=20)

# 버튼 프레임 (하단 배치)
button_frame = ttk.Frame(win)
button_frame.pack(side=tk.TOP, pady=2)

btnSave = ttk.Button(button_frame,text=&quot;파일저장&quot;)
btnSave.config(command=save_file)
btnSave.pack(side=tk.LEFT, pady=2)

btnStop = ttk.Button(button_frame, text=&quot;종료&quot;)
btnStop.config(command=btn_exit_click)
btnStop.pack(side=tk.RIGHT, pady=2)



win.mainloop()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/730</guid>
      <comments>https://iamgus.tistory.com/730#entry730comment</comments>
      <pubDate>Fri, 18 Oct 2024 22:21:45 +0900</pubDate>
    </item>
    <item>
      <title>아이폰은 왜 잘 팔릴까? 심플한 UI 만들기 5단계 비법 공개</title>
      <link>https://iamgus.tistory.com/729</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;초보자도 10분 만에 나만의 쿠팡 크롤링 UI를 만들 수 있는 방법을 소개합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; letter-spacing: 0px;&quot;&gt;네 번째 강좌로 폼나는 UI 만드는 5단계 비법을 알려 드릴게요.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; letter-spacing: 0px;&quot;&gt;&lt;a href=&quot;https://youtu.be/jcY0NrvbXWI&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/jcY0NrvbXWI&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=jcY0NrvbXWI&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/lMTXt/hyXd79kwP4/LsHwhMnNzhQL60b1ks90xK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/qdadN/hyXd5ckT5N/IA5TW7Kv2Xo9h928IzZcKK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;아이폰은 왜 잘 팔릴까? 심플한 UI 만들기 5단계 비법 공개&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/jcY0NrvbXWI&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/729</guid>
      <comments>https://iamgus.tistory.com/729#entry729comment</comments>
      <pubDate>Sat, 12 Oct 2024 14:31:04 +0900</pubDate>
    </item>
    <item>
      <title>클릭 한 번으로 쿠팡에서 잘 팔리는 노트북 TOP 10  리스트  저장하기</title>
      <link>https://iamgus.tistory.com/728</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;파이썬 tkinter를 이용한 UI 만들기 세 번째 영상입니다. 쿠팡 크롤러가 수집한 인기상품 TOP 10 리스트를 내 PC에 저장하는 방법을 알려 드립니다. 초보자도 쉽게 이해할 수 있도록 코드별 자세하게 설명합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.파일저장_썸네일.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnotH1/btsJV77CcvL/kvoKs7ADijqOK4rZrHe5Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnotH1/btsJV77CcvL/kvoKs7ADijqOK4rZrHe5Jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnotH1/btsJV77CcvL/kvoKs7ADijqOK4rZrHe5Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnotH1%2FbtsJV77CcvL%2FkvoKs7ADijqOK4rZrHe5Jk%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;1280&quot; height=&quot;720&quot; data-filename=&quot;3.파일저장_썸네일.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;온라인 상품 판매나 제휴 마케팅을 위해 판매 데이터 구축이 필요한 분들이라면 꼭 시청하시면 좋겠네요. 나만의 크롤러를 만들어 판매 데이터를 구축해 보아요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://youtu.be/7IAo-q-poyA&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/7IAo-q-poyA&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1728021305952&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;- YouTube&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://youtu.be/7IAo-q-poyA&quot; data-og-url=&quot;https://www.youtube.com/watch?v=7IAo-q-poyA&amp;amp;feature=youtu.be&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://youtu.be/7IAo-q-poyA&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://youtu.be/7IAo-q-poyA&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;- YouTube&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.youtube.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;size18&quot;&gt;&lt;b&gt;추가/개선한 소스코드입니다.&amp;nbsp;&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;1. 쿠팡 크롤링 시 상품 가격 가져오는 로직을 수정함&amp;nbsp; - sale가격을 먼저 찾고 없으면 기본 가격을 찾게함, 기본가격 자체가 없는 경우 에러가 발생하여 순서를 수정하고 예외처리함.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;2. 검색 키워드 입력 후 키보드 엔터 처리를 추가함. 마우스 클리과 같은 효과임. 각 위젯의 config에서 command는 클릭 처리를 위한 것이고 bind는 이를 포함해 더 많은 기능을 처리할 수 있다. 예를 들면 키보드 엔터, 마우스 오른쪽 버튼 등...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;3. 파일명 자동 생성 로직과 검색 결과 파일 저장하는 코드&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728025014139&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tkinter as tk
from selenium import webdriver
from selenium.webdriver.common.by import By
import tkinter.messagebox as msg
from datetime import datetime

win = tk.Tk()
win.geometry(&quot;600x550&quot;)
win.option_add(&quot;*font&quot;,&quot;맑은고딕 15&quot;)
win.title(&quot;테스트 window&quot;)

lblKeyword = tk.Label(win,text=&quot;Keyword&quot;)
lblKeyword.pack()
# 검색어 입력
def on_enter_key(event):
    btnSearch.invoke()
entKeyword = tk.Entry(win,width=20)
entKeyword.pack()
entKeyword.focus() 
entKeyword.bind(&quot;&amp;lt;Return&amp;gt;&quot;,on_enter_key)

# 상품 검색
def btn_search_click() :
    lb.delete(0,tk.END)
    keyword = entKeyword.get()
    drvier = webdriver.Chrome()
    drvier.get (f&quot;https://www.coupang.com/np/search?q={keyword}&quot;)

    drvier.implicitly_wait(5)

    results = drvier.find_elements(By.CLASS_NAME, &quot;descriptions-inner&quot;)
    for rank, r in enumerate(results,1) :
        if rank &amp;gt; 10 : 
            break
        try :
            name = r.find_element(By.CLASS_NAME, &quot;name&quot;)
            print(f&quot;*** {name.text} &quot;)
            price = r.find_element(By.CLASS_NAME, &quot;price&quot;)
            
            sale_price = price.find_element(By.CLASS_NAME, &quot;sale&quot;)
            if sale_price :
                last_price = sale_price.find_element(By.CLASS_NAME,&quot;price-value&quot;)
                print(f&quot;{rank}위 {name.text} {last_price.text}&quot;)
                lb.insert(tk.END, f&quot;{rank}위 {name.text} {last_price.text}원&quot;)
            else :
                base_price = price.find_element(By.CLASS_NAME,&quot;price-info&quot;)
                print(f&quot;{rank}위 {name.text}  {base_price.text} &quot;)
                lb.insert(tk.END, f&quot;{rank}위 {name.text} {base_price.text}원&quot;)
        except :
            print(f&quot;skip&quot;)
    drvier.quit()
    
# 검색 버튼    
btnSearch = tk.Button(win, text=&quot;쿠팡검색&quot;)
btnSearch.config(command=btn_search_click)
btnSearch.pack()

# 검색 결과 출력
lb = tk.Listbox(win,width=50,height=20)
lb.pack()

# 파일 저장
def btn_save_click() :
    now = datetime.now()
    file_name = entKeyword.get() + &quot;_&quot; + now.strftime(&quot;%y%m%d_%H%M&quot;)
    with open(f&quot;data/{file_name}.txt&quot;,&quot;w&quot;,encoding=&quot;utf-8&quot;) as f:
        for info in lb.get(0,tk.END):
            f.write(info + &quot;\n&quot;)
    msg.showinfo(&quot;저장&quot;,&quot;파일 저장 완료&quot;)
btnSave = tk.Button(win,text=&quot;저장&quot;)
btnSave.config(command=btn_save_click)
btnSave.pack()

win.mainloop()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/728</guid>
      <comments>https://iamgus.tistory.com/728#entry728comment</comments>
      <pubDate>Fri, 4 Oct 2024 14:55:11 +0900</pubDate>
    </item>
    <item>
      <title>쿠팡에서 어떤 스마트폰이 잘 팔릴까? - 나만의 크롤러 만들기</title>
      <link>https://iamgus.tistory.com/727</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 초보자도 10분 만에 파이썬을 이용해 나만의 쿠팡 크롤링 UI를 만들 수 있는 방법을 소개합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2_쿠팡-크롤러-만들기-001.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFH78J/btsJPzysnuF/bwbbzlQnVtTObRwMzgroOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFH78J/btsJPzysnuF/bwbbzlQnVtTObRwMzgroOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFH78J/btsJPzysnuF/bwbbzlQnVtTObRwMzgroOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFH78J%2FbtsJPzysnuF%2FbwbbzlQnVtTObRwMzgroOk%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;1280&quot; height=&quot;720&quot; data-filename=&quot;2_쿠팡-크롤러-만들기-001.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 두 번째 강좌는 파이썬 selenium을 이용한 크롤러 만들기입니다. Tkinter로 만든 UI에서 버튼 클릭 한번으로 쿠팡 상품 정보를 보여주는 방법을 쉽게 알려 드릴게요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; #2. 쿠팡에서 어떤 스마트폰이 잘 팔릴까? - 나만의 크롤러 만들기 코딩 경험이 없어도 쉽게 따라할 수 있도록 단계별로 설명하며, 유용한 데이터 수집을 통해 제휴 마케팅이나 스마트 스토어에 활용할 수 있는 노하우를 알려 드릴게요. &lt;/span&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://youtu.be/A3O2FPFUlpo&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/A3O2FPFUlpo&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=A3O2FPFUlpo&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/rP34e/hyW6LZOO1s/5ghyz7QrjU15w6ajulrBik/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;쿠팡에서 어떤 스마트폰이 잘 팔릴까? - 나만의 크롤러 만들기&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/A3O2FPFUlpo&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&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;쿠팡 셀레니움 크롤러 소스 코드입니다. tkinter와 selenium을 이용해 버튼 클릭 한방에 쿠팡 상품 정보를 가져오는 놀라운 코드입니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727596977100&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tkinter as tk
from selenium import webdriver
from selenium.webdriver.common.by import By


win = tk.Tk()
win.geometry(&quot;600x550&quot;)
win.option_add(&quot;*font&quot;,&quot;맑은고딕 15&quot;)
win.title(&quot;테스트 window&quot;)

lblKeyword = tk.Label(win,text=&quot;Keyword&quot;)
lblKeyword.pack()
# 검색어 입력
entKeyword = tk.Entry(win,width=20)
entKeyword.pack()

# 상품 검색
def btn_search_click() :
    keyword = entKeyword.get()
    drvier = webdriver.Chrome()
    drvier.get (f&quot;https://www.coupang.com/np/search?q={keyword}&quot;)

    drvier.implicitly_wait(5)

    results = drvier.find_elements(By.CLASS_NAME, &quot;descriptions-inner&quot;)
    for rank, r in enumerate(results,1) :
        if rank &amp;gt; 10 : 
            break
        try :
            name = r.find_element(By.CLASS_NAME, &quot;name&quot;)
            price = r.find_element(By.CLASS_NAME, &quot;price&quot;)
            print(f&quot;{rank}위 {name.text} {price.text}&quot;)
            lb.insert(tk.END, f&quot;{rank}위 {name.text} {price.text}&quot;)
        except :
            print(&quot;skip&quot;)
    drvier.quit()
    
btnSearch = tk.Button(win, text=&quot;쿠팡검색&quot;)
btnSearch.config(command=btn_search_click)
btnSearch.pack()

# 검색 결과 출력
lb = tk.Listbox(win,width=50,height=20)
lb.pack()

win.mainloop()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/727</guid>
      <comments>https://iamgus.tistory.com/727#entry727comment</comments>
      <pubDate>Sun, 29 Sep 2024 17:04:32 +0900</pubDate>
    </item>
    <item>
      <title>초보도 10분이면  만드는  쿠팡 크롤링 UI, 따라해 보세요!</title>
      <link>https://iamgus.tistory.com/726</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;text-align: start; font-family: 'Nanum Gothic'; color: #000000;&quot;&gt; 초보자도 10분 만에 파이썬을 이용해 나만의 쿠팡 크롤링 UI를 만들 수 있는 방법을 소개합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J82Xz/btsJKEZ6c51/vHRmsE8rvD98H63QCSyzP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J82Xz/btsJKEZ6c51/vHRmsE8rvD98H63QCSyzP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J82Xz/btsJKEZ6c51/vHRmsE8rvD98H63QCSyzP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ82Xz%2FbtsJKEZ6c51%2FvHRmsE8rvD98H63QCSyzP0%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;551&quot; height=&quot;310&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;text-align: start; font-family: 'Nanum Gothic'; color: #000000;&quot;&gt; 첫 강좌는 Tkinter를 이용해 GUI만들기입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CIFzN/btsJKFSeYSk/GlowXK3DkHm7Fs5JTfQf6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CIFzN/btsJKFSeYSk/GlowXK3DkHm7Fs5JTfQf6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CIFzN/btsJKFSeYSk/GlowXK3DkHm7Fs5JTfQf6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCIFzN%2FbtsJKFSeYSk%2FGlowXK3DkHm7Fs5JTfQf6k%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;591&quot; height=&quot;653&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;653&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;text-align: start; font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;#1 : 파이썬 GUI는 Tkinter에게 맡겨주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://youtu.be/oHe0xKzD9sg&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/oHe0xKzD9sg&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727218283933&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;- YouTube&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://youtu.be/oHe0xKzD9sg&quot; data-og-url=&quot;https://www.youtube.com/watch?v=oHe0xKzD9sg&amp;amp;feature=youtu.be&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://youtu.be/oHe0xKzD9sg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://youtu.be/oHe0xKzD9sg&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;- YouTube&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.youtube.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;size18&quot;&gt;&lt;span style=&quot;text-align: start; font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;코딩 경험이 없어도 쉽게 따라할 수 있도록 단계별로 설명하며, 유용한 데이터 수집을 통해 제휴 마케팅이나 스마트 스토어에 활용할 수 있는 노하우를 알려 드릴게요. 파이썬에서 기본 제공하는 Tkinter 라이브러리를 이용해 자신만의 UI를 제작해 보세요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/726</guid>
      <comments>https://iamgus.tistory.com/726#entry726comment</comments>
      <pubDate>Wed, 25 Sep 2024 00:10:35 +0900</pubDate>
    </item>
    <item>
      <title>ChatGPT 상식 퀴즈 웹사이트 만들어 줘.</title>
      <link>https://iamgus.tistory.com/725</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;상식 퀴즈 웹사이트를 ChatGPT를 이용해 빠르게 만들어 보자.&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 요청하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상식퀴즈&amp;nbsp;웹앱에서&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;퀴즈&amp;nbsp;데이터를&amp;nbsp;JSON&amp;nbsp;형식으로&amp;nbsp;작성해 줘. &lt;br /&gt;각&amp;nbsp;퀴즈&amp;nbsp;항목에&amp;nbsp;질문(question),&amp;nbsp;선택지(choices),&amp;nbsp;정답(answer),&amp;nbsp;그리고&amp;nbsp;선택지의&amp;nbsp;설명(explanation)을&amp;nbsp;포함해 줘.&amp;nbsp; &lt;br /&gt;위&amp;nbsp;형태로&amp;nbsp;10개를&amp;nbsp;만들어줘.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[chatgpt]&lt;/p&gt;
&lt;pre id=&quot;code_1719834800900&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[
    {
        &quot;question&quot;: &quot;태양계에서 가장 큰 행성은 무엇인가요?&quot;,
        &quot;choices&quot;: [&quot;지구&quot;, &quot;화성&quot;, &quot;목성&quot;, &quot;토성&quot;],
        &quot;answer&quot;: &quot;목성&quot;,
        &quot;explanation&quot;: &quot;목성은 태양계에서 가장 큰 행성으로, 직경은 약 142,984km입니다.&quot;
    },
    {
        &quot;question&quot;: &quot;빛의 속도는 초당 몇 킬로미터인가요?&quot;,
        &quot;choices&quot;: [&quot;300,000 km&quot;, &quot;150,000 km&quot;, &quot;450,000 km&quot;, &quot;600,000 km&quot;],
        &quot;answer&quot;: &quot;300,000 km&quot;,
        &quot;explanation&quot;: &quot;빛의 속도는 약 초당 299,792 km로, 대략 300,000 km/s로 간주됩니다.&quot;
    },
    {
        &quot;question&quot;: &quot;세계에서 가장 큰 바다는 무엇인가요?&quot;,
        &quot;choices&quot;: [&quot;대서양&quot;, &quot;인도양&quot;, &quot;남극해&quot;, &quot;태평양&quot;],
        &quot;answer&quot;: &quot;태평양&quot;,
        &quot;explanation&quot;: &quot;태평양은 세계에서 가장 큰 바다로, 지구 표면의 약 30%를 차지합니다.&quot;
    },
    {
        &quot;question&quot;: &quot;피타고라스 정리는 어떤 도형에 관한 것인가요?&quot;,
        &quot;choices&quot;: [&quot;삼각형&quot;, &quot;사각형&quot;, &quot;오각형&quot;, &quot;육각형&quot;],
        &quot;answer&quot;: &quot;삼각형&quot;,
        &quot;explanation&quot;: &quot;피타고라스 정리는 직각삼각형에서 두 변의 제곱의 합이 빗변의 제곱과 같다는 것을 나타냅니다.&quot;
    },
    {
        &quot;question&quot;: &quot;지구의 대기 중 가장 많은 비율을 차지하는 기체는 무엇인가요?&quot;,
        &quot;choices&quot;: [&quot;산소&quot;, &quot;이산화탄소&quot;, &quot;질소&quot;, &quot;아르곤&quot;],
        &quot;answer&quot;: &quot;질소&quot;,
        &quot;explanation&quot;: &quot;질소는 지구 대기의 약 78%를 차지하는 가장 풍부한 기체입니다.&quot;
    },
    {
        &quot;question&quot;: &quot;인류가 달에 최초로 착륙한 해는 언제인가요?&quot;,
        &quot;choices&quot;: [&quot;1959년&quot;, &quot;1969년&quot;, &quot;1979년&quot;, &quot;1989년&quot;],
        &quot;answer&quot;: &quot;1969년&quot;,
        &quot;explanation&quot;: &quot;아폴로 11호의 닐 암스트롱과 버즈 올드린은 1969년에 달에 착륙했습니다.&quot;
    },
    {
        &quot;question&quot;: &quot;파블로 피카소는 어느 예술 운동과 관련이 있나요?&quot;,
        &quot;choices&quot;: [&quot;인상주의&quot;, &quot;초현실주의&quot;, &quot;큐비즘&quot;, &quot;야수파&quot;],
        &quot;answer&quot;: &quot;큐비즘&quot;,
        &quot;explanation&quot;: &quot;파블로 피카소는 조르주 브라크와 함께 큐비즘을 창시했습니다.&quot;
    },
    {
        &quot;question&quot;: &quot;컴퓨터의 중앙 처리 장치(CPU)는 무엇의 약자인가요?&quot;,
        &quot;choices&quot;: [&quot;Central Processing Unit&quot;, &quot;Central Power Unit&quot;, &quot;Central Program Unit&quot;, &quot;Central Processing Utility&quot;],
        &quot;answer&quot;: &quot;Central Processing Unit&quot;,
        &quot;explanation&quot;: &quot;CPU는 Central Processing Unit의 약자로, 컴퓨터의 중앙 처리 장치를 의미합니다.&quot;
    },
    {
        &quot;question&quot;: &quot;로마 제국의 첫 번째 황제는 누구인가요?&quot;,
        &quot;choices&quot;: [&quot;줄리어스 시저&quot;, &quot;아우구스투스&quot;, &quot;티베리우스&quot;, &quot;네로&quot;],
        &quot;answer&quot;: &quot;아우구스투스&quot;,
        &quot;explanation&quot;: &quot;아우구스투스는 로마 제국의 첫 번째 황제로, 원래 이름은 옥타비아누스였습니다.&quot;
    },
    {
        &quot;question&quot;: &quot;대서양과 태평양을 연결하는 운하는 무엇인가요?&quot;,
        &quot;choices&quot;: [&quot;수에즈 운하&quot;, &quot;파나마 운하&quot;, &quot;에리 운하&quot;, &quot;크라 운하&quot;],
        &quot;answer&quot;: &quot;파나마 운하&quot;,
        &quot;explanation&quot;: &quot;파나마 운하는 중앙 아메리카의 파나마에 위치해 대서양과 태평양을 연결합니다.&quot;
    }
]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 퀴즈 웹앱을 만드는 코드를 작성해~&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에서 json으로 만든 데이터를 이용해 상식퀴즈 웹앱을 작성해줘.&lt;/li&gt;
&lt;li&gt;- html, js, css 파일로 구성해줘&lt;/li&gt;
&lt;li&gt;- 한번에 하나의 문제를 제시하고 문제를 맞히면 다음 문제로 넘어가.&lt;/li&gt;
&lt;li&gt;- 질문과 답은 아래와 같이 구성해줘.&lt;/li&gt;
&lt;li&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;gt; &quot;질문&quot; : quiz, &quot;선택지&quot; : 4개 중 하나 선택, &quot;정답&quot; : 정답 번호와 간단한 설명&lt;/li&gt;
&lt;li&gt;- 문제를 틀리면 틀렸다고하고 풀던 문제를 계속 풀도록 해야 해.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[chatgpt]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uKM8r/btsIkMjLRXl/RG1cwAkjJHHtcc9tgSWUMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uKM8r/btsIkMjLRXl/RG1cwAkjJHHtcc9tgSWUMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uKM8r/btsIkMjLRXl/RG1cwAkjJHHtcc9tgSWUMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuKM8r%2FbtsIkMjLRXl%2FRG1cwAkjJHHtcc9tgSWUMk%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;747&quot; height=&quot;338&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;338&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;761&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxjoQU/btsIjeBIa5S/1rCGDLU6i8ukSRQJRnLGi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxjoQU/btsIjeBIa5S/1rCGDLU6i8ukSRQJRnLGi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxjoQU/btsIjeBIa5S/1rCGDLU6i8ukSRQJRnLGi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxjoQU%2FbtsIjeBIa5S%2F1rCGDLU6i8ukSRQJRnLGi1%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;761&quot; height=&quot;258&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;258&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;741&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byqucg/btsIjzsa4ed/4KJ5BhpSlkfIYvhAdBKzBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byqucg/btsIjzsa4ed/4KJ5BhpSlkfIYvhAdBKzBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byqucg/btsIjzsa4ed/4KJ5BhpSlkfIYvhAdBKzBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyqucg%2FbtsIjzsa4ed%2F4KJ5BhpSlkfIYvhAdBKzBK%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;741&quot; height=&quot;313&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 상식퀴즈 웹앱 테스트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 오답이면 틀렸다고 안내하고 맞출 때까지 계속 풀게 한다.&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;477&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KYsfb/btsIjhyqr43/kD4GGkVuyaOTZLApZs5SgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KYsfb/btsIjhyqr43/kD4GGkVuyaOTZLApZs5SgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KYsfb/btsIjhyqr43/kD4GGkVuyaOTZLApZs5SgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKYsfb%2FbtsIjhyqr43%2FkD4GGkVuyaOTZLApZs5SgK%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;477&quot; height=&quot;195&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;195&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;323&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccHXum/btsIj4Fslup/jaLNOZnMkk9ClkhOVPtSBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccHXum/btsIj4Fslup/jaLNOZnMkk9ClkhOVPtSBk/img.png&quot; data-alt=&quot;오답인 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccHXum/btsIj4Fslup/jaLNOZnMkk9ClkhOVPtSBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccHXum%2FbtsIj4Fslup%2FjaLNOZnMkk9ClkhOVPtSBk%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;121&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오답인 경우&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LMTvD/btsIkkHZpbY/Ww4mCxgkSbpRlwKukmMtn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LMTvD/btsIkkHZpbY/Ww4mCxgkSbpRlwKukmMtn1/img.png&quot; data-alt=&quot;정답인 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LMTvD/btsIkkHZpbY/Ww4mCxgkSbpRlwKukmMtn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLMTvD%2FbtsIkkHZpbY%2FWw4mCxgkSbpRlwKukmMtn1%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;600&quot; height=&quot;119&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정답인 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rtBlo/btsIkP8C0XH/BS7Z4cEQL6DCWdUOMKkQL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rtBlo/btsIkP8C0XH/BS7Z4cEQL6DCWdUOMKkQL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rtBlo/btsIkP8C0XH/BS7Z4cEQL6DCWdUOMKkQL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrtBlo%2FbtsIkP8C0XH%2FBS7Z4cEQL6DCWdUOMKkQL0%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;465&quot; height=&quot;69&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;69&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;h4 data-ke-size=&quot;size20&quot;&gt;4. 응용 방안&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 걸 저관여 앱이라 한다. 즉, 난이도가 높지 않고 쉽게 대량으로 만들 수 있는 사이트나 앱을 의미한다. 이런 것은 chatgpt를 이용해 소스를 작성하고 api를 이용해 gpt무한의 학습 데이터를 퀴즈로 만들 수 있다. 그러면 운영자의 노고 없이 퀴즈 풀이가 가능해진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수익원은 당연히 광고다. 검색엔진에 노출만 된다면 전 세계를 상대로 수익을 올릴 수 있다.&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/725</guid>
      <comments>https://iamgus.tistory.com/725#entry725comment</comments>
      <pubDate>Mon, 1 Jul 2024 21:07:19 +0900</pubDate>
    </item>
    <item>
      <title>운동할 때 최고의 선택! 샥즈 오픈런 프로 골전도 블루투스 이어폰 리뷰</title>
      <link>https://iamgus.tistory.com/724</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 여러분! 오늘은 제가 &lt;a href=&quot;https://link.coupang.com/a/bGWnzm&quot;&gt;샥즈 오픈런 프로 골전도 블루투스 이어폰 S810&lt;/a&gt;을 리뷰해보려고 합니다. 이 제품은 독특한 골전도 기술을 탑재한 블루투스 이어폰으로, 특히 운동할 때 사용하기에 매우 적합한 제품입니다. 지금부터 이 제품의 상세한 특징과 장단점을 살펴보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf1xC4/btsIbvW1T8O/LRjRyxtnzib4p6JlGbkZdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf1xC4/btsIbvW1T8O/LRjRyxtnzib4p6JlGbkZdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf1xC4/btsIbvW1T8O/LRjRyxtnzib4p6JlGbkZdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf1xC4%2FbtsIbvW1T8O%2FLRjRyxtnzib4p6JlGbkZdk%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;368&quot; height=&quot;254&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;제품명: &lt;a href=&quot;https://link.coupang.com/a/bGWnzm&quot;&gt;샥즈 오픈런 프로 골전도 블루투스 이어폰 S810&lt;/a&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가격: 227,050원&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제품 사양&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/th&gt;
&lt;th&gt;&lt;b&gt;내용&lt;/b&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;블루투스 버전&lt;/td&gt;
&lt;td&gt;5.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;형태&lt;/td&gt;
&lt;td&gt;넥밴드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배터리 용량&lt;/td&gt;
&lt;td&gt;140mAh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;음질 개선&lt;/td&gt;
&lt;td&gt;노이즈 캔슬링(마이크)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사용 시간&lt;/td&gt;
&lt;td&gt;10시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;대기 시간&lt;/td&gt;
&lt;td&gt;240시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;충전 시간&lt;/td&gt;
&lt;td&gt;1시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사운드 기능&lt;/td&gt;
&lt;td&gt;골전도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;용도&lt;/td&gt;
&lt;td&gt;통화 + 음악&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;무게(본체)&lt;/td&gt;
&lt;td&gt;29g&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;블루투스 프로파일&lt;/td&gt;
&lt;td&gt;HFP, HSP, AVRCP, A2DP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oHwOX/btsH9hlRapF/893J6W0hvHf677zYRFqg3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oHwOX/btsH9hlRapF/893J6W0hvHf677zYRFqg3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oHwOX/btsH9hlRapF/893J6W0hvHf677zYRFqg3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoHwOX%2FbtsH9hlRapF%2F893J6W0hvHf677zYRFqg3k%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;501&quot; height=&quot;326&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제품 특징 및 장점&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;골전도 기술&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;안전한 청취&lt;/b&gt;: 골전도 기술을 사용하여 귀를 막지 않고도 소리를 들을 수 있어, 주위 소리를 들으면서도 음악을 즐길 수 있습니다. 이는 특히 야외 운동 시 안전성을 높여줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;편안한 착용감&lt;/b&gt;: 귀를 덮지 않는 디자인으로 장시간 착용해도 귀에 피로감이 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;노이즈 캔슬링 마이크&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;선명한 통화 품질&lt;/b&gt;: 노이즈 캔슬링 마이크가 장착되어 있어 주변 소음을 줄이고, 통화 시 선명한 음질을 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;긴 배터리 수명&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;오랜 사용 시간&lt;/b&gt;: 한 번 충전으로 최대 10시간 동안 연속 사용이 가능하며, 대기 시간은 무려 240시간에 달합니다. 충전 시간도 1시간으로 비교적 짧아 빠르게 충전할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;경량 디자인&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가벼운 무게&lt;/b&gt;: 본체 무게가 29g으로 매우 가벼워, 운동 시에도 무리 없이 착용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;넥밴드 형태&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;안정적인 착용&lt;/b&gt;: 넥밴드 형태로 디자인되어 운동 중에도 안정적으로 착용할 수 있습니다. 격렬한 운동에도 쉽게 벗겨지지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;가격대&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;고가&lt;/b&gt;: 227,050원으로 가격이 다소 높은 편입니다. 하지만 골전도 기술과 다양한 기능을 고려하면 그만한 가치를 제공한다고 할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;배터리 용량&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;배터리 용량&lt;/b&gt;: 140mAh 배터리 용량이 다소 작아 보일 수 있으나, 효율적인 전력 관리로 충분한 사용 시간을 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;총평&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샥즈 오픈런 프로 골전도 블루투스 이어폰 S810은 독특한 골전도 기술을 탑재한 혁신적인 제품입니다. 특히 운동할 때 안전하게 사용할 수 있는 점이 큰 장점입니다. 또한, 노이즈 캔슬링 마이크와 긴 배터리 수명, 가벼운 무게 등 여러 기능이 잘 조화되어 있어 매우 만족스러운 사용자 경험을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 다소 높은 가격대가 부담스러울 수 있지만, 제품의 성능과 기능을 고려하면 충분히 투자할 가치가 있다고 생각합니다. 운동 시 사용하기 좋은 블루투스 이어폰을 찾고 계신다면 &lt;a href=&quot;https://link.coupang.com/a/bGWnzm&quot;&gt;샥즈 오픈런 프로&lt;/a&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>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/724</guid>
      <comments>https://iamgus.tistory.com/724#entry724comment</comments>
      <pubDate>Mon, 24 Jun 2024 21:38:15 +0900</pubDate>
    </item>
    <item>
      <title>쿠팡 상품 리뷰 크롤링 차단 되세요?</title>
      <link>https://iamgus.tistory.com/723</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;상품을 선택하는 기준이 사람마다 다르겠지만, 내 경우는 상품 리뷰가 1순위다. 이것저것 꼼꼼히 살펴보고 조건이 충족되면 구매를 한다. 쿠팡 리뷰를 크롤링해 제휴 쇼핑페이지를 만들면 나 같은 사람들이 구매를 하지 않을까 하는 생각으로 코드를 작성했다.&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;상품 리뷰로 이동하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1325&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vlip7/btsHs0pxUqR/wPEGw3ADCr0dwgIi5nlumK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vlip7/btsHs0pxUqR/wPEGw3ADCr0dwgIi5nlumK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vlip7/btsHs0pxUqR/wPEGw3ADCr0dwgIi5nlumK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvlip7%2FbtsHs0pxUqR%2FwPEGw3ADCr0dwgIi5nlumK%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;1325&quot; height=&quot;398&quot; data-origin-width=&quot;1325&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상품평 탭이 페이지를 스크롤 다운해야 나타난다.&lt;/b&gt; 마우스나 페이지 스크롤을 몇 번 내리면 가능하겠지만, 코드로 구현하려면 기준점이 필요한다. 키보드 End 버튼을 시간 간격을 두고 누르게 했다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715868358847&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i in range(3):
    print(f&quot;page down no :{i}&quot;)
    driver.find_element(By.TAG_NAME, &quot;body&quot;).send_keys(Keys.END)    
    time.sleep(2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;상품평&quot;을 클릭해 리뷰페이지가 나타나게 한다.&lt;/b&gt; 동적인 코드로 구성되어 있어서 이런 이벤트가 필요하다. xpath를 이용해 데이터를 가져왔다. id나 css selector를 사용해도 무방하다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715868455210&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver.find_element(By.XPATH,'//*[@id=&quot;btfTab&quot;]/ul[1]/li[2]').click()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 시간 간격을 두고 리뷰를 읽어와 출력했다.&lt;/p&gt;
&lt;pre id=&quot;code_1715868603686&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;time.sleep(2)
review = driver.find_element(By.CSS_SELECTOR,&quot;.sdp-review__article__list__review__content.js_reviewArticleContent&quot;)
print(review.text)&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;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;쿠팡에서 자동 봇, 즉 크롤링으로 데이터를 수집하는 경우 제약을 둔 것 같다. 개발자 모드(F12)에서 콘솔에 들어가 아래 명령어를 입력하면 true나 false가 나온다. true는 자동 접속을 통한 데이터 수집, false는 사람이 브라우저를 통해 접속한 경우로 인식한다.&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) 봇(크롤링) 접속시 - 자동화&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LUFaS/btsHqy9Ng7J/oBz93FStRQ4Jq4rMODHvxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LUFaS/btsHqy9Ng7J/oBz93FStRQ4Jq4rMODHvxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LUFaS/btsHqy9Ng7J/oBz93FStRQ4Jq4rMODHvxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLUFaS%2FbtsHqy9Ng7J%2FoBz93FStRQ4Jq4rMODHvxK%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;246&quot; height=&quot;56&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) 일반적인 접속시&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnI66W/btsHq8Jt1kS/HtpT14krFqvk8v5ZeVMSr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnI66W/btsHq8Jt1kS/HtpT14krFqvk8v5ZeVMSr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnI66W/btsHq8Jt1kS/HtpT14krFqvk8v5ZeVMSr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnI66W%2FbtsHq8Jt1kS%2FHtpT14krFqvk8v5ZeVMSr1%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;327&quot; height=&quot;54&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;54&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;봇 접속시 마치 사람이 직접 브라우저를 통해 입력한 것처럼 만들면 된다. &lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;코드 한 줄이면 감쪽같이 해결된다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두~둥~&lt;/p&gt;
&lt;pre id=&quot;code_1715869388307&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;options.add_argument(&quot;--disable-blink-features=AutomationControlled&quot;)&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;650&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Si8b/btsHqQoMqD7/SfFMwhpMAVG264KiW9cQtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Si8b/btsHqQoMqD7/SfFMwhpMAVG264KiW9cQtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Si8b/btsHqQoMqD7/SfFMwhpMAVG264KiW9cQtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9Si8b%2FbtsHqQoMqD7%2FSfFMwhpMAVG264KiW9cQtk%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;650&quot; height=&quot;327&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;리뷰 출력 결과 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zRzJA/btsHsqvtd7m/fgtuJzw0SwRsc7LMkciNR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zRzJA/btsHsqvtd7m/fgtuJzw0SwRsc7LMkciNR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zRzJA/btsHsqvtd7m/fgtuJzw0SwRsc7LMkciNR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzRzJA%2FbtsHsqvtd7m%2FfgtuJzw0SwRsc7LMkciNR1%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;555&quot; height=&quot;228&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/723</guid>
      <comments>https://iamgus.tistory.com/723#entry723comment</comments>
      <pubDate>Thu, 16 May 2024 23:26:42 +0900</pubDate>
    </item>
    <item>
      <title>네이버 쇼핑 리뷰 크롤링</title>
      <link>https://iamgus.tistory.com/722</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/721&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.05.06 - [코드리뷰/chatGPT(Python)코드] - 삼성 갤럭시북3 360 NT750QFT-A51A: 다재다능한 노트북의 새로운 기준&lt;/a&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;1. 네이버 쇼핑 리뷰 페이지 분석&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqTq3L/btsHblbwIq0/Uiy2nRTUzmVzGpEFKo5Ifk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqTq3L/btsHblbwIq0/Uiy2nRTUzmVzGpEFKo5Ifk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqTq3L/btsHblbwIq0/Uiy2nRTUzmVzGpEFKo5Ifk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqTq3L%2FbtsHblbwIq0%2FUiy2nRTUzmVzGpEFKo5Ifk%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;983&quot; height=&quot;387&quot; data-origin-width=&quot;983&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;사용자 리뷰는 제품 소개 거의 끝 부분에 있다. 동적인 페이지로 구성되어 페이지를 스크롤해서 내리거나 또는 끝페이지로 이동해야 리뷰정보가 나타난다.&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;961&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sHAny/btsHdxnYAQs/s6EJ6cecQRhyAUFJAbvsPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sHAny/btsHdxnYAQs/s6EJ6cecQRhyAUFJAbvsPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sHAny/btsHdxnYAQs/s6EJ6cecQRhyAUFJAbvsPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsHAny%2FbtsHdxnYAQs%2Fs6EJ6cecQRhyAUFJAbvsPk%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;961&quot; height=&quot;582&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;582&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;2. 파이썬 크롤링 구현하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상품 페이지가 열리면, send_keys를 이용해 페이지의 끝으로 이동한다. sleep을 2~3초 정도 준다. 페이지 로딩 시간을 고려해야 한다. 이 부분도 랜덤함수를 이용해 다채롭게 설정할 수 있다. 봇 차단을 안 당하려면 고려해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;driver&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;find_element&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;By&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;TAG_NAME&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;body&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;send_keys&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Keys&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;END&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;sleep&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 리뷰를 크롤링하려면,&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;r_ul&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;driver&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;find_element&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;By&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;CSS_SELECTOR&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;[class^=reviewItems_list_review]&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;reviews&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;r_ul&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;find_elements&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;By&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;CSS_SELECTOR&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;[class^=reviewItems_text]&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;review_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; []&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;rank&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;enumerate&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;reviews&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[:&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;):&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;NO.&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;rank&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;review_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;NO.&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;rank&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; - &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #d7ba7d;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&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;772&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sGBpE/btsHbQ3bGeI/55VV5SKeiI24FugiRpoWpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sGBpE/btsHbQ3bGeI/55VV5SKeiI24FugiRpoWpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sGBpE/btsHbQ3bGeI/55VV5SKeiI24FugiRpoWpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsGBpE%2FbtsHbQ3bGeI%2F55VV5SKeiI24FugiRpoWpk%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;772&quot; height=&quot;128&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 사용자 리뷰를 파일로 저장한다.&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;datetime&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;file_name&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;strftime&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;%y%m&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;_%H%M&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;with&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;review/&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;file_name&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;.txt&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;w&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;writelines&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;review_list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. chatGPT로 리뷰를 작성한다.&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;802&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OMZFs/btsHbTlhp0G/4ymcK6ZZcqkHrOIr1IQZ5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OMZFs/btsHbTlhp0G/4ymcK6ZZcqkHrOIr1IQZ5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OMZFs/btsHbTlhp0G/4ymcK6ZZcqkHrOIr1IQZ5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOMZFs%2FbtsHbTlhp0G%2F4ymcK6ZZcqkHrOIr1IQZ5k%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;802&quot; height=&quot;407&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;407&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://iamgus.tistory.com/721&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.05.06 - [코드리뷰/chatGPT(Python)코드] - 삼성 갤럭시북3 360 NT750QFT-A51A: 다재다능한 노트북의 새로운 기준&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714954376916&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;삼성 갤럭시북3 360 NT750QFT-A51A: 다재다능한 노트북의 새로운 기준&quot; data-og-description=&quot;안녕하세요! 삼성 갤럭시북3 360 NT750QFT-A51A에 대한 제휴마케팅 포스트를 소개합니다.이번 리뷰를 통해 여러분께서 이 제품을 선택하실 때 고려해야 할 모든 정보를 전해드릴 것입니다.특별한 선&quot; data-og-host=&quot;iamgus.tistory.com&quot; data-og-source-url=&quot;https://iamgus.tistory.com/721&quot; data-og-url=&quot;https://iamgus.tistory.com/721&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oe7FJ/hyVZmzwI8B/hLNH8c1IIIOuJcmADkmwf0/img.png?width=398&amp;amp;height=392&amp;amp;face=0_0_398_392,https://scrap.kakaocdn.net/dn/tXgK6/hyVZqaO5bA/ciEzCHCee82hcApijQAvDK/img.png?width=398&amp;amp;height=392&amp;amp;face=0_0_398_392&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/721&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iamgus.tistory.com/721&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oe7FJ/hyVZmzwI8B/hLNH8c1IIIOuJcmADkmwf0/img.png?width=398&amp;amp;height=392&amp;amp;face=0_0_398_392,https://scrap.kakaocdn.net/dn/tXgK6/hyVZqaO5bA/ciEzCHCee82hcApijQAvDK/img.png?width=398&amp;amp;height=392&amp;amp;face=0_0_398_392');&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;삼성 갤럭시북3 360 NT750QFT-A51A: 다재다능한 노트북의 새로운 기준&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요! 삼성 갤럭시북3 360 NT750QFT-A51A에 대한 제휴마케팅 포스트를 소개합니다.이번 리뷰를 통해 여러분께서 이 제품을 선택하실 때 고려해야 할 모든 정보를 전해드릴 것입니다.특별한 선&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iamgus.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;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/722</guid>
      <comments>https://iamgus.tistory.com/722#entry722comment</comments>
      <pubDate>Mon, 6 May 2024 09:13:36 +0900</pubDate>
    </item>
    <item>
      <title>삼성 갤럭시북3 360 NT750QFT-A51A: 다재다능한 노트북의 새로운 기준</title>
      <link>https://iamgus.tistory.com/721</link>
      <description>&lt;p&gt;&lt;strong&gt;안녕하세요! 삼성 갤럭시북3 360 NT750QFT-A51A에 대한 제휴마케팅 포스트를 소개합니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;이번 리뷰를 통해 여러분께서 이 제품을 선택하실 때 고려해야 할 모든 정보를 전해드릴 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;특별한 선택, 삼성 갤럭시북3 360&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;여러분께서 노트북을 선택할 때, 고려해야 할 요소가 많습니다. 성능, 디자인, 가격 등 다양한 측면에서 고려해야 할 것들이 많은데요, 삼성 갤럭시북3 360은 이 모든 요소를 만족시키는 제품입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;사용자 리뷰 분석&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;이제 사용자 리뷰를 살펴보겠습니다. 여러분들의 의견을 분석하여 이 제품의 장점, 단점, 특징을 자세히 살펴보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;다재다능한 디자인&lt;/strong&gt;: 삼성 갤럭시북3 360은 360도로 접히는 디자인으로 태블릿처럼 사용할 수 있습니다. 이 기능은 많은 사용자들이 편리하게 사용할 수 있는 장점 중 하나입니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;뛰어난 성능&lt;/strong&gt;: 12세대 코어i5 프로세서와 16GB의 RAM, 256GB의 SSD로 구성되어 있어, 높은 성능을 자랑합니다. 이는 사용자들이 다양한 작업을 빠르고 효율적으로 처리할 수 있게 해줍니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;화면 터치 기능&lt;/strong&gt;: 화면 터치 기능은 사용자들이 보다 직관적으로 작업을 수행할 수 있게 해줍니다. 또한, 터치 펜을 사용하여 창의적인 작업을 할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;지문과 터치 기능의 결합&lt;/strong&gt;: 화면 터치 기능을 사용하다 보면 지문이 남을 수 있습니다. 하지만 이는 보호 필름을 사용하거나 펜을 이용하여 보완할 수 있는 문제입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;가벼운 무게&lt;/strong&gt;: 1.46kg의 가벼운 무게로, 사용자들이 어디서든 편하게 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;긴 배터리 수명&lt;/strong&gt;: 한 번 충전하면 하루 동안 충분히 사용할 수 있는 배터리 수명을 자랑합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;결론&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;삼성 갤럭시북3 360은 다재다능한 디자인과 뛰어난 성능을 결합하여 사용자들에게 최고의 경험을 선사합니다. 화면 터치 기능과 펜을 활용하여 창의적인 작업을 하고, 가볍고 휴대하기 쉬운 디자인으로 어디서든 편리하게 사용할 수 있습니다. 이 제품을 선택하시면, 고품질의 노트북 경험을 누릴 수 있을 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;제품 스펙&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;스펙&lt;/th&gt;
&lt;th&gt;상세 내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;화면 크기&lt;/td&gt;
&lt;td&gt;39.6cm(15.6인치)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;무게&lt;/td&gt;
&lt;td&gt;1.46kg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로세서&lt;/td&gt;
&lt;td&gt;코어i5 13세대&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;미포함(FreeDos)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;코어 종류&lt;/td&gt;
&lt;td&gt;12코어(4P+8E)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;그래픽 카드&lt;/td&gt;
&lt;td&gt;Iris Xe Graphics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;16GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSD&lt;/td&gt;
&lt;td&gt;256GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;가격&lt;/strong&gt;: 1,498,000원&lt;/p&gt;
&lt;p&gt;이렇게 삼성 갤럭시북3 360은 다양한 기능과 뛰어난 성능으로 사용자들의 선택을 자랑하는 제품입니다. 어디서나 편리하게 사용할 수 있고, 창의적인 작업을 위한 다양한 기능을 제공합니다. 선택을 고민하고 있다면, 삼성 갤럭시북3 360을 권장드립니다. 만족할 것입니다!&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/721</guid>
      <comments>https://iamgus.tistory.com/721#entry721comment</comments>
      <pubDate>Mon, 6 May 2024 08:57:57 +0900</pubDate>
    </item>
    <item>
      <title>ChatGPT 로 가성비 노트북 소개 프롬프트 작성하기</title>
      <link>https://iamgus.tistory.com/720</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;소개글 자동화를 하기 위해선 수많은 시행착오를 거쳐야 한다. chatgpt가 어떤식으로 반응할지 완벽하게 예측할 수 없고, (아니 불가능하고)&amp;nbsp; 가능한 원하는 결과를 추출해야 하기 때문이다.&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;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://iamgus.tistory.com/719&quot;&gt;2024.05.01 - [코드리뷰/chatGPT(Python)코드] - 2024 최고의 가성비 노트북 찾아라!&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714529074619&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;2024 최고의 가성비 노트북 찾아라!&quot; data-og-description=&quot;올해 최고의 가성비 노트북을 찾는 방법가성비 노트북을 찾는 것은 어려운 일입니다. 노트북 시장은 다양한 브랜드와 기술의 발전으로 수많은 제품이 나타났다 사라집니다. 선택 폭이 그만큼 &quot; data-og-host=&quot;iamgus.tistory.com&quot; data-og-source-url=&quot;https://iamgus.tistory.com/719&quot; data-og-url=&quot;https://iamgus.tistory.com/719&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hRiYr/hyVVAZbxGg/7O9knUGEMvigCWlBtAVlF1/img.png?width=679&amp;amp;height=498&amp;amp;face=0_0_679_498,https://scrap.kakaocdn.net/dn/bfPYI6/hyVZfsixvE/lHDT98rsONMrKHNkOJrlYk/img.png?width=679&amp;amp;height=498&amp;amp;face=0_0_679_498,https://scrap.kakaocdn.net/dn/u5tlJ/hyVZs6ggq2/KKbpcK5GeJ9OV7QnXu0LE1/img.png?width=679&amp;amp;height=498&amp;amp;face=0_0_679_498&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/719&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iamgus.tistory.com/719&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hRiYr/hyVVAZbxGg/7O9knUGEMvigCWlBtAVlF1/img.png?width=679&amp;amp;height=498&amp;amp;face=0_0_679_498,https://scrap.kakaocdn.net/dn/bfPYI6/hyVZfsixvE/lHDT98rsONMrKHNkOJrlYk/img.png?width=679&amp;amp;height=498&amp;amp;face=0_0_679_498,https://scrap.kakaocdn.net/dn/u5tlJ/hyVZs6ggq2/KKbpcK5GeJ9OV7QnXu0LE1/img.png?width=679&amp;amp;height=498&amp;amp;face=0_0_679_498');&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;2024 최고의 가성비 노트북 찾아라!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;올해 최고의 가성비 노트북을 찾는 방법가성비 노트북을 찾는 것은 어려운 일입니다. 노트북 시장은 다양한 브랜드와 기술의 발전으로 수많은 제품이 나타났다 사라집니다. 선택 폭이 그만큼&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iamgus.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;프롬프트는 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;lt;제품1&amp;gt; &lt;br /&gt;LG전자&amp;nbsp;LG그램&amp;nbsp;15ZD90S-GX76K &lt;br /&gt;가격&amp;nbsp;:&amp;nbsp;1,699,000원 &lt;br /&gt;화면크기&amp;nbsp;:&amp;nbsp;39.6cm(15.6인치)무게&amp;nbsp;:&amp;nbsp;1.29kg종류&amp;nbsp;:&amp;nbsp;코어&amp;nbsp;울트라&amp;nbsp;7출시OS&amp;nbsp;:&amp;nbsp;미포함(FreeDos)코어종류&amp;nbsp;:&amp;nbsp;14코어(6P+8E)인텔&amp;nbsp;GPU&amp;nbsp;:&amp;nbsp;인텔Arc램&amp;nbsp;:&amp;nbsp;16GBSSD&amp;nbsp;:&amp;nbsp;256GB &lt;br /&gt;&lt;br /&gt;&amp;lt;제품2&amp;gt; &lt;br /&gt;삼성전자&amp;nbsp;갤럭시북4&amp;nbsp;프로&amp;nbsp;NT940XGQ-A71A &lt;br /&gt;가격&amp;nbsp;:&amp;nbsp;1,798,990원 &lt;br /&gt;화면크기&amp;nbsp;:&amp;nbsp;35.6cm(14인치)무게&amp;nbsp;:&amp;nbsp;1.23kg종류&amp;nbsp;:&amp;nbsp;코어&amp;nbsp;울트라&amp;nbsp;7출시OS&amp;nbsp;:&amp;nbsp;리눅스코어종류&amp;nbsp;:&amp;nbsp;14코어(6P+8E)램&amp;nbsp;:&amp;nbsp;16GBSSD&amp;nbsp;:&amp;nbsp;256GB코드명&amp;nbsp;:&amp;nbsp;메테오레이크 &lt;br /&gt;&lt;br /&gt;위&amp;nbsp;제품&amp;nbsp;2개를&amp;nbsp;이용해&amp;nbsp;올해&amp;nbsp;최고의&amp;nbsp;가성비&amp;nbsp;노트북이란&amp;nbsp;주제로&amp;nbsp;포스트를&amp;nbsp;작성하세요.&amp;nbsp; &lt;br /&gt;한글로&amp;nbsp;작성합니다.&amp;nbsp; &lt;br /&gt;제품&amp;nbsp;정보에&amp;nbsp;적절한&amp;nbsp;제목과&amp;nbsp;내용을&amp;nbsp;작성하세요.&amp;nbsp;SEO를&amp;nbsp;고려해야&amp;nbsp;합니다.&amp;nbsp; &lt;br /&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;문맥에&amp;nbsp;묻어나게&amp;nbsp;작성해줘. &lt;br /&gt;&lt;br /&gt;초반에는&amp;nbsp;&amp;nbsp;노트북을&amp;nbsp;선택하는&amp;nbsp;방법에&amp;nbsp;아래&amp;nbsp;예시를&amp;nbsp;참고해&amp;nbsp;작성해줘. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[예시] &lt;br /&gt;&quot;가성비&amp;nbsp;노트북&amp;nbsp;고르는&amp;nbsp;방법&amp;nbsp;7가지 &lt;br /&gt;아래에서&amp;nbsp;소개해&amp;nbsp;드리는&amp;nbsp;7가지&amp;nbsp;스펙은&amp;nbsp;가성비&amp;nbsp;노트북&amp;nbsp;구매를&amp;nbsp;하기&amp;nbsp;전에&amp;nbsp;필수적으로&amp;nbsp;확인해봐야&amp;nbsp;하는&amp;nbsp;사양들입니다.&amp;nbsp;짧게&amp;nbsp;소개해&amp;nbsp;드릴&amp;nbsp;테니&amp;nbsp;놓치지&amp;nbsp;마시고&amp;nbsp;읽어보시길&amp;nbsp;바랍니다. &lt;br /&gt;CPU &lt;br /&gt;컴퓨터의&amp;nbsp;두뇌역할을&amp;nbsp;하며&amp;nbsp;CPU&amp;nbsp;성능을&amp;nbsp;결정하는&amp;nbsp;핵심&amp;nbsp;스펙입니다.&amp;nbsp;CPU&amp;nbsp;제조사는&amp;nbsp;크게&amp;nbsp;인텔과&amp;nbsp;AMD로&amp;nbsp;나뉩니다. &lt;br /&gt;인텔&amp;nbsp;CPU&amp;nbsp;좋은&amp;nbsp;순서&amp;nbsp;:&amp;nbsp;i9&amp;nbsp;&amp;gt;i7&amp;nbsp;&amp;gt;&amp;nbsp;i3&amp;nbsp;&amp;gt;&amp;nbsp;펜티엄&amp;nbsp;&amp;gt;&amp;nbsp;셀러론 &lt;br /&gt;AMD&amp;nbsp;라이젠&amp;nbsp;CPU&amp;nbsp;좋은&amp;nbsp;순서&amp;nbsp;:&amp;nbsp;9&amp;nbsp;&amp;gt;&amp;nbsp;7&amp;nbsp;&amp;gt;&amp;nbsp;6&amp;nbsp;&amp;gt;&amp;nbsp;3&amp;nbsp;&amp;gt;&amp;nbsp;애슬론 &lt;br /&gt;가성비&amp;nbsp;노트북&amp;nbsp;CPU로는&amp;nbsp;인텔은&amp;nbsp;i5이상,&amp;nbsp;그리고&amp;nbsp;AMD는&amp;nbsp;라이젠5&amp;nbsp;이상을&amp;nbsp;추천합니다.&amp;nbsp;그래야지&amp;nbsp;원활한&amp;nbsp;사무작업&amp;nbsp;및&amp;nbsp;웹서핑과&amp;nbsp;포토샵,&amp;nbsp;일러스트,&amp;nbsp;그리고&amp;nbsp;간단한&amp;nbsp;영상&amp;nbsp;편집을&amp;nbsp;무리&amp;nbsp;없이&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;RAM &lt;br /&gt;&amp;lsquo;다다익램&amp;rsquo;이라는&amp;nbsp;말은&amp;nbsp;언제나&amp;nbsp;진리입니다.&amp;nbsp;이는&amp;nbsp;램은&amp;nbsp;많을수록&amp;nbsp;좋다는&amp;nbsp;의미입니다.&amp;nbsp;램이&amp;nbsp;많을수록&amp;nbsp;다양한&amp;nbsp;작업을&amp;nbsp;해도&amp;nbsp;컴퓨터가&amp;nbsp;뻗지&amp;nbsp;않고&amp;nbsp;잘&amp;nbsp;돌아갑니다. &lt;br /&gt;정말&amp;nbsp;간단한&amp;nbsp;사무용이라면&amp;nbsp;4GB도&amp;nbsp;괜찮지만,&amp;nbsp;솔직히&amp;nbsp;말씀드리자면&amp;nbsp;요즘에는&amp;nbsp;인터넷&amp;nbsp;창을&amp;nbsp;여러&amp;nbsp;개&amp;nbsp;띄우면서&amp;nbsp;문서작업을&amp;nbsp;하면&amp;nbsp;4GB로는&amp;nbsp;부족하게&amp;nbsp;느껴집니다. &lt;br /&gt;가성비&amp;nbsp;노트북에서&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;발휘하기&amp;nbsp;위해서는&amp;nbsp;적어도&amp;nbsp;8GB&amp;nbsp;이상의&amp;nbsp;램을&amp;nbsp;추천합니다. &lt;br /&gt;저장용량 &lt;br /&gt;저장장치의&amp;nbsp;종류로는&amp;nbsp;HDD와&amp;nbsp;SDD가&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;중에서&amp;nbsp;메인으로&amp;nbsp;사용하실&amp;nbsp;저장장치로는&amp;nbsp;무조건&amp;nbsp;SSD를&amp;nbsp;고르시는&amp;nbsp;것이&amp;nbsp;좋습니다. &lt;br /&gt;그&amp;nbsp;이유는&amp;nbsp;HDD에&amp;nbsp;비해서&amp;nbsp;속도가&amp;nbsp;매우&amp;nbsp;빠르며&amp;nbsp;충격에도&amp;nbsp;강하기&amp;nbsp;때문입니다.&amp;nbsp;또한,&amp;nbsp;간단한&amp;nbsp;게임을&amp;nbsp;한두&amp;nbsp;개&amp;nbsp;설치하시려면&amp;nbsp;SSD&amp;nbsp;용량은&amp;nbsp;256GB&amp;nbsp;이상을&amp;nbsp;선택하시길&amp;nbsp;바랍니다. &lt;br /&gt;화면크기 &lt;br /&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;텐데요. &lt;br /&gt;15.6인치는&amp;nbsp;휴대성&amp;nbsp;및&amp;nbsp;화면에&amp;nbsp;부족함이&amp;nbsp;없는&amp;nbsp;크기이며,&amp;nbsp;14인치&amp;nbsp;이하부터는&amp;nbsp;실제로&amp;nbsp;화면을&amp;nbsp;보면&amp;nbsp;확실히&amp;nbsp;작아&amp;nbsp;보입니다.&amp;nbsp;단&amp;nbsp;그만큼&amp;nbsp;무게는&amp;nbsp;적게&amp;nbsp;나갑니다. &lt;br /&gt;휴대성과&amp;nbsp;무게를&amp;nbsp;고려할&amp;nbsp;때&amp;nbsp;가성비&amp;nbsp;노트북으로는&amp;nbsp;14인치&amp;nbsp;또는&amp;nbsp;15.6인치의&amp;nbsp;제품을&amp;nbsp;구매하시는&amp;nbsp;것이&amp;nbsp;좋습니다. &lt;br /&gt;무게 &lt;br /&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;중에서는&amp;nbsp;15인치&amp;nbsp;제품인데도&amp;nbsp;불구하고&amp;nbsp;1.1kg~1.3kg&amp;nbsp;정도의&amp;nbsp;무게인&amp;nbsp;제품들이&amp;nbsp;있습니다. &lt;br /&gt;그러나&amp;nbsp;가성비&amp;nbsp;노트북에서는&amp;nbsp;어느&amp;nbsp;정도&amp;nbsp;무게는&amp;nbsp;타협하셔야&amp;nbsp;합니다.&amp;nbsp;가성비&amp;nbsp;노트북에서&amp;nbsp;15인치&amp;nbsp;제품을&amp;nbsp;구매하실&amp;nbsp;경우&amp;nbsp;1.5kg을&amp;nbsp;기준으로&amp;nbsp;잡으시고&amp;nbsp;1.3kg~1.8kg&amp;nbsp;사이의&amp;nbsp;제품을&amp;nbsp;구매하시는&amp;nbsp;것이&amp;nbsp;좋습니다. &lt;br /&gt;해상도&amp;nbsp;및&amp;nbsp;패널 &lt;br /&gt;현재&amp;nbsp;대부분의&amp;nbsp;노트북&amp;nbsp;해상도는&amp;nbsp;FHD&amp;nbsp;이상입니다.&amp;nbsp;여기서&amp;nbsp;본격적으로&amp;nbsp;고민해봐야&amp;nbsp;할&amp;nbsp;것은&amp;nbsp;패널입니다. &lt;br /&gt;대게&amp;nbsp;패널은&amp;nbsp;가성비&amp;nbsp;노트북이라고&amp;nbsp;하더라도&amp;nbsp;광시야각&amp;nbsp;패널인&amp;nbsp;IPS&amp;nbsp;패널을&amp;nbsp;많이&amp;nbsp;사용합니다.&amp;nbsp;이때&amp;nbsp;IPS&amp;nbsp;패널은&amp;nbsp;종류에&amp;nbsp;따라서&amp;nbsp;색&amp;nbsp;재현력이&amp;nbsp;달라집니다. &lt;br /&gt;고급형&amp;nbsp;IPS패널은&amp;nbsp;NTSC&amp;nbsp;72%,&amp;nbsp;srbg100%,&amp;nbsp;DCI-P3&amp;nbsp;100%와&amp;nbsp;같은&amp;nbsp;스펙으로&amp;nbsp;작성되어&amp;nbsp;있으며&amp;nbsp;보급형&amp;nbsp;IPS&amp;nbsp;패널보다&amp;nbsp;뛰어난&amp;nbsp;색감을&amp;nbsp;자랑합니다.&amp;nbsp;영상편집&amp;nbsp;혹은&amp;nbsp;그래픽작업을&amp;nbsp;하시는&amp;nbsp;분들께는&amp;nbsp;고급형&amp;nbsp;IPS&amp;nbsp;패널이&amp;nbsp;좋습니다. &lt;br /&gt;보급형&amp;nbsp;IPS패널은&amp;nbsp;srgb&amp;nbsp;62.5%,&amp;nbsp;NTSC&amp;nbsp;45%와&amp;nbsp;같은&amp;nbsp;스펙을&amp;nbsp;사용하며&amp;nbsp;특별히&amp;nbsp;색감에&amp;nbsp;민감하지&amp;nbsp;않으신&amp;nbsp;때에&amp;nbsp;충분히&amp;nbsp;만족하고&amp;nbsp;사용하셔도&amp;nbsp;전혀&amp;nbsp;문제가&amp;nbsp;없습니다. &lt;br /&gt;그래픽카드 &lt;br /&gt;노트북의&amp;nbsp;그래픽카드는&amp;nbsp;내장&amp;nbsp;그래픽을&amp;nbsp;지원하면서&amp;nbsp;제품에&amp;nbsp;따라&amp;nbsp;외장그래픽이&amp;nbsp;추가로&amp;nbsp;탑재되어&amp;nbsp;있습니다. &lt;br /&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;외장그래픽으로&amp;nbsp;작동이&amp;nbsp;되는&amp;nbsp;방식입니다. &lt;br /&gt;최근에는&amp;nbsp;내장그래픽도&amp;nbsp;기술&amp;nbsp;수준이&amp;nbsp;올라가면서&amp;nbsp;Iris&amp;nbsp;Xe&amp;nbsp;내장그래픽&amp;nbsp;정도만&amp;nbsp;사용해도&amp;nbsp;롤이나&amp;nbsp;간단한&amp;nbsp;포토샵&amp;nbsp;및&amp;nbsp;프리미어&amp;nbsp;영상편집&amp;nbsp;작업이&amp;nbsp;가능해졌습니다. &lt;br /&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;바랍니다. &lt;br /&gt;외장그래픽&amp;nbsp;카드가&amp;nbsp;탑재된&amp;nbsp;노트북은&amp;nbsp;게이밍&amp;nbsp;노트북이&amp;nbsp;많으며&amp;nbsp;주로&amp;nbsp;지포스&amp;nbsp;RTX,&amp;nbsp;GTX&amp;nbsp;등의&amp;nbsp;그래픽카드가&amp;nbsp;탑재되어&amp;nbsp;있습니다.&quot; &lt;br /&gt;&lt;br /&gt;그&amp;nbsp;다음으로는&amp;nbsp;선정된&amp;nbsp;노트북의&amp;nbsp;목록과&amp;nbsp;각&amp;nbsp;제품의&amp;nbsp;특징을&amp;nbsp;설명해주세요.&amp;nbsp; &lt;br /&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;사용&amp;nbsp;경험을&amp;nbsp;설명해주세요.&amp;nbsp; &lt;br /&gt;제품&amp;nbsp;소개시&amp;nbsp;아래&amp;nbsp;예시를&amp;nbsp;참고해서&amp;nbsp;작성해줘. &lt;br /&gt;[예시] &lt;br /&gt;&quot;레노버&amp;nbsp;2023&amp;nbsp;V15&amp;nbsp;G4&amp;nbsp;AMN&amp;nbsp;15.6은&amp;nbsp;2023년에&amp;nbsp;출시된&amp;nbsp;노트북으로,&amp;nbsp;가성비와&amp;nbsp;기능성을&amp;nbsp;중시하는&amp;nbsp;사용자들을&amp;nbsp;위한&amp;nbsp;제품으로&amp;nbsp;두드러집니다. &lt;br /&gt;AMD&amp;nbsp;라이젠5&amp;nbsp;프로세서와&amp;nbsp;8GB&amp;nbsp;RAM,&amp;nbsp;SSD(NVMe)를&amp;nbsp;탑재하여&amp;nbsp;뛰어난&amp;nbsp;성능을&amp;nbsp;자랑합니다.&amp;nbsp;특히&amp;nbsp;SSD의&amp;nbsp;탑재로&amp;nbsp;인해&amp;nbsp;부팅&amp;nbsp;속도가&amp;nbsp;빠르고&amp;nbsp;응용&amp;nbsp;프로그램의&amp;nbsp;실행&amp;nbsp;속도도&amp;nbsp;향상되어,&amp;nbsp;사용자들은&amp;nbsp;작업을&amp;nbsp;효율적으로&amp;nbsp;수행할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&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;시청은&amp;nbsp;물론이고,&amp;nbsp;간단한&amp;nbsp;게임도&amp;nbsp;무난하게&amp;nbsp;즐길&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;15.6인치의&amp;nbsp;화면은&amp;nbsp;선명한&amp;nbsp;해상도와&amp;nbsp;충분한&amp;nbsp;밝기를&amp;nbsp;제공하여&amp;nbsp;사용자들에게&amp;nbsp;시각적으로&amp;nbsp;풍부한&amp;nbsp;경험을&amp;nbsp;선사합니다. &lt;br /&gt;배터리&amp;nbsp;수명도&amp;nbsp;강점&amp;nbsp;중&amp;nbsp;하나입니다.&amp;nbsp;47Wh&amp;nbsp;배터리를&amp;nbsp;탑재하여&amp;nbsp;사용자들은&amp;nbsp;긴&amp;nbsp;시간&amp;nbsp;동안&amp;nbsp;노트북을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;외부&amp;nbsp;환경에서도&amp;nbsp;배터리&amp;nbsp;용량에&amp;nbsp;대한&amp;nbsp;걱정&amp;nbsp;없이&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;단점&amp;nbsp;중&amp;nbsp;하나는&amp;nbsp;무게입니다.&amp;nbsp;1.65kg의&amp;nbsp;무게는&amp;nbsp;휴대성을&amp;nbsp;고려할&amp;nbsp;때&amp;nbsp;조금&amp;nbsp;부담스러울&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이는&amp;nbsp;사용자들이&amp;nbsp;이동하면서&amp;nbsp;노트북을&amp;nbsp;사용하는&amp;nbsp;경우&amp;nbsp;고려해야&amp;nbsp;할&amp;nbsp;사항입니다. &lt;br /&gt;레노버&amp;nbsp;2023&amp;nbsp;V15&amp;nbsp;G4&amp;nbsp;AMN&amp;nbsp;15.6은&amp;nbsp;가성비와&amp;nbsp;고성능을&amp;nbsp;중시하는&amp;nbsp;사용자들에게&amp;nbsp;적합한&amp;nbsp;제품입니다. &lt;br /&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;합리적인&amp;nbsp;가격대로&amp;nbsp;구매할&amp;nbsp;수&amp;nbsp;있습니다.&quot; &lt;br /&gt;&lt;br /&gt;제공된&amp;nbsp;정보에&amp;nbsp;없는&amp;nbsp;내용을&amp;nbsp;지어내면&amp;nbsp;절대&amp;nbsp;안된다.&amp;nbsp; &lt;br /&gt;제공된&amp;nbsp;정보에&amp;nbsp;어려운&amp;nbsp;용어가&amp;nbsp;있다면&amp;nbsp;간단하게&amp;nbsp;설명해줘. &lt;br /&gt;마지막으로는&amp;nbsp;결론을&amp;nbsp;작성하여&amp;nbsp;독자들이&amp;nbsp;합리적인&amp;nbsp;선택을&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;유도해주세요. &lt;br /&gt;&lt;br /&gt;올해&amp;nbsp;최고의&amp;nbsp;가성비&amp;nbsp;노트북을&amp;nbsp;선정하기&amp;nbsp;위해&amp;nbsp;포스팅을&amp;nbsp;작성해주세요.&amp;nbsp; &lt;br /&gt;초반에는&amp;nbsp;이&amp;nbsp;글을&amp;nbsp;작성하게&amp;nbsp;된&amp;nbsp;이유를&amp;nbsp;무겁지&amp;nbsp;않게&amp;nbsp;소개하고,&amp;nbsp; &lt;br /&gt;다음으로는&amp;nbsp;가성비&amp;nbsp;노트북을&amp;nbsp;선택하는&amp;nbsp;방법에&amp;nbsp;대해&amp;nbsp;5가지를&amp;nbsp;알려주세요.&amp;nbsp; &lt;br /&gt;&lt;br /&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;설명해주세요.&amp;nbsp; &lt;br /&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;설명해&amp;nbsp;주세요.&amp;nbsp; &lt;br /&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;제품&amp;nbsp;스펙을&amp;nbsp;한눈에&amp;nbsp;보기좋게&amp;nbsp;표로&amp;nbsp;작성하세요.&amp;nbsp; &lt;br /&gt;제품명과&amp;nbsp;가격은&amp;nbsp;중요하니&amp;nbsp;잘&amp;nbsp;표현되도록&amp;nbsp;하세요.&amp;nbsp; &lt;br /&gt;&lt;br /&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;할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;글을&amp;nbsp;작성하고&amp;nbsp;마무리&amp;nbsp;바랍니다.&amp;nbsp; &lt;br /&gt;글은&amp;nbsp;2500자&amp;nbsp;내외로&amp;nbsp;작성하세요. &lt;br /&gt;&quot;제목&quot;,&quot;서론&quot;,&quot;본론&quot;&amp;nbsp;이런&amp;nbsp;단어들을&amp;nbsp;사용하지&amp;nbsp;말고&amp;nbsp;글의&amp;nbsp;문맥에&amp;nbsp;자연스럽게&amp;nbsp;녹아들게&amp;nbsp;하세요. &lt;br /&gt;마크다운으로&amp;nbsp;작성하세요.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;</description>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/720</guid>
      <comments>https://iamgus.tistory.com/720#entry720comment</comments>
      <pubDate>Wed, 1 May 2024 11:05:23 +0900</pubDate>
    </item>
    <item>
      <title>2024 최고의 가성비 노트북 찾아라!</title>
      <link>https://iamgus.tistory.com/719</link>
      <description>&lt;h1&gt;올해 최고의 가성비 노트북을 찾는 방법&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가성비 노트북을 찾는 것은 어려운 일입니다. 노트북 시장은 다양한 브랜드와 기술의 발전으로 수많은 제품이 나타났다 사라집니다. 선택 폭이 그만큼 넓어서 선택하기 어렵다는 거죠. 그래서 가성비 노트북을 고르는 방법 5가지를 살펴보고, 이어지는 가성비 노트북 BEST&amp;nbsp; 제품을 확인하면 노트북 구매에 큰 도움이 될 것입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. CPU 성능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인텔과 AMD 중 어떤 프로세서를 선호하시나요?&lt;/li&gt;
&lt;li&gt;작업에 따라 필요한 코어 수와 주파수를 고려해보세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. RAM 용량&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;램이 많을수록 다양한 작업을 더욱 효율적으로 처리할 수 있습니다.&lt;/li&gt;
&lt;li&gt;작업의 복잡도에 맞는 램 용량을 선택하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 저장 공간&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SSD는 빠른 부팅과 응용 프로그램 실행 속도를 제공합니다.&lt;/li&gt;
&lt;li&gt;필요에 따라 저장 용량을 선택하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 화면 크기와 해상도&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;휴대성과 시각적 편의성을 고려하여 적절한 크기와 해상도를 선택하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 무게와 배터리 수명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이동 중인 경우 무게가 중요합니다.&lt;/li&gt;
&lt;li&gt;긴 사용 시간을 위해 배터리 수명을 확인하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 올해의 최고 가성비 노트북 후보인 LG전자 LG그램 15ZD90S-GX76K와 삼성전자 갤럭시북4 프로 NT940XGQ-A71A를 살펴보겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;LG전자 LG그램 15ZD90S-GX76K&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D80Yu/btsG53AzUvI/0sSEfuBS4HNdU6eYMF8oLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D80Yu/btsG53AzUvI/0sSEfuBS4HNdU6eYMF8oLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D80Yu/btsG53AzUvI/0sSEfuBS4HNdU6eYMF8oLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD80Yu%2FbtsG53AzUvI%2F0sSEfuBS4HNdU6eYMF8oLK%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;679&quot; height=&quot;498&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가격:&lt;/b&gt; 1,699,000원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;화면크기:&lt;/b&gt; 39.6cm(15.6인치)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;무게:&lt;/b&gt; 1.29kg&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코어 종류:&lt;/b&gt; 코어 울트라 7&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출시 OS:&lt;/b&gt; 미포함(FreeDos)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코어 종류:&lt;/b&gt; 14코어(6P+8E) 인텔&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GPU:&lt;/b&gt; 인텔 Arc&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RAM:&lt;/b&gt; 16GB&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SSD:&lt;/b&gt; 256GB&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LG그램 15ZD90S-GX76K는 가벼운 무게와 뛰어난 성능을 동시에 제공합니다. 15.6인치의 큰 화면은 멀티태스킹에 탁월하며, 코어 울트라 7 프로세서와 16GB의 RAM은 다양한 작업을 원활하게 수행할 수 있습니다. SSD는 부팅과 응용 프로그램 실행이 빠르며, 인텔 Arc 그래픽은 그래픽 작업을 원활하게 지원합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;삼성전자 갤럭시북4 프로 NT940XGQ-A71A&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MENmc/btsG3BZTBen/XEb6clmjd4vHvfqZuIJIK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MENmc/btsG3BZTBen/XEb6clmjd4vHvfqZuIJIK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MENmc/btsG3BZTBen/XEb6clmjd4vHvfqZuIJIK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMENmc%2FbtsG3BZTBen%2FXEb6clmjd4vHvfqZuIJIK1%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;415&quot; height=&quot;323&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가격:&lt;/b&gt; 1,798,990원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;화면크기:&lt;/b&gt; 35.6cm(14인치)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;무게:&lt;/b&gt; 1.23kg&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코어 종류:&lt;/b&gt; 코어 울트라 7&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출시 OS:&lt;/b&gt; 리눅스&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드명:&lt;/b&gt; 메테오레이크&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삼성 갤럭시북4 프로 NT940XGQ-A71A는 가볍고 슬림한 디자인으로 휴대성이 뛰어납니다. 14인치 화면은 이동성과 시각적 편의성을 제공하며, 코어 울트라 7 프로세서와 16GB RAM은 다양한 작업을 처리할 수 있습니다. 또한, 리눅스 운영 체제를 기반으로 하여 다양한 개발 및 프로그래밍 작업에 적합합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 두 제품을 한눈에 비교해보겠습니다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;th&gt;LG그램 15ZD90S-GX76K&lt;/th&gt;
&lt;th&gt;삼성 갤럭시북4 프로 NT940XGQ-A71A&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;가격&lt;/td&gt;
&lt;td&gt;1,699,000원&lt;/td&gt;
&lt;td&gt;1,798,990원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;화면크기&lt;/td&gt;
&lt;td&gt;39.6cm(15.6인치)&lt;/td&gt;
&lt;td&gt;35.6cm(14인치)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;무게&lt;/td&gt;
&lt;td&gt;1.29kg&lt;/td&gt;
&lt;td&gt;1.23kg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;운영 체제&lt;/td&gt;
&lt;td&gt;미포함(FreeDos)&lt;/td&gt;
&lt;td&gt;리눅스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로세서&lt;/td&gt;
&lt;td&gt;코어 울트라 7&lt;/td&gt;
&lt;td&gt;코어 울트라 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;16GB&lt;/td&gt;
&lt;td&gt;16GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSD&lt;/td&gt;
&lt;td&gt;256GB&lt;/td&gt;
&lt;td&gt;256GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;그래픽카드&lt;/td&gt;
&lt;td&gt;인텔 Arc&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 여러분의 사용 목적과 예산에 따라 최적의 선택을 할 수 있을 것입니다. 이러한 비교를 통해 노트북을 구매하는 데 도움이 되기를 바랍니다.&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <category>가성비노트북</category>
      <category>노트북</category>
      <category>테크리뷰</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/719</guid>
      <comments>https://iamgus.tistory.com/719#entry719comment</comments>
      <pubDate>Wed, 1 May 2024 10:51:55 +0900</pubDate>
    </item>
    <item>
      <title>선택받는 쿠팡 프롬프트 작성 꿀팁!</title>
      <link>https://iamgus.tistory.com/718</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbeWto/btsG0uzCik1/URJ5jpjMRxOZB6isk5KKxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbeWto/btsG0uzCik1/URJ5jpjMRxOZB6isk5KKxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbeWto/btsG0uzCik1/URJ5jpjMRxOZB6isk5KKxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbeWto%2FbtsG0uzCik1%2FURJ5jpjMRxOZB6isk5KKxk%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;741&quot; height=&quot;709&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 글은 사람이 직접 작성했을까!? 아니면 chatbot을 이용했을까... 결론은 아직은 잘 모르겠다. 다른 포스트를 훑어보면 큰 틀은 비슷한데, 조금씩 제품 소개 패턴이 달라진다. 사람의 개입이 들어가는 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 리뷰 포스트의 프롬프트를 알아내 작성할 수 있다면 질좋은 글을 작성할 수 있지 않겠는가. 하지만 당연히 쉽지 않다. 어떻게 작성했는지 어떤 걸 참조했는지도 모르니까 말이다. 전체 적인 구성을 분석해 프롬프트를 작성해 보았다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;lt;제품1&amp;gt; &lt;br /&gt;레노버&amp;nbsp;2021&amp;nbsp;IdeaPad&amp;nbsp;Slim3&amp;nbsp;15ITL&amp;nbsp;15.6 &lt;br /&gt;-가격:&amp;nbsp;491,480원 &lt;br /&gt;-ARCTIC&amp;nbsp;GREY&amp;nbsp;&amp;middot;&amp;nbsp;코어i3&amp;nbsp;&amp;middot;&amp;nbsp;256GB&amp;nbsp;&amp;middot;&amp;nbsp;4GB&amp;nbsp;&amp;middot;&amp;nbsp;Free&amp;nbsp;DOS&amp;nbsp;&amp;middot;&amp;nbsp;82H800GEKR &lt;br /&gt;-CPU&amp;nbsp;모델&amp;nbsp;번호:&amp;nbsp;1115G4 &lt;br /&gt;-GPU&amp;nbsp;모델명:&amp;nbsp;인텔&amp;nbsp;UHD&amp;nbsp;그래픽스 &lt;br /&gt;-화면크기:&amp;nbsp;39.6cm &lt;br /&gt;-화면크기(인치):&amp;nbsp;약&amp;nbsp;15.6인치에&amp;nbsp;해당함 &lt;br /&gt;-CPU&amp;nbsp;기본속도:&amp;nbsp;3GHz &lt;br /&gt;&lt;br /&gt;&amp;lt;제품2&amp;gt; &lt;br /&gt;LG전자&amp;nbsp;2022&amp;nbsp;그램14&amp;nbsp;노트북 &lt;br /&gt;-가격:&amp;nbsp;1,203,000원 &lt;br /&gt;-블랙&amp;nbsp;&amp;middot;&amp;nbsp;코어i5&amp;nbsp;11세대&amp;nbsp;&amp;middot;&amp;nbsp;256GB&amp;nbsp;&amp;middot;&amp;nbsp;8GB&amp;nbsp;&amp;middot;&amp;nbsp;Free&amp;nbsp;DOS&amp;nbsp;&amp;middot;&amp;nbsp;14ZD95P-GX5BK &lt;br /&gt;-CPU&amp;nbsp;모델&amp;nbsp;번호:&amp;nbsp;코어i5-1155G7 &lt;br /&gt;-화면크기:&amp;nbsp;35.6cm &lt;br /&gt;-CPU&amp;nbsp;기본속도:&amp;nbsp;2.5GHz &lt;br /&gt;-패널:&amp;nbsp;IPS &lt;br /&gt;-해상도&amp;nbsp;(해상도&amp;nbsp;등급):&amp;nbsp;WUXGA &lt;br /&gt;&lt;br /&gt;Keyword:&amp;nbsp;가성비&amp;nbsp;노트북 &lt;br /&gt;----------- &lt;br /&gt;위&amp;nbsp;제품&amp;nbsp;정보를&amp;nbsp;사용하여&amp;nbsp;블로그&amp;nbsp;포스팅을&amp;nbsp;작성해줘. &lt;br /&gt;규칙은&amp;nbsp;다음과&amp;nbsp;같아.&amp;nbsp;꼭&amp;nbsp;지켜야돼.&amp;nbsp;지키지&amp;nbsp;않으면&amp;nbsp;벌칙이&amp;nbsp;있어 &lt;br /&gt;-&amp;nbsp;한글을&amp;nbsp;사용하고&amp;nbsp;존댓말로&amp;nbsp;작성한다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;내용에&amp;nbsp;맞춰서&amp;nbsp;적절한&amp;nbsp;제목을&amp;nbsp;만들어줘. &lt;br /&gt;-&amp;nbsp;서론,&amp;nbsp;본론,&amp;nbsp;결론&amp;nbsp;3단&amp;nbsp;구성으로&amp;nbsp;작성해 &lt;br /&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;설명해줘.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;본론에는&amp;nbsp;각&amp;nbsp;제품에&amp;nbsp;대한&amp;nbsp;소개를&amp;nbsp;작성한다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;각&amp;nbsp;제품을&amp;nbsp;소개할때는&amp;nbsp;제품&amp;nbsp;스펙을&amp;nbsp;전문가적인&amp;nbsp;입장에서&amp;nbsp;이해하기&amp;nbsp;쉽게&amp;nbsp;설명해줘. &lt;br /&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;작성한다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;각&amp;nbsp;제품을&amp;nbsp;소개할&amp;nbsp;때는&amp;nbsp;아래&amp;nbsp;예시를&amp;nbsp;참고해 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;삼성전자&amp;nbsp;노트북&amp;nbsp;플러스2는&amp;nbsp;가벼운&amp;nbsp;무게에&amp;nbsp;2022년형에서는&amp;nbsp;디스플레이&amp;nbsp;패널도&amp;nbsp;새롭게&amp;nbsp;채택하여&amp;nbsp;한&amp;nbsp;단계&amp;nbsp;더&amp;nbsp;발전한&amp;nbsp;모습으로&amp;nbsp;돌아온&amp;nbsp;제품입니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;셀로론&amp;nbsp;11세대&amp;nbsp;프로세서를&amp;nbsp;채택하여&amp;nbsp;무거운&amp;nbsp;문서&amp;nbsp;작업이나&amp;nbsp;온라인&amp;nbsp;강의&amp;nbsp;시청,&amp;nbsp;웹서핑&amp;nbsp;등에&amp;nbsp;최적화되어&amp;nbsp;있는&amp;nbsp;가성비&amp;nbsp;노트북&amp;nbsp;추천&amp;nbsp;제품입니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;삼성전자&amp;nbsp;노트북&amp;nbsp;플러스2에&amp;nbsp;제공이&amp;nbsp;되는&amp;nbsp;SSD는&amp;nbsp;삼성의&amp;nbsp;M.2&amp;nbsp;NVME&amp;nbsp;SSD입니다.&amp;nbsp;SATA&amp;nbsp;SSD&amp;nbsp;보다&amp;nbsp;6.2배가&amp;nbsp;더&amp;nbsp;빠르며&amp;nbsp;소비전력도&amp;nbsp;낮으며,&amp;nbsp;내구성은&amp;nbsp;170만&amp;nbsp;시간일&amp;nbsp;정도로&amp;nbsp;긴&amp;nbsp;시간을&amp;nbsp;자랑합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;2021년형과&amp;nbsp;비교할&amp;nbsp;때&amp;nbsp;2022년형&amp;nbsp;삼성전자&amp;nbsp;노트북&amp;nbsp;플러스2에는&amp;nbsp;PLS패널을&amp;nbsp;채택하였는데요.&amp;nbsp;PLS패널은&amp;nbsp;전&amp;nbsp;사양인&amp;nbsp;TN패널에&amp;nbsp;비해서&amp;nbsp;시야각도&amp;nbsp;178도로&amp;nbsp;더&amp;nbsp;넓고&amp;nbsp;색상도&amp;nbsp;선명합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15.6인치의&amp;nbsp;크기의&amp;nbsp;삼성&amp;nbsp;PLS패널은&amp;nbsp;명암비가&amp;nbsp;100/1에&amp;nbsp;밝기가&amp;nbsp;300nit로&amp;nbsp;TN패널의&amp;nbsp;명암비&amp;nbsp;500/1,&amp;nbsp;그리고&amp;nbsp;밝기&amp;nbsp;250nit보다&amp;nbsp;더&amp;nbsp;우수한&amp;nbsp;패널&amp;nbsp;스펙을&amp;nbsp;자랑합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;무게는&amp;nbsp;1.89kg이며&amp;nbsp;바디도&amp;nbsp;18.8mm로&amp;nbsp;슬림한&amp;nbsp;바디를&amp;nbsp;자랑합니다.&amp;nbsp;베젤&amp;nbsp;두께는&amp;nbsp;6.95mm라서&amp;nbsp;모니터&amp;nbsp;화면이&amp;nbsp;넓게&amp;nbsp;보입니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;업그레이드가&amp;nbsp;편리하게&amp;nbsp;되어&amp;nbsp;있습니다.&amp;nbsp;HDD&amp;nbsp;및&amp;nbsp;메모리&amp;nbsp;업그레이드가&amp;nbsp;쉽게&amp;nbsp;가능한데&amp;nbsp;SSD와&amp;nbsp;HDD를&amp;nbsp;동시에&amp;nbsp;사용하는&amp;nbsp;것도&amp;nbsp;가능합니다. &lt;br /&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;편리하게&amp;nbsp;작업이&amp;nbsp;가능합니다.&amp;nbsp;타이핑도&amp;nbsp;장시간&amp;nbsp;타이핑에도&amp;nbsp;피로감이&amp;nbsp;적게&amp;nbsp;느껴집니다.&quot; &lt;br /&gt;-&amp;nbsp;각&amp;nbsp;제품&amp;nbsp;소개&amp;nbsp;후&amp;nbsp;본론에는&amp;nbsp;상세&amp;nbsp;스펙을&amp;nbsp;표형태로&amp;nbsp;작성해줘. &lt;br /&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;있다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;전체&amp;nbsp;내용은&amp;nbsp;최소&amp;nbsp;2,500글자&amp;nbsp;이상&amp;nbsp;작성한다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;제공된&amp;nbsp;정보에&amp;nbsp;없는&amp;nbsp;내용을&amp;nbsp;지어내면&amp;nbsp;절대&amp;nbsp;안된다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;제공된&amp;nbsp;정보에&amp;nbsp;어려운&amp;nbsp;용어가&amp;nbsp;있다면&amp;nbsp;간단하게&amp;nbsp;설명해줘. &lt;br /&gt;-&amp;nbsp;마크다운&amp;nbsp;형식으로&amp;nbsp;글을&amp;nbsp;만들어줘. &lt;br /&gt;-&amp;nbsp;소제목을&amp;nbsp;제품&amp;nbsp;정보에&amp;nbsp;알맞게&amp;nbsp;만들어줘. &lt;br /&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;'선택을&amp;nbsp;하기를&amp;nbsp;권장합니다,&amp;nbsp;선택하시기&amp;nbsp;바랍니다,&amp;nbsp;선택이&amp;nbsp;중요합니다.'&amp;nbsp;이런식으로&amp;nbsp;비슷한&amp;nbsp;내용이라도&amp;nbsp;항상&amp;nbsp;다르게&amp;nbsp;써야돼. &lt;br /&gt;-&amp;nbsp;검색엔진&amp;nbsp;최적화&amp;nbsp;전략을&amp;nbsp;적극적으로&amp;nbsp;사용한다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;제품&amp;nbsp;정보에&amp;nbsp;맞춰서&amp;nbsp;적절한&amp;nbsp;제목을&amp;nbsp;먼저&amp;nbsp;생각한다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;표의&amp;nbsp;내용에는&amp;nbsp;최대한&amp;nbsp;많은&amp;nbsp;항목을&amp;nbsp;넣어서&amp;nbsp;만들어줘. &lt;br /&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;제공한&amp;nbsp;제품&amp;nbsp;정보에&amp;nbsp;있어. &lt;br /&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;규칙이야.&amp;nbsp; &lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chatgpt 답변은 아래와 같다. 아직 어색한 부분이 많아 사람이 직접 쓴 것처럼 보이게 하려면 많은 보정 작업이 필요할 것 같다.&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;770&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yXxbs/btsG2m8FOLE/H5iK8fV3smPTJ2SlSMRQG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yXxbs/btsG2m8FOLE/H5iK8fV3smPTJ2SlSMRQG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yXxbs/btsG2m8FOLE/H5iK8fV3smPTJ2SlSMRQG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyXxbs%2FbtsG2m8FOLE%2FH5iK8fV3smPTJ2SlSMRQG0%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;770&quot; height=&quot;488&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;488&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://iamgus.tistory.com/717&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://iamgus.tistory.com/717&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714391908853&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;가성비 노트북 비교: 레노버 IdeaPad Slim3 15ITL vs LG전자 그램14&quot; data-og-description=&quot;가성비 노트북 비교: 레노버 IdeaPad Slim3 15ITL vs LG전자 그램14가성비 노트북 소개가성비 노트북을 선택할 때 고려해야 할 몇 가지 팁을 먼저 살펴보겠습니다. 이어서 각 제품의 특징과 성능을 자세&quot; data-og-host=&quot;iamgus.tistory.com&quot; data-og-source-url=&quot;https://iamgus.tistory.com/717&quot; data-og-url=&quot;https://iamgus.tistory.com/717&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b7zjxF/hyVVDORQID/vtPd1le4DKDGPFvzUmXOC1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/0CEgR/hyVVFTsBqy/Hxss1WOrjK6lt2WcZrotB0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/717&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iamgus.tistory.com/717&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b7zjxF/hyVVDORQID/vtPd1le4DKDGPFvzUmXOC1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/0CEgR/hyVVFTsBqy/Hxss1WOrjK6lt2WcZrotB0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;가성비 노트북 비교: 레노버 IdeaPad Slim3 15ITL vs LG전자 그램14&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;가성비 노트북 비교: 레노버 IdeaPad Slim3 15ITL vs LG전자 그램14가성비 노트북 소개가성비 노트북을 선택할 때 고려해야 할 몇 가지 팁을 먼저 살펴보겠습니다. 이어서 각 제품의 특징과 성능을 자세&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iamgus.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;&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/718</guid>
      <comments>https://iamgus.tistory.com/718#entry718comment</comments>
      <pubDate>Mon, 29 Apr 2024 20:59:52 +0900</pubDate>
    </item>
    <item>
      <title>가성비 노트북 비교: 레노버 IdeaPad Slim3 15ITL vs LG전자 그램14</title>
      <link>https://iamgus.tistory.com/717</link>
      <description>&lt;h1&gt;가성비 노트북 비교: 레노버 IdeaPad Slim3 15ITL vs LG전자 그램14&lt;/h1&gt;
&lt;hr&gt;
&lt;h2&gt;가성비 노트북 소개&lt;/h2&gt;
&lt;p&gt;가성비 노트북을 선택할 때 고려해야 할 몇 가지 팁을 먼저 살펴보겠습니다. 이어서 각 제품의 특징과 성능을 자세히 알아보세요.&lt;/p&gt;
&lt;h3&gt;노트북 구매 팁&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;사용 목적에 맞는 사양 선택&lt;/strong&gt;: 노트북을 구매할 때 가장 중요한 것은 사용 목적에 맞는 적절한 사양을 선택하는 것입니다. 예를 들어, 일상적인 업무용이라면 충분한 성능을 제공하는 프로세서와 메모리가 필요합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;화면 크기와 해상도 고려&lt;/strong&gt;: 작업 환경에 따라 화면 크기와 해상도를 선택해야 합니다. 큰 화면이 필요하다면 15인치 이상의 노트북을 고려해보세요. 또한, 고해상도 화면은 선명한 이미지를 제공하여 시각적으로 편안한 작업을 가능하게 합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;저장 공간 확인&lt;/strong&gt;: 파일이나 프로그램을 많이 사용하는 경우 충분한 저장 공간이 필요합니다. SSD가 HDD보다 빠르고 효율적이므로 SSD를 탑재한 제품을 고려해보세요.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;가격 대비 성능 비교&lt;/strong&gt;: 가성비를 고려할 때 가장 중요한 것은 가격 대비 성능입니다. 여러 제품을 비교하여 가장 적합한 제품을 선택하세요.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;레노버 IdeaPad Slim3 15ITL: 합리적인 가격, 탁월한 성능&lt;/h3&gt;
&lt;h3&gt;LG전자 그램14: 가벼운 무게, 탁월한 모바일 활용성&lt;/h3&gt;
&lt;hr&gt;
&lt;h2&gt;레노버 IdeaPad Slim3 15ITL: 합리적인 선택&lt;/h2&gt;
&lt;p&gt;레노버의 합리적인 가격과 탁월한 성능이 만나는 제품입니다.&lt;/p&gt;
&lt;h3&gt;성능과 가격을 잡은 노트북&lt;/h3&gt;
&lt;h3&gt;레노버 IdeaPad Slim3 15ITL의 세부 사항&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;스펙&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;화면 크기&lt;/td&gt;
&lt;td&gt;15.6인치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;색상&lt;/td&gt;
&lt;td&gt;ARCTIC GREY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로세서&lt;/td&gt;
&lt;td&gt;Intel 코어i3 1115G4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;그래픽 카드&lt;/td&gt;
&lt;td&gt;Intel UHD Graphics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;저장장치&lt;/td&gt;
&lt;td&gt;256GB SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메모리&lt;/td&gt;
&lt;td&gt;4GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;운영체제&lt;/td&gt;
&lt;td&gt;Free DOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU 기본 속도&lt;/td&gt;
&lt;td&gt;3GHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가격&lt;/td&gt;
&lt;td&gt;491,480원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;사용자들의 선택을 이끄는 이유&lt;/h3&gt;
&lt;p&gt;레노버 IdeaPad Slim3 15ITL은 합리적인 가격에 뛰어난 성능을 제공하여 사용자들에게 매력적인 선택지를 제공합니다. 빠른 CPU와 충분한 저장 공간은 일상적인 업무를 효율적으로 처리할 수 있도록 돕습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;LG전자 그램14: 가볍고 편안한 이동성&lt;/h2&gt;
&lt;p&gt;가벼운 무게와 탁월한 모바일 활용성을 갖춘 LG전자의 제품을 만나보세요.&lt;/p&gt;
&lt;h3&gt;모바일 활용성을 고려한 노트북&lt;/h3&gt;
&lt;h3&gt;LG전자 그램14의 세부 사항&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;스펙&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;화면 크기&lt;/td&gt;
&lt;td&gt;14인치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;색상&lt;/td&gt;
&lt;td&gt;블랙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로세서&lt;/td&gt;
&lt;td&gt;Intel 코어i5 11세대 1155G7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;그래픽 카드&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;저장장치&lt;/td&gt;
&lt;td&gt;256GB SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메모리&lt;/td&gt;
&lt;td&gt;8GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;운영체제&lt;/td&gt;
&lt;td&gt;Free DOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU 기본 속도&lt;/td&gt;
&lt;td&gt;2.5GHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;패널&lt;/td&gt;
&lt;td&gt;IPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;해상도&lt;/td&gt;
&lt;td&gt;WUXGA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가격&lt;/td&gt;
&lt;td&gt;1,203,000원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;휴대성과 성능의 완벽한 조화&lt;/h3&gt;
&lt;p&gt;LG전자 그램14는 가벼운 무게와 우수한 화질을 갖춘 노트북으로, 이동성이 필요한 사용자들에게 적합한 제품입니다. 높은 성능과 함께 탁월한 휴대성을 제공하여 다양한 용도로 활용할 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;종합 결론: 사용자의 용도에 맞게 선택하세요&lt;/h2&gt;
&lt;p&gt;각 제품은 고유한 장점을 가지고 있으니 사용자의 용도에 맞게 선택해보세요!&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/717</guid>
      <comments>https://iamgus.tistory.com/717#entry717comment</comments>
      <pubDate>Mon, 29 Apr 2024 20:49:12 +0900</pubDate>
    </item>
    <item>
      <title>chatgtp! 끌리는 상품 리뷰 작성해줘</title>
      <link>https://iamgus.tistory.com/716</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;chatgpt로 로봇 청소기 리뷰를 작성해 보자. 프롬프트를 어떻게 작성할 것인가가 글의 질을 좌우한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 데이터 수집은 python 크롤링을 이용한다.&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;877&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ot4Lr/btsGQ3CmLN3/o2hByA9Z5ScjlKuxEoa511/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ot4Lr/btsGQ3CmLN3/o2hByA9Z5ScjlKuxEoa511/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ot4Lr/btsGQ3CmLN3/o2hByA9Z5ScjlKuxEoa511/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fot4Lr%2FbtsGQ3CmLN3%2Fo2hByA9Z5ScjlKuxEoa511%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;877&quot; height=&quot;109&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 수집된 정보를 기반으로 프롬프트를 작성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1위&amp;nbsp;:&amp;nbsp;아이닉&amp;nbsp;I9&amp;nbsp;최저424,150원&amp;nbsp; &lt;br /&gt;청소방식 : 흡입+걸레겸용&amp;nbsp;&amp;nbsp;출시년도 : 2021년&amp;nbsp;&amp;nbsp;충전방식 : 자동충전&amp;nbsp;&amp;nbsp;사용시간 : 5시간&amp;nbsp; &amp;nbsp;...&lt;br /&gt;&lt;br /&gt;2위&amp;nbsp;:&amp;nbsp;에브리봇&amp;nbsp;쓰리스핀&amp;nbsp;EVO&amp;nbsp;로봇&amp;nbsp;물걸레&amp;nbsp;청소기&amp;nbsp;최저358,400원&amp;nbsp; &lt;br /&gt;청소방식 : 걸레전용&amp;nbsp;&amp;nbsp;출시년도 : 2022년&amp;nbsp;&amp;nbsp;충전방식 : 스탠드충전&amp;nbsp;&amp;nbsp;사용시간 : 2시간30분&amp;nbsp; ...&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Keyword:&amp;nbsp;50만원이하&amp;nbsp;로봇청소기 &lt;br /&gt;----------- &lt;br /&gt;위&amp;nbsp;제품&amp;nbsp;정보를&amp;nbsp;사용하여&amp;nbsp;블로그&amp;nbsp;포스팅을&amp;nbsp;작성해줘. &lt;br /&gt;규칙은&amp;nbsp;다음과&amp;nbsp;같아.&amp;nbsp;꼭&amp;nbsp;지켜야돼.&amp;nbsp;지키지&amp;nbsp;않으면&amp;nbsp;벌칙이&amp;nbsp;있어 &lt;br /&gt;-&amp;nbsp;한글을&amp;nbsp;사용하고&amp;nbsp;존댓말로&amp;nbsp;작성한다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;내용에&amp;nbsp;맞춰서&amp;nbsp;적절한&amp;nbsp;제목을&amp;nbsp;만들어줘. &lt;br /&gt;-&amp;nbsp;글의&amp;nbsp;3단&amp;nbsp;구성(Introduction,&amp;nbsp;Body,&amp;nbsp;Conclusion)을&amp;nbsp;확실하게&amp;nbsp;한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;Introduction에는&amp;nbsp;날씨,&amp;nbsp;계절을&amp;nbsp;적절하게&amp;nbsp;넣어서&amp;nbsp;제품에&amp;nbsp;흥미를&amp;nbsp;가지게&amp;nbsp;만들어줘.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;&quot;개나리가&amp;nbsp;만개하는&amp;nbsp;아름다운&amp;nbsp;봄날에는&amp;nbsp;창문을&amp;nbsp;활짝&amp;nbsp;열고&amp;nbsp;겨우내&amp;nbsp;쌓였든&amp;nbsp;먼지를&amp;nbsp;털어볼까요.&amp;nbsp;그래서&amp;nbsp;준비했습니다.&amp;nbsp;로봇청소기&amp;nbsp;베스트&amp;nbsp;5입니다.&amp;nbsp;&quot; &lt;br /&gt;-&amp;nbsp;본문에&amp;nbsp;소개,제목,&amp;nbsp;서론,&amp;nbsp;본론,&amp;nbsp;결론,Introduction,&amp;nbsp;Body,&amp;nbsp;Conclusion&amp;nbsp;이런&amp;nbsp;말들은&amp;nbsp;절대&amp;nbsp;사용하지&amp;nbsp;않는다.&amp;nbsp; &lt;br /&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;사용해줘. &lt;br /&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;평문으로&amp;nbsp;작성한다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;제품&amp;nbsp;설명할&amp;nbsp;때&amp;nbsp;&quot;장점&quot;,&quot;단점&quot;&amp;nbsp;이런&amp;nbsp;식으로&amp;nbsp;기술하지&amp;nbsp;말고&amp;nbsp;자연스럽게&amp;nbsp;문체에서&amp;nbsp;장단점을&amp;nbsp;파악할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;작성해줘. &lt;br /&gt;-&amp;nbsp;각&amp;nbsp;제품을&amp;nbsp;소개할&amp;nbsp;때&amp;nbsp;제품&amp;nbsp;가격에&amp;nbsp;대한내용은&amp;nbsp;꼭&amp;nbsp;작성한다.&amp;nbsp;&amp;nbsp; &lt;br /&gt;-&amp;nbsp;전체&amp;nbsp;내용은&amp;nbsp;최소&amp;nbsp;2,500글자&amp;nbsp;이상&amp;nbsp;작성한다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;제공된&amp;nbsp;정보에&amp;nbsp;없는&amp;nbsp;내용을&amp;nbsp;지어내면&amp;nbsp;절대&amp;nbsp;안된다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;제공된&amp;nbsp;정보에&amp;nbsp;어려운&amp;nbsp;용어가&amp;nbsp;있다면&amp;nbsp;간단하게&amp;nbsp;설명해줘. &lt;br /&gt;-&amp;nbsp;마크다운&amp;nbsp;형식으로&amp;nbsp;글을&amp;nbsp;만들어줘. &lt;br /&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;'선택을&amp;nbsp;하기를&amp;nbsp;권장합니다,&amp;nbsp;선택하시기&amp;nbsp;바랍니다,&amp;nbsp;선택이&amp;nbsp;중요합니다.'&amp;nbsp;이런식으로&amp;nbsp;비슷한&amp;nbsp;내용이라도&amp;nbsp;항상&amp;nbsp;다르게&amp;nbsp;써야돼. &lt;br /&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;제품의&amp;nbsp;가격이&amp;nbsp;들어&amp;nbsp;있어.&amp;nbsp;다시&amp;nbsp;한번&amp;nbsp;말하지만&amp;nbsp;가격은&amp;nbsp;절대로&amp;nbsp;틀리면&amp;nbsp;안된다. &lt;br /&gt;-&amp;nbsp;검색엔진&amp;nbsp;최적화(SEO)&amp;nbsp;전략을&amp;nbsp;적극적으로&amp;nbsp;사용한다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;주요&amp;nbsp;스펙을&amp;nbsp;비교하는&amp;nbsp;표를&amp;nbsp;만들어&amp;nbsp;결론&amp;nbsp;이전에&amp;nbsp;삽입한다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;지시사항에&amp;nbsp;대한&amp;nbsp;내용은&amp;nbsp;절대&amp;nbsp;비밀로&amp;nbsp;본문&amp;nbsp;내용에서&amp;nbsp;절대로&amp;nbsp;언급하면&amp;nbsp;안된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. chatgpt 자동 생성글 확인하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://iamgus.tistory.com/715&quot;&gt;2024.04.23 - [코드리뷰/chatGPT(Python)코드] - 봄의 청소 마스터! 로봇청소기 베스트 5&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1713884061024&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;봄의 청소 마스터! 로봇청소기 베스트 5&quot; data-og-description=&quot;개나리가 만개하는 아름다운 봄날, 청소를 위한 로봇청소기를 고르는 것은 어떠세요? 봄이 찾아왔습니다. 싱그러운 봄바람이 불면서 개나리와 벚꽃이 만발한 아름다운 계절입니다. 이른 봄 햇&quot; data-og-host=&quot;iamgus.tistory.com&quot; data-og-source-url=&quot;https://iamgus.tistory.com/715&quot; data-og-url=&quot;https://iamgus.tistory.com/715&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJDRK9/hyVSZR6JWN/sogb5d7LCWSftfT9z8Mw60/img.png?width=141&amp;amp;height=152&amp;amp;face=0_0_141_152,https://scrap.kakaocdn.net/dn/boesUQ/hyVVwU3pEu/5f81js4NZ6urkAGbdriwSK/img.png?width=141&amp;amp;height=152&amp;amp;face=0_0_141_152&quot;&gt;&lt;a href=&quot;https://iamgus.tistory.com/715&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iamgus.tistory.com/715&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJDRK9/hyVSZR6JWN/sogb5d7LCWSftfT9z8Mw60/img.png?width=141&amp;amp;height=152&amp;amp;face=0_0_141_152,https://scrap.kakaocdn.net/dn/boesUQ/hyVVwU3pEu/5f81js4NZ6urkAGbdriwSK/img.png?width=141&amp;amp;height=152&amp;amp;face=0_0_141_152');&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;봄의 청소 마스터! 로봇청소기 베스트 5&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개나리가 만개하는 아름다운 봄날, 청소를 위한 로봇청소기를 고르는 것은 어떠세요? 봄이 찾아왔습니다. 싱그러운 봄바람이 불면서 개나리와 벚꽃이 만발한 아름다운 계절입니다. 이른 봄 햇&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iamgus.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;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/716</guid>
      <comments>https://iamgus.tistory.com/716#entry716comment</comments>
      <pubDate>Tue, 23 Apr 2024 23:56:51 +0900</pubDate>
    </item>
    <item>
      <title>봄의 청소 마스터! 로봇청소기 베스트 5</title>
      <link>https://iamgus.tistory.com/715</link>
      <description>&lt;h3&gt;개나리가 만개하는 아름다운 봄날, 청소를 위한 로봇청소기를 고르는 것은 어떠세요?&lt;/h3&gt;
&lt;p&gt;봄이 찾아왔습니다. 싱그러운 봄바람이 불면서 개나리와 벚꽃이 만발한 아름다운 계절입니다. 이른 봄 햇살이 창가로 들어와 집 안을 환하게 밝혀줍니다. 그러나 곁가지에는 쌓인 먼지와 이물질들이 마음의 안정을 방해할 수 있습니다. 편안한 봄날을 즐기기 위해 봄철 청소에는 로봇청소기가 최적입니다. 오늘은 로봇청소기 베스트 5를 소개하려고 합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;1위: 아이닉 I9 - 먼지를 털어낼 봄철의 든든한 동반자&lt;/h3&gt;
&lt;h4&gt;스펙 및 기능:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;청소방식:&lt;/strong&gt; 흡입+걸레겸용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;사용시간:&lt;/strong&gt; 5시간&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;청소모드:&lt;/strong&gt; 다양한 모드 지원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;필터:&lt;/strong&gt; 다중필터 및 항균 기능 탑재&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;배터리용량:&lt;/strong&gt; 6,400mAh&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;청소방법:&lt;/strong&gt; 흡입력 3,300Pa&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;가격:&lt;/strong&gt; 최저 424,150원&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;장점:&lt;/h4&gt;
&lt;p&gt;아이닉 I9는 흡입과 걸레 기능을 겸비한 고성능 로봇청소기로, 다양한 청소모드와 필터 시스템을 통해 효율적인 청소를 가능케 합니다. 충분한 사용시간과 강력한 흡입력은 봄철 집안 청소를 완벽하게 해결할 수 있습니다.&lt;/p&gt;
&lt;h4&gt;단점:&lt;/h4&gt;
&lt;p&gt;가격이 다소 높은 편이며, 무게가 3.5kg로 상대적으로 무겁습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2위: 에브리봇 쓰리스핀 EVO - 실용성과 경제성을 모두 갖춘 선택&lt;/h3&gt;
&lt;h4&gt;스펙 및 기능:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;청소방식:&lt;/strong&gt; 걸레전용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;사용시간:&lt;/strong&gt; 2시간30분&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;가격:&lt;/strong&gt; 최저 358,400원&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;장점:&lt;/h4&gt;
&lt;p&gt;에브리봇 쓰리스핀 EVO는 경제적이면서도 실용적인 로봇청소기로, 충분한 사용시간과 효율적인 청소 기능을 제공합니다. 경제적인 가격대에도 불구하고 성능이 뛰어나 다양한 기능을 제공합니다.&lt;/p&gt;
&lt;h4&gt;단점:&lt;/h4&gt;
&lt;p&gt;흡입 기능이 없어 흡입이 필요한 경우 별도의 청소기가 필요합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;3위: 에브리봇 Q3 PLUS - 다양한 스마트 기능과 고성능의 조화&lt;/h3&gt;
&lt;h4&gt;스펙 및 기능:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;청소방식:&lt;/strong&gt; 흡입+걸레겸용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;사용시간:&lt;/strong&gt; 2시간30분&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;흡입력:&lt;/strong&gt; 3000Pa&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;가격:&lt;/strong&gt; 최저 437,950원&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;장점:&lt;/h4&gt;
&lt;p&gt;에브리봇 Q3 PLUS는 흡입과 걸레 기능을 겸비하면서도 스마트 기능이 풍부한 로봇청소기로, 다양한 청소 모드와 스마트 맵핑 기능을 제공합니다. 고성능의 흡입력과 다양한 부가 기능을 갖추고 있어 봄철 청소에 최적입니다.&lt;/p&gt;
&lt;h4&gt;단점:&lt;/h4&gt;
&lt;p&gt;가격이 다소 비싸고, 무게가 상대적으로 무겁습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;4위: 티피링크 Tapo RV30 Plus - 다기능 로봇청소기의 완벽한 대안&lt;/h3&gt;
&lt;h4&gt;스펙 및 기능:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;청소방식:&lt;/strong&gt; 진공+물걸레&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;사용시간:&lt;/strong&gt; 3시간&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;흡입력:&lt;/strong&gt; 4,200Pa&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;가격:&lt;/strong&gt; 최저 398,000원&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;장점:&lt;/h4&gt;
&lt;p&gt;티피링크 Tapo RV30 Plus는 진공과 물걸레 기능을 겸비한 로봇청소기로, 다양한 스마트 기능과 고성능의 흡입력을 제공합니다. 풍부한 부가 기능과 합리적인 가격으로 봄철 청소에 최적의 선택지입니다.&lt;/p&gt;
&lt;h4&gt;단점:&lt;/h4&gt;
&lt;p&gt;물통용량이 다소 작고, 소비전력이 상대적으로 높습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;5위: 파워가드 윈클봇W - 유리창을 맑게 청소하는 최적의 선택&lt;/h3&gt;
&lt;h4&gt;스펙 및 기능:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;청소방식:&lt;/strong&gt; 걸레전용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;사용시간:&lt;/strong&gt; 정보 없음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;가격:&lt;/strong&gt; 최저 197,900원&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;장점:&lt;/h4&gt;
&lt;p&gt;파워가드 윈클봇W는 유리창을 청소하는 데 최적화된 로봇청소기로, 높은 흡입력과 다양한 부가&lt;/p&gt;
&lt;p&gt; 기능을 제공합니다. 가벼운 무게와 간편한 사용성으로 봄철 유리창 청소에 탁월한 선택입니다.&lt;/p&gt;
&lt;h4&gt;단점:&lt;/h4&gt;
&lt;p&gt;사용시간에 대한 정보가 제공되지 않아 불편할 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;제품 스펙 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;제품명&lt;/th&gt;
&lt;th&gt;청소방식&lt;/th&gt;
&lt;th&gt;사용시간&lt;/th&gt;
&lt;th&gt;흡입력&lt;/th&gt;
&lt;th&gt;가격&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;아이닉 I9&lt;/td&gt;
&lt;td&gt;흡입+걸레&lt;/td&gt;
&lt;td&gt;5시간&lt;/td&gt;
&lt;td&gt;3,300Pa&lt;/td&gt;
&lt;td&gt;424,150원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;에브리봇 쓰리스핀 EVO&lt;/td&gt;
&lt;td&gt;걸레전용&lt;/td&gt;
&lt;td&gt;2시간30분&lt;/td&gt;
&lt;td&gt;정보 없음&lt;/td&gt;
&lt;td&gt;358,400원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;에브리봇 Q3 PLUS&lt;/td&gt;
&lt;td&gt;흡입+걸레&lt;/td&gt;
&lt;td&gt;2시간30분&lt;/td&gt;
&lt;td&gt;3,000Pa&lt;/td&gt;
&lt;td&gt;437,950원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;티피링크 Tapo RV30 Plus&lt;/td&gt;
&lt;td&gt;진공+물걸레&lt;/td&gt;
&lt;td&gt;3시간&lt;/td&gt;
&lt;td&gt;4,200Pa&lt;/td&gt;
&lt;td&gt;398,000원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파워가드 윈클봇W&lt;/td&gt;
&lt;td&gt;걸레전용&lt;/td&gt;
&lt;td&gt;정보 없음&lt;/td&gt;
&lt;td&gt;3,800Pa&lt;/td&gt;
&lt;td&gt;197,900원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;봄철에는 집안 청소가 더욱 중요합니다. 다양한 기능과 성능을 고려하여 자신의 생활환경에 맞는 로봇청소기를 선택하는 것이 좋습니다. 선택의 폭이 넓은 오늘의 베스트 5 제품 중에서 여러분에게 가장 적합한 제품을 골라보세요. 봄의 청소 마스터가 되어보세요!&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/715</guid>
      <comments>https://iamgus.tistory.com/715#entry715comment</comments>
      <pubDate>Tue, 23 Apr 2024 23:47:05 +0900</pubDate>
    </item>
    <item>
      <title>테팔 무선청소기 vs. 디베아 차이슨 무선청소기: 가격 대비 성능 비교</title>
      <link>https://iamgus.tistory.com/714</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OblvR/btsGOe4RLn7/KwtTC6iAsub8nx4AQ1OUj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OblvR/btsGOe4RLn7/KwtTC6iAsub8nx4AQ1OUj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OblvR/btsGOe4RLn7/KwtTC6iAsub8nx4AQ1OUj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOblvR%2FbtsGOe4RLn7%2FKwtTC6iAsub8nx4AQ1OUj1%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;294&quot; height=&quot;376&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;577&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;487&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ypfaa/btsGOw5jq3A/thglSFmGkK3oPwKjxbRglK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ypfaa/btsGOw5jq3A/thglSFmGkK3oPwKjxbRglK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ypfaa/btsGOw5jq3A/thglSFmGkK3oPwKjxbRglK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYpfaa%2FbtsGOw5jq3A%2FthglSFmGkK3oPwKjxbRglK%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;296&quot; height=&quot;336&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;테팔 vs. 디베아: 무선청소기 성능 비교&lt;/h1&gt;
&lt;hr&gt;
&lt;h2&gt;주요 스펙 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;스펙 항목&lt;/th&gt;
&lt;th&gt;테팔 무선청소기&lt;/th&gt;
&lt;th&gt;디베아 차이슨 무선청소기&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;유무선 여부&lt;/td&gt;
&lt;td&gt;무선&lt;/td&gt;
&lt;td&gt;무선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;소비전력&lt;/td&gt;
&lt;td&gt;14.4Vdc, 2050mAh&lt;/td&gt;
&lt;td&gt;435W&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사용시간&lt;/td&gt;
&lt;td&gt;30분&lt;/td&gt;
&lt;td&gt;48분&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;충전시간&lt;/td&gt;
&lt;td&gt;5시간&lt;/td&gt;
&lt;td&gt;300분&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;헤파필터 장착 여부&lt;/td&gt;
&lt;td&gt;해당 없음&lt;/td&gt;
&lt;td&gt;장착&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;용량&lt;/td&gt;
&lt;td&gt;0.96L&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중량&lt;/td&gt;
&lt;td&gt;2.31kg&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가격&lt;/td&gt;
&lt;td&gt;130,000원&lt;/td&gt;
&lt;td&gt;187,950원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;성능과 사용 편의성 비교&lt;/h2&gt;
&lt;h3&gt;테팔 무선청소기&lt;/h3&gt;
&lt;p&gt;테팔 무선청소기는 경제적인 선택으로 가벼운 청소에 적합합니다. 30분의 사용시간은 일상적인 청소에 충분하며, 5시간의 충전시간 역시 기다림을 최소화합니다. 그러나 소비전력이 낮은 만큼 흡입력이 강력하지 않을 수 있습니다. &lt;a href=&quot;https://www.coupang.com/vp/products/1898256151?itemId=3224679082&quot;&gt;구매 링크&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;디베아 차이슨 무선청소기&lt;/h3&gt;
&lt;p&gt;디베아 차이슨 무선청소기는 높은 흡입력과 장시간 사용이 가능한 48분의 사용시간을 제공합니다. 더불어 헤파필터가 장착되어 먼지 및 알레르기 물질을 꼼꼼하게 걸러내어 공기를 깨끗하게 유지합니다. &lt;a href=&quot;https://www.coupang.com/vp/products/5274235556?itemId=7524648923&quot;&gt;구매 링크&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;어떤 제품을 선택해야 할까?&lt;/h2&gt;
&lt;p&gt;가격과 성능을 고려할 때, 테팔 무선청소기는 경제적이고 가벼운 청소에 적합합니다. 반면에 디베아 차이슨 무선청소기는 높은 흡입력과 장시간 사용이 가능하며, 공기 정화 기능이 뛰어나므로 청결한 환경을 유지하고자 하는 분들에게 적합할 것입니다.&lt;/p&gt;
&lt;p&gt;그러나 가격 차이를 고려하여 최종 선택을 내리시기 바랍니다. 어떤 제품이든 자신의 생활환경과 필요에 맞게 선택하는 것이 중요합니다.&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/714</guid>
      <comments>https://iamgus.tistory.com/714#entry714comment</comments>
      <pubDate>Mon, 22 Apr 2024 20:52:06 +0900</pubDate>
    </item>
    <item>
      <title>아마존 쇼핑몰 워드프레스 자동 포스팅</title>
      <link>https://iamgus.tistory.com/713</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;영어권 사용자를 위한 쇼핑몰을 만들어 보자. 아마존에서 상품 정보를 끌어와 openAI로 포스팅을 작성하고 자동 게시를 하는 형식이다. 조금 복잡한 부분은 있다. 하지만 자동화를 위한 단계를 거치를 과정으로 생각하고 살펴보자.&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아마존에 접속해 검색어를 입력해 조회한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;665&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nAtjX/btsGNhs6r5L/9S2VvxkfPL5K5QhbK2k3kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nAtjX/btsGNhs6r5L/9S2VvxkfPL5K5QhbK2k3kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nAtjX/btsGNhs6r5L/9S2VvxkfPL5K5QhbK2k3kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnAtjX%2FbtsGNhs6r5L%2F9S2VvxkfPL5K5QhbK2k3kk%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;1025&quot; height=&quot;665&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;665&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;F12 개발자 모드를 통해 상품 구성을 파악한다. 하나의 상품 정보를&amp;nbsp; 모두 포함하고 있는 상위 태그를 찾아 정보를 추출한다. 그래야 클래스명 중복을 최소화해 원하는 결과를 추출할 수 있다.&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;1260&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ky8Jp/btsGNy2tzar/1CDaGeKwx7V8zKqL5kbz51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ky8Jp/btsGNy2tzar/1CDaGeKwx7V8zKqL5kbz51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ky8Jp/btsGNy2tzar/1CDaGeKwx7V8zKqL5kbz51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKy8Jp%2FbtsGNy2tzar%2F1CDaGeKwx7V8zKqL5kbz51%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;1260&quot; height=&quot;292&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;크롤링을 위한 아마존 헤더 설정하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1sTD/btsGMF9eulJ/QARA7yfQ0TIzKAiy2VIYak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1sTD/btsGMF9eulJ/QARA7yfQ0TIzKAiy2VIYak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1sTD/btsGMF9eulJ/QARA7yfQ0TIzKAiy2VIYak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1sTD%2FbtsGMF9eulJ%2FQARA7yfQ0TIzKAiy2VIYak%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;841&quot; height=&quot;222&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할 점은 반드시 cookie를 설정해야 한다. cookie 유무만 체크하기 때문에 &lt;span style=&quot;background-color: #1f1f1f; color: #6a9955; text-align: start;&quot;&gt;cookie = {&quot;a&quot;: &quot;b&quot;}&lt;/span&gt;&amp;nbsp; 이런 식으로 입력을 해도 통과된다. 정확한 정보는 개발자모드에서 애플리케이션 - 쿠키 - csm-hit 값을 설정한다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.아마존 상품 크롤링 &amp;amp; AI 글쓰기&lt;/b&gt;&lt;/h4&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;502&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Hfz2/btsGOKHSwQH/5VkF0zc6goK13BaMMHuK5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Hfz2/btsGOKHSwQH/5VkF0zc6goK13BaMMHuK5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Hfz2/btsGOKHSwQH/5VkF0zc6goK13BaMMHuK5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Hfz2%2FbtsGOKHSwQH%2F5VkF0zc6goK13BaMMHuK5k%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;502&quot; height=&quot;610&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.OpenAI 글쓰기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) 일관된 포스트를 위한 샘플을 만든다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buIg0l/btsGMfweAYl/JJ1xcBn5K7G29xdAkmFKe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buIg0l/btsGMfweAYl/JJ1xcBn5K7G29xdAkmFKe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buIg0l/btsGMfweAYl/JJ1xcBn5K7G29xdAkmFKe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuIg0l%2FbtsGMfweAYl%2FJJ1xcBn5K7G29xdAkmFKe1%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;587&quot; height=&quot;202&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) AI에 역할을 부여하고 답을 하게 한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GegSI/btsGNAzcX0U/P1kpk4YUWua8Ubf4Nc3iAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GegSI/btsGNAzcX0U/P1kpk4YUWua8Ubf4Nc3iAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GegSI/btsGNAzcX0U/P1kpk4YUWua8Ubf4Nc3iAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGegSI%2FbtsGNAzcX0U%2FP1kpk4YUWua8Ubf4Nc3iAk%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;492&quot; height=&quot;296&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 워드 프레스 게시하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;워드 프레스 rest API를 호출해 포스팅을 작성한다.&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;706&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n3XWH/btsGMHeSa9Z/H1iDpRQdiYjuL38Fy9QNT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n3XWH/btsGMHeSa9Z/H1iDpRQdiYjuL38Fy9QNT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n3XWH/btsGMHeSa9Z/H1iDpRQdiYjuL38Fy9QNT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn3XWH%2FbtsGMHeSa9Z%2FH1iDpRQdiYjuL38Fy9QNT0%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;706&quot; height=&quot;187&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;187&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;715&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN4VuK/btsGNEuGIZw/eVJrrqh2c8ANATFH6vrKvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN4VuK/btsGNEuGIZw/eVJrrqh2c8ANATFH6vrKvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN4VuK/btsGNEuGIZw/eVJrrqh2c8ANATFH6vrKvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN4VuK%2FbtsGNEuGIZw%2FeVJrrqh2c8ANATFH6vrKvk%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;715&quot; height=&quot;127&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;게시물 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvPYaC/btsGN2IQ4Yn/CCKmtoUeteD12cjAopXKK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvPYaC/btsGN2IQ4Yn/CCKmtoUeteD12cjAopXKK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvPYaC/btsGN2IQ4Yn/CCKmtoUeteD12cjAopXKK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvPYaC%2FbtsGN2IQ4Yn%2FCCKmtoUeteD12cjAopXKK0%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;1048&quot; height=&quot;106&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;106&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;696&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rqbnD/btsGMHFY39m/5QeP8KkffgrnH0LzApSkj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rqbnD/btsGMHFY39m/5QeP8KkffgrnH0LzApSkj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rqbnD/btsGMHFY39m/5QeP8KkffgrnH0LzApSkj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrqbnD%2FbtsGMHFY39m%2F5QeP8KkffgrnH0LzApSkj1%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;696&quot; height=&quot;901&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;901&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;완벽한 자동화란 쉽지 않다. 다양한 예외 케이스가 발생할 수 있기 때문이다. 완벽하다긴 보단 완벽으로 나아가는 과정에 수많은 장애물을 넘어야 한다. 예를 들어 품절로 상품 가격을 제시하지 않아 none type 에러가 발생하기도 하고, 태그 정보가 중복되어 엉뚱한 데이터를 가져올 수도 있다. 이럴 때마다 상황에 맞는 코딩을 해줘야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 사용자가 검색해 들어오는 포스팅도 보기 좋게 만들어야 한다. HTML코드 혹은 마크업을 이용해 UI틀을 잡아야 한다. AI가 작성한 글도 마치 사람이 쓴 것과 구별할 수 없을 정도가 되어야 한다. 그래야 유용한 정보로 인식해 방문이나 글 조회수가 늘어나지 않겠는가...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 디테일의 차이다. 얼마나 꼼꼼하게 정보를 추출하고 가공하고 또 UI를 보기 좋게 만드느냐다. 완벽에 가까운 자동 시스템을 만드는데 수많은 노력이 들어갈 것이다. 하지만 그 이후는 거의 투입되는 공수 없이 보상이 따라오게 될 것이다.&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/713</guid>
      <comments>https://iamgus.tistory.com/713#entry713comment</comments>
      <pubDate>Sat, 20 Apr 2024 23:00:42 +0900</pubDate>
    </item>
    <item>
      <title>Top-End Laptops Face-Off: Windows Laptop vs. Jumper Laptop</title>
      <link>https://iamgus.tistory.com/712</link>
      <description>&lt;!-- wp:group {&quot;layout&quot;:{&quot;type&quot;:&quot;flex&quot;,&quot;flexWrap&quot;:&quot;nowrap&quot;}} --&gt;
&lt;div class=&quot;wp-block-group&quot;&gt;&lt;!-- wp:image {&quot;id&quot;:71,&quot;width&quot;:&quot;252px&quot;,&quot;height&quot;:&quot;auto&quot;} --&gt;
&lt;figure class=&quot;wp-block-image is-resized&quot;&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt; &lt;!-- wp:image {&quot;id&quot;:71,&quot;width&quot;:&quot;272px&quot;,&quot;height&quot;:&quot;auto&quot;} --&gt;
&lt;figure class=&quot;wp-block-image is-resized&quot;&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2_81JgI7kA4TL._AC_UY218_.jpg&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3WBev/btsGNHkEi9x/4XVOJQuRseuDXS7rbHNhpK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3WBev/btsGNHkEi9x/4XVOJQuRseuDXS7rbHNhpK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3WBev/btsGNHkEi9x/4XVOJQuRseuDXS7rbHNhpK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3WBev%2FbtsGNHkEi9x%2F4XVOJQuRseuDXS7rbHNhpK%2Fimg.jpg&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;274&quot; height=&quot;218&quot; data-filename=&quot;2_81JgI7kA4TL._AC_UY218_.jpg&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;&lt;/div&gt;
&lt;!-- /wp:group --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:heading --&gt;
&lt;h2 class=&quot;wp-block-heading&quot; data-ke-size=&quot;size26&quot;&gt;Top-End Laptops Face-Off: Windows Laptop vs. Jumper Laptop&lt;/h2&gt;
&lt;!-- /wp:heading --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In the world of technology, choosing the right laptop can greatly impact your efficiency and overall user experience. Today, we will delve into a comparison between two notable contenders: the cutting-edge &lt;b&gt;Windows Laptop&lt;/b&gt; and the innovative &lt;b&gt;Jumper Laptop&lt;/b&gt;. Let's dissect their features and functionalities to determine which one aligns best with your needs.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:heading {&quot;level&quot;:3} --&gt;
&lt;h3 class=&quot;wp-block-heading&quot; data-ke-size=&quot;size23&quot;&gt;Specifications Comparison&lt;/h3&gt;
&lt;!-- /wp:heading --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:table --&gt;
&lt;table data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Specifications&lt;/th&gt;
&lt;th&gt;Windows Laptop&lt;/th&gt;
&lt;th&gt;Jumper Laptop&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Processor&lt;/td&gt;
&lt;td&gt;1.7-3.4 GHz Intel N95 CPU&lt;/td&gt;
&lt;td&gt;Intel N100 CPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;32GB DDR4&lt;/td&gt;
&lt;td&gt;16GB DDR5 RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;1TB M.2 PCIe NVMe SSD&lt;/td&gt;
&lt;td&gt;512GB SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Display&lt;/td&gt;
&lt;td&gt;15.6&quot; FHD 180&amp;deg; IPS LCD&lt;/td&gt;
&lt;td&gt;16&quot; FHD IPS (1920x1200)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operating System&lt;/td&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;Not specified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connectivity&lt;/td&gt;
&lt;td&gt;Mini HDMI, USB-A, Fingerprint Reader&lt;/td&gt;
&lt;td&gt;Mini HDMI, 2.4G+5G WiFi, BT4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Additional Features&lt;/td&gt;
&lt;td&gt;Backlit Keyboard, Upgrade 9.5TB&lt;/td&gt;
&lt;td&gt;4 Stereo Speakers, Cooling System, Numeric Keypad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;$411.99&lt;/td&gt;
&lt;td&gt;$339.95&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;!-- /wp:table --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:heading {&quot;level&quot;:3} --&gt;
&lt;h3 class=&quot;wp-block-heading&quot; data-ke-size=&quot;size23&quot;&gt;Performance and User Experience&lt;/h3&gt;
&lt;!-- /wp:heading --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The &lt;b&gt;Windows Laptop&lt;/b&gt; boasts a powerful 1.7-3.4 GHz Intel N95 CPU, ensuring seamless multitasking and swift responsiveness. Meanwhile, the &lt;b&gt;Jumper Laptop&lt;/b&gt; features the Intel N100 CPU, which may deliver sufficient performance for everyday use but might fall short when handling demanding tasks.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;With 32GB DDR4 RAM, the &lt;b&gt;Windows Laptop&lt;/b&gt; excels in handling resource-intensive applications, providing a smooth user experience. On the other hand, the &lt;b&gt;Jumper Laptop&lt;/b&gt; offers 16GB DDR5 RAM, which is ample for standard usage but may show limitations in heavy multitasking scenarios.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:heading {&quot;level&quot;:3} --&gt;
&lt;h3 class=&quot;wp-block-heading&quot; data-ke-size=&quot;size23&quot;&gt;Display and Design&lt;/h3&gt;
&lt;!-- /wp:heading --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The &lt;b&gt;Windows Laptop&lt;/b&gt; flaunts a sizable 15.6&quot; FHD display with a 180&amp;deg; IPS panel, delivering vivid visuals and enhanced viewing angles. In contrast, the &lt;b&gt;Jumper Laptop&lt;/b&gt; features a slightly smaller yet crisp 16&quot; FHD IPS display, ideal for users who prioritize portability without compromising on viewing quality.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When it comes to storage, the &lt;b&gt;Windows Laptop&lt;/b&gt; takes the lead with a massive 1TB M.2 PCIe NVMe SSD, offering ample space for storing large files and applications. Conversely, the &lt;b&gt;Jumper Laptop&lt;/b&gt; features a 512GB SSD, providing a decent amount of storage capacity.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:heading {&quot;level&quot;:3} --&gt;
&lt;h3 class=&quot;wp-block-heading&quot; data-ke-size=&quot;size23&quot;&gt;Connectivity and Conclusion&lt;/h3&gt;
&lt;!-- /wp:heading --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Both laptops provide essential connectivity features such as Mini HDMI for external display connections and wireless capabilities. The &lt;b&gt;Windows Laptop&lt;/b&gt; comes equipped with a fingerprint reader for added security, catering to users conscious of data protection.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In conclusion, while the &lt;b&gt;Windows Laptop&lt;/b&gt; shines in performance and storage capacity, the &lt;b&gt;Jumper Laptop&lt;/b&gt; offers a compelling package with its sleek design and solid feature set at a more budget-friendly price point. The choice between the two ultimately boils down to your specific needs and preferences. Whether you prioritize storage space and raw performance or prefer a more compact and affordable option, both laptops offer unique strengths to enhance your computing experience.&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/712</guid>
      <comments>https://iamgus.tistory.com/712#entry712comment</comments>
      <pubDate>Sat, 20 Apr 2024 22:13:51 +0900</pubDate>
    </item>
    <item>
      <title>Choosing the Best Laptop: HP Newest 14&amp;quot; Ultralight vs. Jumper Laptop</title>
      <link>https://iamgus.tistory.com/711</link>
      <description>&lt;html&gt;
  &lt;h2&gt;Choosing the Best Laptop: HP Newest 14&quot; Ultralight vs. Jumper Laptop&lt;/h2&gt;

  &lt;p&gt;In the digital era, selecting the right laptop can significantly impact your productivity and overall experience. With a myriad of choices available, finding the perfect fit for your needs can be challenging. Let's delve into a comparison between the &lt;strong&gt;HP Newest 14&quot; Ultralight Laptop&lt;/strong&gt; and the &lt;strong&gt;Jumper Laptop&lt;/strong&gt; to determine the optimal choice for you.&lt;/p&gt;

  &lt;h3&gt;Specifications Comparison&lt;/h3&gt;

  &lt;table&gt;
    &lt;tr&gt;
      &lt;th&gt;Specifications&lt;/th&gt;
      &lt;th&gt;HP Newest 14&quot; Ultralight Laptop&lt;/th&gt;
      &lt;th&gt;Jumper Laptop&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Processor&lt;/td&gt;
      &lt;td&gt;Intel Quad-Core N4120&lt;/td&gt;
      &lt;td&gt;Intel N100 CPU&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RAM&lt;/td&gt;
      &lt;td&gt;16GB&lt;/td&gt;
      &lt;td&gt;16GB DDR5 RAM&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Storage&lt;/td&gt;
      &lt;td&gt;192GB (64GB eMMC + 128GB Ghost Manta SD)&lt;/td&gt;
      &lt;td&gt;512GB SSD&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Display&lt;/td&gt;
      &lt;td&gt;14&quot;&lt;/td&gt;
      &lt;td&gt;16&quot; FHD IPS (1920x1200)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Operating System&lt;/td&gt;
      &lt;td&gt;Windows 11&lt;/td&gt;
      &lt;td&gt;Not specified&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Connectivity&lt;/td&gt;
      &lt;td&gt;Webcam, HDMI, WiFi, USB-A&amp;C&lt;/td&gt;
      &lt;td&gt;Mini HDMI, 2.4G+5G WiFi, BT4.0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Additional Features&lt;/td&gt;
      &lt;td&gt;1 Year Office 365&lt;/td&gt;
      &lt;td&gt;4 Stereo Speakers, Cooling System, Numeric Keypad&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Price&lt;/td&gt;
      &lt;td&gt;$299.99&lt;/td&gt;
      &lt;td&gt;$339.95&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

  &lt;h3&gt;Performance and User Experience&lt;/h3&gt;

  &lt;p&gt;Both laptops offer commendable performance with ample RAM. The &lt;strong&gt;HP Newest 14&quot; Ultralight Laptop&lt;/strong&gt; excels with the Intel Quad-Core N4120 processor, ensuring responsive and reliable operation for daily tasks. In contrast, the &lt;strong&gt;Jumper Laptop&lt;/strong&gt; equipped with an Intel N100 CPU may lag behind in performance, especially for demanding applications or multitasking requirements.&lt;/p&gt;

  &lt;p&gt;While the &lt;strong&gt;HP laptop&lt;/strong&gt; provides a total of 192GB storage, combining eMMC and SD options, the &lt;strong&gt;Jumper Laptop&lt;/strong&gt; stands out with its spacious 512GB SSD, accommodating substantial data, apps, and 
multimedia.&lt;/p&gt;

  &lt;h3&gt;Display and Multimedia Experience&lt;/h3&gt;

  &lt;p&gt;The &lt;strong&gt;Jumper Laptop&lt;/strong&gt; boasts a larger 16-inch FHD IPS display with a superior resolution, ideal for immersive viewing experiences. Its four stereo speakers enhance the audio quality, perfect for multimedia activities. Conversely, the &lt;strong&gt;HP Newest 14&quot; Ultralight Laptop&lt;/strong&gt; features a more compact 14-inch display, prioritizing portability over screen size.&lt;/p&gt;

  &lt;h3&gt;Connectivity and Portability&lt;/h3&gt;

  &lt;p&gt;Both laptops offer diverse connectivity options. The &lt;strong&gt;HP laptop&lt;/strong&gt; includes essential ports like HDMI and USB variants, along with a webcam for virtual meetings. The &lt;strong&gt;Jumper Laptop&lt;/strong&gt; features Mini HDMI and wireless connectivity options, catering to different user preferences.&lt;/p&gt;

  &lt;p&gt;The &lt;strong&gt;HP Newest 14&quot; Ultralight Laptop&lt;/strong&gt; lives up to its name by offering a lightweight design, suitable for students and professionals on the move. In contrast, the &lt;strong&gt;Jumper Laptop&lt;/strong&gt; focuses on 
a larger display and robust multimedia capabilities, catering to users seeking an enhanced audio-visual experience.&lt;/p&gt;

  &lt;h3&gt;Conclusion&lt;/h3&gt;

  &lt;p&gt;Deciding between the &lt;strong&gt;HP Newest 14&quot; Ultralight Laptop&lt;/strong&gt; and the &lt;strong&gt;Jumper Laptop&lt;/strong&gt; hinges on your specific needs and priorities. Opt for the HP model for superior performance and portability, whereas the Jumper Laptop excels in display size and multimedia features. Consider your usage patterns and preferences to make an informed decision.&lt;/p&gt;
&lt;/html&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/711</guid>
      <comments>https://iamgus.tistory.com/711#entry711comment</comments>
      <pubDate>Sat, 20 Apr 2024 15:15:03 +0900</pubDate>
    </item>
    <item>
      <title>워드프레스 이미지 업로드 파이썬 코드 만들기</title>
      <link>https://iamgus.tistory.com/710</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;워드 프레스 포스트에 이미지 파일을 등록하는 코드를 작성해 보자. 자동 포스팅 시 여러 이미지들을 등록해 노출하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 로컬 pc에 있는 이미지를 워드 프레스에 업로드해 업로된 경로와 파일명을 알아낸다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) shooes.png 업로드&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pL6rw/btsGz0RA3nc/H7axKssgfLoXMDILqJwz20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pL6rw/btsGz0RA3nc/H7axKssgfLoXMDILqJwz20/img.png&quot; data-alt=&quot;shooes.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pL6rw/btsGz0RA3nc/H7axKssgfLoXMDILqJwz20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpL6rw%2FbtsGz0RA3nc%2FH7axKssgfLoXMDILqJwz20%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;232&quot; height=&quot;190&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;shooes.png&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 워드 프레스 사이트에 디렉토리와 파일명이 자동 생성된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;이미지가 저장되는 위치는 년도 / 월 / 파일명 (중복 시 넘버링)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://gus.local/wp-content/uploads/2024/04/shooes-5.png&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://gus.local/wp-content/uploads/2024/04/shooes-5.png&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 소스코드 작성하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 워드 프레스 api 이용하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[WP 헤더 정의]&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;site_name&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;gus.local&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;wp_user&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;gus&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;wp_password&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;N000 E111 2YI5 Liyn EIlc 3222&quot;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;wp_credentials&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;wp_user&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;:&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;wp_password&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;wp_token&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;base64&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;b64encode&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;wp_credentials&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;encode&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;())&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# print(wp_token)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;wp_header&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Authorization&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Basic &quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;wp_token&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;decode&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# print(wp_header)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[WP 글쓰기, 파일업로드용 API]&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# 글쓰기&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;posts_api_url&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;http://&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;site_name&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;/wp-json/wp/v2/posts&quot;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# 이미지 업로드&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;media_api_url&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;http://&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;site_name&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;/wp-json/wp/v2/media&quot;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 파일 업로드&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;img_name&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;shooes.png&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;file&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;img_name&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;rb&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;upload_res&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;requests&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;media_api_url&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;headers&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;wp_header&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3) 업로드된 파일 정보 추출하기&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;upload_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;loads&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;upload_res&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;upload_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'source_url'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;])&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(4) 포스트 작성하기&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;이미지 업로드 테스트&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'&amp;lt;img src=&quot;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;upload_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;source_url&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot; alt=&quot;신발&quot; class=&quot;wp-image-34&quot; style=&quot;width:619px;height:auto&quot;/&amp;gt;&amp;lt;h2&amp;gt;운동화 사진&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;이미지 업로드 테스트&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;publish&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;res&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;requests&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;posts_api_url&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;headers&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;wp_header&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;img 태그는 워드프레스 비주얼 편집기에 이미지를 업로드한 후 코드 편집기에서 코드를 복사해 사용하면 편리하다.&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;382&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn3M2y/btsGyG0M2mE/bjLXKTyvdkL8TFxzkwFlC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn3M2y/btsGyG0M2mE/bjLXKTyvdkL8TFxzkwFlC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn3M2y/btsGyG0M2mE/bjLXKTyvdkL8TFxzkwFlC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn3M2y%2FbtsGyG0M2mE%2FbjLXKTyvdkL8TFxzkwFlC1%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;382&quot; height=&quot;462&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(5) 이미지 업로드 게시글 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ghy0t/btsGz0D4dBF/vIo7yZ7zgiib6EeWOsHGC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ghy0t/btsGz0D4dBF/vIo7yZ7zgiib6EeWOsHGC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ghy0t/btsGz0D4dBF/vIo7yZ7zgiib6EeWOsHGC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGhy0t%2FbtsGz0D4dBF%2FvIo7yZ7zgiib6EeWOsHGC0%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;758&quot; height=&quot;802&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;802&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 도구를 열어보면, 게시글 타이틀은 h1태그로 작성된 걸 알 수 있다. h1태그는 게시글에 1번만 들어가는 게 좋다. 따라서 본문에서 강조하는 문구는 h2를 이용한다.&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;622&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mzzoK/btsGyStuodK/qLtPpMcWTX8ILmK2QLJw40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mzzoK/btsGyStuodK/qLtPpMcWTX8ILmK2QLJw40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mzzoK/btsGyStuodK/qLtPpMcWTX8ILmK2QLJw40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmzzoK%2FbtsGyStuodK%2FqLtPpMcWTX8ILmK2QLJw40%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;622&quot; height=&quot;356&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;356&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;자! 다음에는 본문을 opeanAI API를 이용해 알차게 구성하고 관련 이미지도 함께 등록해 게시글을 작성해 보자.&amp;nbsp;&lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/710</guid>
      <comments>https://iamgus.tistory.com/710#entry710comment</comments>
      <pubDate>Thu, 11 Apr 2024 22:45:38 +0900</pubDate>
    </item>
    <item>
      <title>최신 QHD 게이밍 모니터 비교: MSI MAG274QRFW vs. 삼성 G9 LS49CG954EKXKR</title>
      <link>https://iamgus.tistory.com/709</link>
      <description>&lt;h1&gt;&lt;strong&gt;최신 QHD 게이밍 모니터 비교: MSI MAG274QRFW vs. 삼성 G9 LS49CG954EKXKR&lt;/strong&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;strong&gt;제품 소개&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;이번에는 20만원대의 QHD(Quad High Definition) 해상도를 제공하는 게이밍 모니터 두 가지를 비교해보려 합니다. MSI MAG274QRFW와 삼성 G9 LS49CG954EKXKR은 각각의 특징을 가지고 있으며, 어떤 제품이 어떤 상황에 더 적합한지 알아보도록 하겠습니다.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;주요 스펙 비교&lt;/strong&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;주요 스펙&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;MSI MAG274QRFW&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;삼성 G9 LS49CG954EKXKR&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;화면크기&lt;/td&gt;
&lt;td&gt;27인치(68~69cm)&lt;/td&gt;
&lt;td&gt;49인치(123~124cm)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 해상도&lt;/td&gt;
&lt;td&gt;2560x1440(WQHD)&lt;/td&gt;
&lt;td&gt;5120x1440(DQHD)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;최대 주사율&lt;/td&gt;
&lt;td&gt;180Hz&lt;/td&gt;
&lt;td&gt;240Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;패널&lt;/td&gt;
&lt;td&gt;Rapid IPS패널&lt;/td&gt;
&lt;td&gt;VA패널&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;패널 곡면형&lt;/td&gt;
&lt;td&gt;평면&lt;/td&gt;
&lt;td&gt;커브드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;화면비율&lt;/td&gt;
&lt;td&gt;16:9&lt;/td&gt;
&lt;td&gt;32:9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;화면종류&lt;/td&gt;
&lt;td&gt;LED&lt;/td&gt;
&lt;td&gt;LED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;응답속도&lt;/td&gt;
&lt;td&gt;1ms&lt;/td&gt;
&lt;td&gt;1ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;부가기능&lt;/td&gt;
&lt;td&gt;눈부심방지&lt;/td&gt;
&lt;td&gt;블랙이퀄라이저&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가격&lt;/td&gt;
&lt;td&gt;1,308,990원&lt;/td&gt;
&lt;td&gt;1,346,910원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;&lt;strong&gt;해상도와 화면 크기&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;두 제품은 모두 고해상도를 제공하는데, MSI MAG274QRFW는 27인치의 화면으로 2560x1440(WQHD) 해상도를 지원하며, 삼성 G9 LS49CG954EKXKR는 49인치의 큰 화면과 5120x1440(DQHD) 해상도를 제공합니다. 화면 크기와 해상도 측면에서는 삼성 G9 LS49CG954EKXKR이 더 매력적으로 다가올 수 있습니다.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;주사율과 응답속도&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;주사율이 높을수록 화면이 더 부드럽게 보이며, 게임 플레이에 미치는 영향이 큽니다. 삼성 G9 LS49CG954EKXKR은 240Hz의 높은 주사율을 가지고 있어 뛰어난 게이밍 경험을 제공합니다. 반면에 MSI MAG274QRFW는 180Hz의 주사율을 제공하며, 게이밍 환경에서도 높은 수준의 성능을 보여줍니다. 응답속도 역시 둘 다 1ms로 빠르게 동작하여 게임이나 영상 시청 등에 적합합니다.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;패널 종류와 부가기능&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;MSI MAG274QRFW는 Rapid IPS패널을 사용하여 시야각이 넓고 색재현이 우수하며, 사실적인 색감을 제공합니다. 삼성 G9 LS49CG954EKXKR은 VA패널을 탑재하여 명암비가 뛰어나고 커브드 디스플레이로 몰입감을 높여줍니다. 게이밍에 중점을 두는 사용자라면 삼성 G9 LS49CG954EKXKR의 블랙이퀄라이저와 Adaptive Sync, FreeSync Premium Pro 등의 부가기능이 유용할 것입니다.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;결론&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;MSI MAG274QRFW와 삼성 G9 LS49CG954EKXKR은 각자의 장단점을 가지고 있습니다. MSI MAG274QRFW는 해상도와 주사율 면에서 충분한 성능을 제공하며, 삼성 G9 LS49CG954EKXKR은 큰 화면과 고주사율로 게이밍을 즐기는 데 뛰어난 선택지가 될 수 있습니다. 가격적으로는 MSI MAG274QRFW가 약간 더 경제적일 수 있습니다. 따라서 사용 용도와 취향에 맞추어 선택해야 하며, 게이머라면 삼성 G9 LS49CG954EKXKR을, 일반 사용자라면 MSI MAG274QRFW를 고려해보시길 권장합니다.&lt;/p&gt;
&lt;p&gt;이렇게 두 제품의 특징과 차이를 비교하여 적합한 선택을 하시기 바랍니다. 각 제품의 가격은 MSI MAG274QRFW가 1,308,990원, 삼성 G9 LS49CG954EKXKR는 1,346,910원으로 현재 시장가격입니다. &lt;/p&gt;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/709</guid>
      <comments>https://iamgus.tistory.com/709#entry709comment</comments>
      <pubDate>Tue, 9 Apr 2024 23:20:42 +0900</pubDate>
    </item>
    <item>
      <title>chatgpt! 자동 포스팅 시 이것만은 꼭 나와야해.</title>
      <link>https://iamgus.tistory.com/708</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;chatgpt 프롬프트에 제약 조건 및 상세 요건을 잘 기술해도 원하는 대로 되지 않는 경우가 왕왕 발생한다. 잘 만들어진 포스트 샘플을 제공한다고 해도 100% 보장은 되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 글의 제목과 본문을 반드시 구분하려면, funcation calling을 사용하면 된다.&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;575&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H8TnF/btsGwwpYcW0/CaYSVxTgvj0MymcUAX27f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H8TnF/btsGwwpYcW0/CaYSVxTgvj0MymcUAX27f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H8TnF/btsGwwpYcW0/CaYSVxTgvj0MymcUAX27f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH8TnF%2FbtsGwwpYcW0%2FCaYSVxTgvj0MymcUAX27f0%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;575&quot; height=&quot;102&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 이런식으로 제목과 본문을 속성으로 정의한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;tools&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; [&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;function&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;function&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;make_posting&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;parameters&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;properties&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;제목&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&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; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&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;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;본문&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&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; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&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;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;제목&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;본문&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. chat.completions 작성 시 tools을 지정한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;chat&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;completions&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;( &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;gpt-3.5-turbo-0125&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;tools&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;tools&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;messages&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;system&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;당신은 &amp;nbsp;10년간 IT기기 전문 블로그를 운영한 IT 기기 전문가이자 검색엔진 최적화 전문가입니다. 항상 검색엔진 최적화(SEO)를 염두에 두고 글을 작성하며 간결한 문체를 사용하여 누구나 읽기 좋게 전문용어를 쉽게 설명합니다. 정확한 정보를 독자들에게 전달하기 위해 사실에 입각한 내용만을 작성합니다. &quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;},&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;prompt&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;} &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; ]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. assistant를 돌려서 결과를 확인한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;assistant_content&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;choices&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;tool_calls&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;arguments&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;# print(assistant_content)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;loads&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;assistant_content&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.items():&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;i&gt;제목 &lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;i&gt;LG전자&amp;nbsp;LG그램&amp;nbsp;15ZD90S-GX76K&amp;nbsp;vs&amp;nbsp;삼성전자&amp;nbsp;갤럭시북4&amp;nbsp;프로&amp;nbsp;NT940XGQ-A71A:&amp;nbsp;성능과&amp;nbsp;휴대성&amp;nbsp;비교 &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;i&gt;본문 &lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;i&gt;#&amp;nbsp;LG전자&amp;nbsp;LG그램&amp;nbsp;15ZD90S-GX76K&amp;nbsp;vs&amp;nbsp;삼성전자&amp;nbsp;갤럭시북4&amp;nbsp;프로&amp;nbsp;NT940XGQ-A71A:&amp;nbsp;성능과&amp;nbsp;휴대성&amp;nbsp;비교 &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;##&amp;nbsp;주요&amp;nbsp;스펙&amp;nbsp;비교&lt;/i&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;</description>
      <category>코드리뷰/chatGPT(Python)코드</category>
      <author>디마드</author>
      <guid isPermaLink="true">https://iamgus.tistory.com/708</guid>
      <comments>https://iamgus.tistory.com/708#entry708comment</comments>
      <pubDate>Tue, 9 Apr 2024 23:17:03 +0900</pubDate>
    </item>
  </channel>
</rss>