'Google'에 해당되는 글 3건

  1. ChatGPT로 네이버 최저가 검색 기능 개발하기 - 1편
  2. LG G Watch 사용기
  3. Google Mobile Platform - Android

저는 코딩 손 놓은지 이제 15년이 넘은 직장인입니다. 현재는 개발과 무관한 일을 하고 있구요.

마음 한구석에 코딩에 대한 작은 소망들이 있기는 했습니다만, 다시 시작한다는게 쉽지 않기도 하고, 요즘 언어들을 새로 배운다는 것도 낯설기도 하고 그랬습니다.

그런데 ChatGPT의 시대가 왔네요. 그래서 개발을 한번 시도해보기로 했습니다.

 

주제 : ChatGPT로 웹크롤링을 통한 네이버 최저가 검색 기능 개발

목적 : 1) GPT를 이용한 개발에 익숙해지기 2) 노코딩 개발 툴에 익숙해지기

일단 PC에 개발환경 셋업하는 것도 귀찮으니까, Google Colab을 활용하기로 합니다.

 

ChatGPT와의 대화 전체를 남기려니, 글만 길어지는 것 같아서, 제 프롬프트만 Full로 남기고 ChatGPT의 답변이나 결과는 핵심만 정리해서 공유하려고 합니다.

 

당신
내가 원하는 제품이름을 입력받아서, 네이버쇼핑 웹페이지에서 그 제품을 검색하고 그 검색 결과 페이지에서 최저가 제품을 판매하는 사이트 URL을 리턴하는 파이썬 코드를 만들어줘.
이 코드는 colab에서 돌아가게 해줘

ChatGPT
네이버 쇼핑 검색 결과를 스크래핑하여 최저가 제품의 판매 사이트 URL을 리턴하는 파이썬 코드를 만드는 것을 도와드리겠습니다. 구현을 위해 Python에서 사용할 수 있는 requestsBeautifulSoup 라이브러리를 사용할 예정입니다. 이 코드는 Google Colab 환경에서 작동하도록 설정됩니다. requests를 사용해 네이버 쇼핑 검색 결과 페이지의 HTML을 가져오고, BeautifulSoup으로 파싱하여 최저가 제품 정보를 추출합니다.

 

# 필요한 라이브러리 설치
!pip install requests beautifulsoup4

import requests
from bs4 import BeautifulSoup

def get_lowest_price_product_url(product_name):
    # 네이버 쇼핑 URL 구성
    base_url = 'https://search.shopping.naver.com/search/all'
    query_params = '?query=' + requests.utils.quote(product_name)
    full_url = base_url + query_params
    
    # 네이버 쇼핑 페이지로 요청을 보내고 HTML을 가져옴
    response = requests.get(full_url)
    if response.status_code == 200:
        html = response.text
        soup = BeautifulSoup(html, 'html.parser')
        
        # 최저가 제품의 정보를 추출 (구현 단계는 예시로, 실제 HTML 구조에 따라 달라질 수 있음)
        product_list = soup.select('.basicList_item__2XT81')
        if not product_list:
            return "제품을 찾을 수 없습니다."

        lowest_price = float('inf')
        lowest_price_url = ''

        for product in product_list:
            price = product.select_one('.price_num__2WUXn')
            if price:
                price = float(price.get_text().replace(',', '').replace('원', ''))
                if price < lowest_price:
                    lowest_price = price
                    link = product.select_one('.basicList_link__1MaTN')
                    if link and link.has_attr('href'):
                        lowest_price_url = link['href']

        return lowest_price_url
    else:
        return "네이버 쇼핑 검색에 실패했습니다."

# 사용 예시
product_name = "삼성 갤럭시 S21"  # 검색하고자 하는 제품 이름
lowest_price_product_url = get_lowest_price_product_url(product_name)
print(lowest_price_product_url)

 

product_name을 하드코딩하게 되어있네요. 

 

당신
product name은 나한테 입력받도록 해줘

 

# 필요한 라이브러리 설치
!pip install requests beautifulsoup4

import requests
from bs4 import BeautifulSoup

