'Python'에 해당되는 글 1건

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

지난 편에서는, Colab 환경에서 네이버 최저가 검색 크롤링 기능을 구현하기 위해 ChatGPT에 일을 시켜보았습니다만, Selenium Library의 한계로 Colab에서는 더 이상 진행할 수가 없었습니다.

 

그래서 Local에서 다시 시도해보기로 합니다. MS Code와 Python 개발 환경을 설치했습니다.

제가 개발하던 시절과는 다르게 MS Code설치하면 그 안에서 Plugin 처럼 Python같은 것도 설치할 수 있네요. 참 좋은 세상입니다.

 

그럼 본격적으로 시작해봅니다.

코드는 지난 시간에 chatGPT가 다 만들어주었으니, 잠시 리뷰해보겠습니다.

 

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 추출
    browser.get(product_url)
    time.sleep(2)  # 페이지 로드 대기
    try:
        # 최저가 제품 링크 찾기 (네이버 쇼핑 페이지의 구조에 따라 수정이 필요할 수 있음)
        lowest_price_product = browser.find_element(By.CSS_SELECTOR, '.buyButton_btn_compare__4MFuE')
        product_url = lowest_price_product.get_attribute('href')
        print("최저가 제품 URL:", product_url)
    except Exception as e:
        print("데이터 추출 중 오류 발생:", e)

    # 브라우저 닫기
    browser.quit()

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

 

중간에 CSS_SELECTOR에 있는 buyButton~ 저 부분은 네이버 쇼핑 페이지에서 개발자 모드에 들어가서 내가 찾아 넣어야 하는데요, 실제 네이버쇼핑 페이지에는 없는 경우가 많았습니다. 네이버 페이지를 계속 보니, 쇼핑검색의 첫번째 페이지에는 최저가 표시가 없는 경우가 많고, 검색결과 중에 제품의 Catalog Page링크가 있는데, Catalog Page 내에 들어가야 최저가 표시가 있는 것을 발견했습니다.

 

그래서 고민을 하다가, 페이지 크롤링을 두번하는 것이 어떨까 아이디어를 내봤습니다.

"네이버 쇼핑 검색 1차 크롤링해서, Catalog Page 링크 확보한 후, Catalog Page를 다시 크롤링해서 최저가 링크 가져오기"로 바꿔보면 되지 않을까 싶었습니다. 주소만 다르지 크롤링 두번하는 되는 거라서, 적당히 Copy & Paste하면 될 것 같았습니다.

그래서 만든 코드는 아래와 같습니다.

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)  # 페이지 로드 대기

    # 최저가 제품의 Catalog URL 추출
    try:
        # 최저가 제품 링크 찾기 (네이버 쇼핑 페이지의 구조에 따라 수정이 필요할 수 있음)
        lowest_price_product = browser.find_element(By.CSS_SELECTOR, '.product_compare__Kfwlg')
        product_url = lowest_price_product.get_attribute('href')
        print("최저가 제품 Catalog URL:", product_url)
    except Exception as e:
        print("데이터 추출 중 오류 발생:", e)

    # 최저가 제품의 URL 추출
    browser.get(product_url)
    time.sleep(2)  # 페이지 로드 대기
    try:
        # 최저가 제품 링크 찾기 (네이버 쇼핑 페이지의 구조에 따라 수정이 필요할 수 있음)
        lowest_price_product = browser.find_element(By.CSS_SELECTOR, '.buyButton_btn_compare__4MFuE')
        product_url = lowest_price_product.get_attribute('href')
        print("최저가 제품 URL:", product_url)
    except Exception as e:
        print("데이터 추출 중 오류 발생:", e)

    # 브라우저 닫기
    browser.quit()

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

 

그리고 다음은 실행 결과입니다.

