'노코딩개발'에 해당되는 글 1건

  1. ChatGPT로 네이버 최저가 검색 기능 개발하기 - 1편

저는 코딩 손 놓은지 이제 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편에서 이어집니다.