def get_lowest_price_product_url(product_name):
    # 네이버 쇼핑 URL 구성
    base_url = 'https://search.shopping.naver.com/search/all'
    query_params = '?query=' + requests.utils.quote(product_name)
    full_url = base_url + query_params
    
    # 네이버 쇼핑 페이지로 요청을 보내고 HTML을 가져옴
    response = requests.get(full_url)
    if response.status_code == 200:
        html = response.text
        soup = BeautifulSoup(html, 'html.parser')
        
        # 최저가 제품의 정보를 추출 (구현 단계는 예시로, 실제 HTML 구조에 따라 달라질 수 있음)
        product_list = soup.select('.basicList_item__2XT81')
        if not product_list:
            return "제품을 찾을 수 없습니다."

        lowest_price = float('inf')
        lowest_price_url = ''

        for product in product_list:
            price = product.select_one('.price_num__2WUXn')
            if price:
                price = float(price.get_text().replace(',', '').replace('원', ''))
                if price < lowest_price:
                    lowest_price = price
                    link = product.select_one('.basicList_link__1MaTN')
                    if link and link.has_attr('href'):
                        lowest_price_url = link['href']

        return lowest_price_url
    else:
        return "네이버 쇼핑 검색에 실패했습니다."

# 사용자로부터 제품 이름 입력받기
product_name = input("검색하고자 하는 제품 이름을 입력하세요: ")

# 함수 호출 및 결과 출력
lowest_price_product_url = get_lowest_price_product_url(product_name)
print(lowest_price_product_url)

 

코드가 완성된 듯 보입니다. 이 코드를 Google Colab에 붙여 넣고, Run시킵니다.

근데 "네이버 쇼핑 검색에 실패했습니다." 에러가 리턴되네요?

 

당신
 
네이버 쇼핑 검색에 실패했습니다. 이런 에러가 나왔는데, 어떻게 고치면 될까?
header를 추가했는데도, 동일한 에러가 나와. 어떻게 고치면 될까?

ChatGPT
블라블라~~~
  1. 헤더 정보 변경: 사용자 에이전트(User-Agent)와 같은 헤더 정보를 더욱 다양하게 변경해보세요. 때로는 차단을 피하기 위해 브라우저에서의 정상적인 요청처럼 보이게 만드는 것이 필요합니다.
  2. 세션 사용: requests에서 Session 객체를 사용하여 상태(쿠키, 세션 정보 등)를 유지하면서 연속된 요청을 보낼 수 있습니다. 이는 서버에게 더 인간적인 사용 패턴처럼 보일 수 있습니다.
  3. API 사용 검토: 네이버 쇼핑과 같은 서비스는 공식 API를 제공할 수 있습니다. 공식 API를 사용하면 데이터 접근이 더 쉽고, 서비스 제공업체의 정책을 준수하는 방식으로 데이터를 가져올 수 있습니다.
  4. 웹 브라우저 자동화 도구 사용: selenium과 같은 웹 브라우저 자동화 도구를 사용하여 실제 브라우저 세션을 통해 페이지에 접근하고, 데이터를 추출할 수 있습니다. 이 방법은 대부분의 웹사이트에서 효과적이지만, 더 많은 리소스를 사용하고 속도가 느릴 수 있습니다.

    블라블라~~~

 

위에 ChatGPT가 제안하는 1, 2번을 시도했고 다 실패했습니다. 3번은 이 프로젝트의 목적에 맞지 않으므로 기각했고요, 4번은 무슨 말인지 잘 모르겠습니다. 왜 실패인지 나중에 알게되었지만, 이때까진 그냥 코드의 문제라고만 생각했었죠.

 

당신
header, session을 추가했는데도, 동일한 에러가 나는데 어떻게 고치면 될까?
 
 
ChatGPT
만약 requests와 BeautifulSoup을 사용하면서 헤더와 세션을 추가했음에도 불구하고 여전히 "네이버 쇼핑 검색에 실패했습니다."와 같은 오류가 발생한다면, 네이버 쇼핑 사이트의 방어 메커니즘이 강화되었거나, 스크래핑을 방지하기 위한 추가적인 조치가 적용되었을 가능성이 높습니다. 이 경우, 다음과 같은 몇 가지 대안적인 접근 방법을 고려해볼 수 있습니다.

1. 공식 API 사용

가장 권장되는 방법은 네이버 쇼핑이 제공하는 공식 API를 사용하는 것입니다. 공식 API를 사용하면, 웹 스크래핑을 통한 데이터 추출에서 발생할 수 있는 여러 문제를 피할 수 있으며, 네이버의 정책에도 부합합니다. 네이버 개발자 센터에서 API 사용 신청과 관련된 정보를 찾아볼 수 있습니다.

2. 웹 브라우저 자동화 도구 사용