/usr/bin/python3 /Users/ACIDBURN/Documents/Coding/Naver_Lowest_Price_Selenium.py

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
MAC16:Coding ACIDBURN$ /usr/bin/python3 /Users/ACIDBURN/Documents/Coding/Naver_Lowest_Price_Selenium.py
/Users/ACIDBURN/Library/Python/3.9/lib/python/site-packages/urllib3/__init__.py:35: NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020
  warnings.warn(
검색하고자 하는 제품 이름을 입력하세요: 아이폰15프로 256GB 자급제
최저가 제품 Catalog URL: https://cr.shopping.naver.com/adcr.nhn?x=yefTI6VgqhQo7hbdQD298P%2F%2F%2Fw%3D%3Ds94zOEoJabaiLD7SZR0EsslXTrx5XKScUbyi6ESGid8SxgRr7I3pQK3IFghCXYbC6uXAo7C1Oc4tYgQHkFClKNSER9vd%2BL3gFRE8Xbm9xpt3WBY513xwFKnjS6%2BHy18WTrGd3CAlg8SpSdqTFw1ApvgTFZUrvRKnZcZpfV%2Fwu0W8eKc2vHmyDiFz6z7BhkveXpOr9sPYwajBkeE07IGGkJ8q8LIarFFrbJieiK6Rnd3yu2VcoSXmmBH79cr0bdTSl5X7PE%2BGeGF2XkoIgpEqmFGOvThZsNgVF7LHDTCmIXPdv39ptNf4N%2FwyXuMrYz2Ge%2F%2FBwD9xlUCuWLWemaWVTYdnqPuDC%2Fgl5yvm4sVtB7009rv0gL1YdSn5VFNKsVbay%2FOIq6qLqW%2BXB7aAhUB%2FZQCVdN3LpKf%2FbKuiZi7z1XJT6Vec1qLczsKbVg9HYclWrDRsedrZkNL785%2B5AV95meEqNGnYP2mQGFwl2o9AJeRM8JJ1iC5VoMUmeTETRygVRJoTEwFp83LCDTlYUT5z%2FawtK%2FlJjOKzlJV2IEBfprxFITMQJi5RFUiavbTCYnnFjT%2BbHlEfoJP37ZGqMrXynLc99iO6CN%2FbvLpNEgAE0YWjqJm6JUcf3WgSuHK7uJ85TQcNk8l6pSNQzL8Q3TUPgCJTL3ruaVJreZl%2BplMuLoOq2k%2BBBQEGhvEplrOhVpAiGcBbP2SwDVOcazNQfbdXHf%2B9za7bfeOAMRN%2BcT%2F9p%2BChB0CIl3BeKsFF2drF%2B%2BsFv&nvMid=42617437619&catId=50001519
최저가 제품 URL: https://cr.shopping.naver.com/adcr.nhn?x=USdtAXPJcw7NBhvDh6ME7v%2F%2F%2Fw%3D%3DsPhUEUnCivpSozxzJCtn4X1H84T0bcB2R0S2ckbEPXGsh4%2F%2BsIkGOcsjpRoly8iy91TiI7XbWKfbFTC8O67dtkVonis1xFR8Vg6%2FQP7779BxI8O3awYw2F01MqNqmOmepwSX9OxZvO0rPDBtkS5K%2FLdfeOpmloVehA3ESOPqbtTB1CySR%2FjCqjMmlbvlHjt5utPvOVpkiiuS2NnSY3AoTBh5EmXnF4H3IfqnZhoShupk4UGs2AiZAiqDwe3MPDaE5JHpqHvcixzgF8AalnMSphuNFzzz2Q6anY3mdM6aZSF4idQjoDjQPNjm3oGJC%2BAOD8ykgfjkpR8NbWz%2Fne%2Fn1nkWBpLgXa1AIhVzuIkQNMNhYiOG4HmV%2BsD5IDpS72X2odzp%2FdtCYNDHM0%2FAcXVrE1MHPv45Edr5fvvv%2FlTzZa4UFV%2FqDmWmSKLRyViJp%2FFfHX8dTXGd3GERhHB170jUZEJqsf9m110U9b5C3MhBzGHuEoNG0uj12g0%2F4PFHZzcOhcvyfFoOHjWOyAcz%2FmncFtrF%2Fz%2BUcpupZ5231Vhvtsieu98WLnorGiotJYxgKVbEBBw0aGTBpnSY3kiDYL8LRFc%2FnrvD952C9PD5gmE9QubaLT4rEGvUzEYbTV2vYncuzMqBtxWUHiamfb%2FB9pPrLv5UiMfx95GtdKVb69obEtf2dy8w24xJ26f9nYK9vPYixpQPQshAEO8fy1yLrqRcksjd3RIiU2Urj9GehuFhWIB1yDc13mDfw2R50LLGPPL44W8s3hXn%2FnqWSCUvPdPScCuZlJ5%2F9plHkOFOU0mKPzahWkbDrUFJ2hBG8QaB8WVzn&nvMid=43044708913&catId=50001519
MAC16:Coding ACIDBURN$

 

결과는 성공적입니다. 아이폰이 아니라, 갤럭시를 검색해도 잘 나옵니다.

물론 네이버 같은 대형페이지는 구조가 계속 바뀌고 저런 CSS Selector도 고정값이 아니기 때문에, 이후에는 동작하지 않을 수 있습니다만, 가장 확실한 방법은 정식으로 네이버 API를 쓰면 되는데요, 그건 나중에 시도해보려고 합니다.

 

작은 개인 과제이지만, 이 프로젝트를 시작한 동기는 "Python을 1도 모르는 저같은 사람도, ChatGPT를 이용해서 이런 것들을 개발할 수 있다는 점을 확인하는 것"이었고, 대단히 성공적이라는 생각이 듭니다.

 

앞으로 이렇게해서 ChatGPT를 활용한 시도를 계속해보려고 합니다.

 

이상으로 chatGPT를 이용하여 네이버 최저가 검색 기능 개발기를 마칩니다.