selenium과 같은 웹 브라우저 자동화 도구를 사용하는 것입니다. selenium은 실제 웹 브라우저를 자동으로 조작하여 사이트에 접근하고, 사용자와 유사한 방식으로 웹 사이트를 탐색하므로, 많은 웹 사이트의 스크래핑 방지 메커니즘을 우회할 수 있습니다. 단, 이 방법은 성능이 느릴 수 있고, 추가적인 리소스가 필요합니다.

Selenium 예제 코드

아래 코드는 selenium을 사용하여 네이버 쇼핑에서 제품을 검색하고 최저가 제품의 URL을 가져오는 예제입니다. 이 코드를 실행하기 전에, selenium과 webdriver-manager를 설치하고, 적절한 웹드라이버(Chrome, Firefox 등)가 필요합니다.

 

!pip install selenium
!pip install webdriver-manager

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
import time

def get_lowest_price_product_url_selenium(product_name):
    # Selenium WebDriver 설정
    service = ChromeService(executable_path=ChromeDriverManager().install())
    options = webdriver.ChromeOptions()
    options.add_argument('headless')  # 창 없는 모드
    options.add_argument('disable-gpu')  
    options.add_argument('lang=ko_KR')  # 한국어 설정
    browser = webdriver.Chrome(service=service, options=options)
    
    # 네이버 쇼핑으로 이동하여 제품 검색
    browser.get("https://search.shopping.naver.com/search/all?query=" + product_name)
    time.sleep(2)  # 페이지 로드 대기
    
    # 최저가 제품의 URL 추출
    try:
        # 최저가 제품 링크 찾기 (네이버 쇼핑 페이지의 구조에 따라 수정이 필요할 수 있음)
        lowest_price_product = browser.find_element(By.CSS_SELECTOR, '.basicList_link__1MaTN')
        product_url = lowest_price_product.get_attribute('href')
        print("최저가 제품 URL:", product_url)
    except Exception as e:
        print("데이터 추출 중 오류 발생:", e)
    
    # 브라우저 닫기
    browser.quit()

# 사용 예시
product_name = "삼성 갤럭시 S21"  # 검색하고자 하는 제품 이름
get_lowest_price_product_url_selenium(product_name)

 

아 뭔가 라이브러리가 바뀌었습니다.  Request/BeautifulSoup 대신에, Selenium을 쓰라고 하네요.

Colab에 붙여넣고 Run해봅니다. 에러가 나네요.

 

당신
AttributeError: 'NoneType' object has no attribute 'split' 이런 에러가 나는데 어떻게 고치지?

ChatGPT
블라블라블라~~~~

당신
아니 그게 아닌 것 같아.

/usr/local/lib/python3.10/dist-packages/webdriver_manager/drivers/chrome.py in get_latest_release_version(self)
62 return determined_browser_version
63 # Remove the build version (the last segment) from determined_browser_version for version < 113
---> 64 determined_browser_version = ".".join(determined_browser_version.split(".")[:3])
65 latest_release_url = (
66 self._latest_release_url

AttributeError: 'NoneType' object has no attribute 'split'

이런 에러인데 다시 한번 봐줘

ChatGPT
블라블라블라~~~

1. webdriver_manager와 Chrome의 호환성 확인

webdriver_manager와 설치된 Chrome 브라우저 버전이 호환되는지 확인합니다. 때때로 webdriver_manager가 로컬 시스템에 설치된 Chrome의 버전을 정확히 식별하지 못할 수 있습니다. 이를 해결하기 위해 Chrome 브라우저를 최신 버전으로 업데이트하거나, webdriver_manager를 최신 버전으로 업데이트해 볼 수 있습니다.

2. Chrome 버전 수동 지정

ChromeDriverManager를 사용할 때, Chrome의 특정 버전에 대한 드라이버를 명시적으로 요청할 수 있습니다. 이 방법은 webdriver_manager가 자동으로 Chrome 버전을 결정하는 데 문제가 있을 때 유용할 수 있습니다.

3. 로컬 ChromeDriver 사용

webdriver_manager 대신 시스템에 직접 설치된 chromedriver를 사용하는 것도 한 가지 방법입니다. 이 경우, chromedriver의 경로를 직접 지정해야 합니다.

블라블라블라~~~

 

 

ChatGPT의 답변들을 보자니, 첨엔 잘 모르겠었는데 이제 조금 이해가 갑니다.

Selenium은 실제로 크롬웹브라우저를 구동시켜서 웹페이지를 로딩한 후에 크롤링을 하는 거였습니다. 그러니 Cloud에서 돌아가는 Google Colab으로는 정상동작을 할 수 없는 거네요.

 

개발하시는 분들에겐 상식일텐데, 저같은 일반인은 먼 길 돌아서 알아내게 되었습니다. ㅠ.ㅠ

그래서 Colab으로 웹크롤링해서 네이버 최저가를 가져오는 것은 실패입니다.

로컬에 환경 셋팅하고 다시 시도해보려고 합니다. 이 내용은 2편에서 이어집니다.


LG G Watch 사용기


구글 I/O에서 받아온 G Watch를 며칠간 사용해보고 이제야 사용기를 남깁니다.


일단 샌프란시스코에 머무는 동안에는 꽤 편리했습니다.

G watch가 Google now와 연동되는 만큼 미국에서는 Google Now의 컨텐츠와 정보가 꽤 풍부한 상황이었고, 관련 인프라도 잘 되어 있었습니다.

조금 이동하면 다양한 상황에 따라 주변 맛집을 추천해주거나, 구경하기 좋은 곳들을 알려주었고,

G watch를 통해 실시간 길안내까지 연동이 되니 참 편리했습니다.

심지어 시계에 대고 말 한마디로 Taxi를 부르는 것도 가능했습니다.


그런데 한국에 돌아오니 할 것이 별로 없네요.

한국에서의 구글 나우는 그렇게 풍성하지 않습니다. 실시간 길안내도 안되구요...


그러나, 폰이 받은 노티를 간단히 시계에서 확인가능하다는 것이 장점입니다.

특히, 잘 만들어진 앱의 노티는 G watch에서 전체 내용을 Material design이라는 나름 예쁘고 간결한 UI로 확인할 수 있습니다.

앱에따라서는 음성을 이용해 G watch에 대고 말만하면 STT로 회신도 가능합니다.

Allthecooks같은 앱을 통해서는 요리 레시피를 시계에 띄우고, 단계별로 타이머까지 쉽게 설정해가며,

써먹을 수도 있었습니다.


삼성 갤럭시시리즈는 메세지앱이 그렇게 만들어져있기 때문에, 시계에서 수신한 메세지 내용을 확인할 수 없습니다.

그냥 메세지가 왔다는 노티정도만 알수 있죠. 그러나 카톡이나 행아웃같은 경우에는 시계에서 받은 메세지 전체를 확인할 수 있습니다. 회신도 가능하구요. 꽤 편리합니다.


뭐, 아직까지는 크게 유용하다는 느낌은 아닙니다만 안드로이드웨어의 앞날을 기대해봅니다.

앱이 어떻게 만들어지냐에 따라서 점점 더 유용해질 것 같네요.


디자인

 - 못생겼다. 그런데 Moto360 빼고는 이쁜 와치는 못봐서 그런데로 참을만하다.

 - Material Design의 UI는 참 괜찮다.


배터리

 - 화면이 항상 켜져있는 것을 감안하면 꽤 오래간다. 이틀 정도는 충전없이 쓸 수 있을 듯.


장점

1. 22mm 표준 시계줄이 호환되어 다양한 줄질이 가능하다.

2. 각종 Noti들이 정말 일관된 디자인으로 예쁘게 보여지며, 확인/회신 등 다양한 기능을 폰을 꺼내지 않고 할 수 있다.

3. 생각보다 길게가는 배터리


단점

1. 한국의 구글나우가 더 좋아지지 않는다면 사용성에 한계가 있을 듯 하다.

2. 디자인이 너무 투박하여 못 생겼다.

3. 전화도 안되면서, 희망보다는 빨리 빠지는 배터리

4. 구글나우는 아직까지는 한국말을 너무 못알아먹는다,


추천

 - 안드로이드웨어 레퍼런스를 쭉 경험하고픈 자

 - 시계로 전화같은 거 안되도 상관없는 자


비추

 - 기어처럼 시계로 전화를 하고픈 자


Google Mobile Platform - Android



구글에서 야심차게 준비한 Mobile Platform project - Android.
구글이 휴대폰 사업에 직접 뛰어들지 않을까 했었던, 모두의 우려를 잠재우고..
MS에 도전장을 내민듯 하다.
모바일 시장의 구도를, Vendor간의 싸움에서,  MS vs Google의 구도로
재편한 구글의 전략... 게임의 법칙을 바꾸는 그들은, 진짜 강한 기업이다.

이 동영상은 구글의 Android의 데모영상인데...
대충봐도, 이 플랫폼으로 인해, 휴대폰이 얼마나 크게 바뀔지, 상상이 된다.
구글.. 그들의 행보는 언제나 기대된다...