OUTTA

G마켓 크롤링 코드

뉴욕킴 2024. 7. 8. 23:16

1. Selenium 드라이버 설정 및 로드

 

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import re

# ChromeDriver 경로를 명시적으로 지정 (환경에 맞게 경로 설정)
chrome_driver_path = '/path/to/chromedriver'  # 실제 chromedriver 경로로 수정

# Selenium 옵션 설정
chrome_options = Options()
# chrome_options.add_argument("--headless")  # 브라우저 창을 띄우지 않음
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")

# selenium driver 로드
driver = webdriver.Chrome(chrome_driver_path, options=chrome_options)

 

  • 필요한 라이브러리를 임포트합니다.
  • chrome_driver_path에 실제 ChromeDriver 경로를 지정합니다.
  • chrome_options를 설정하여 크롬 브라우저 옵션을 지정합니다.
  • webdriver.Chrome을 통해 크롬 드라이버를 로드합니다.

 

2. 상품명 크롤링

# 상품명 정보를 받을 리스트
prod_name_list = []

# 링크 전달
driver.get("https://www.gmarket.co.kr/n/best?viewType=G&groupCode=G03")

# CSS_SELECTOR를 활용해서 a 태그를 갖는 class가 itemname인 모든 원소들 갖고오기
elements = driver.find_elements(By.CSS_SELECTOR, "a.itemname")

# elements의 모든 원소에 대해서
for elem in elements:
  # elem의 text만 뽑아서 append
  prod_name_list.append(elem.text)

# driver 종료
driver.quit()
print(prod_name_list)
print(len(prod_name_list))

 

  • prod_name_list 리스트를 생성하여 상품명을 저장할 준비를 합니다.
  • G마켓 베스트 페이지로 이동합니다.
  • CSS 셀렉터를 사용하여 a.itemname 클래스를 가진 모든 요소를 찾습니다.
  • 각 요소의 텍스트를 추출하여 prod_name_list에 추가합니다.
  • 드라이버를 종료하고 결과를 출력합니다.

3. 판매가 크롤링

# selenium driver 로드
driver = webdriver.Chrome(chrome_driver_path, options=chrome_options)

# 세일 후 상품 가격 정보를 받을 리스트
prod_s_price_list = []

# 링크 전달
driver.get("https://www.gmarket.co.kr/n/best?viewType=G&groupCode=G03")

# CSS_SELECTOR를 활용해서 div 태그를 갖는 class가 s-price인 모든 원소들 갖고오기
elements = driver.find_elements(By.CSS_SELECTOR, "div.s-price")

# elements의 모든 원소에 대해서
for elem in elements:
  # elem의 text만 뽑아서 append
  prod_s_price_list.append(elem.text)

# driver 종료
driver.quit()
print(prod_s_price_list)
print(len(prod_s_price_list))

 

 

  • 크롬 드라이버를 다시 로드합니다.
  • prod_s_price_list 리스트를 생성하여 세일 후 가격을 저장할 준비를 합니다.
  • G마켓 베스트 페이지로 이동합니다.
  • CSS 셀렉터를 사용하여 div.s-price 클래스를 가진 모든 요소를 찾습니다.
  • 각 요소의 텍스트를 추출하여 prod_s_price_list에 추가합니다.
  • 드라이버를 종료하고 결과를 출력합니다.

 

4. 정가 크롤링

# selenium driver 로드
driver = webdriver.Chrome(chrome_driver_path, options=chrome_options)

# 세일 전 상품 가격 정보를 받을 리스트
prod_o_price_list = []

# 링크 전달
driver.get("https://www.gmarket.co.kr/n/best?viewType=G&groupCode=G03")

# CSS_SELECTOR를 활용해서 div 태그를 갖는 class가 o-price인 모든 원소들 갖고오기
elements = driver.find_elements(By.CSS_SELECTOR, "div.o-price")

# elements의 모든 원소에 대해서
for elem in elements:
  # elem의 text만 뽑아서 append
  prod_o_price_list.append(elem.text)

# driver 종료
driver.quit()
print(prod_o_price_list)
print(len(prod_o_price_list))

 

 

  • 크롬 드라이버를 다시 로드합니다.
  • prod_o_price_list 리스트를 생성하여 정가를 저장할 준비를 합니다.
  • G마켓 베스트 페이지로 이동합니다.
  • CSS 셀렉터를 사용하여 div.o-price 클래스를 가진 모든 요소를 찾습니다.
  • 각 요소의 텍스트를 추출하여 prod_o_price_list에 추가합니다.
  • 드라이버를 종료하고 결과를 출력합니다.

 

5. 상품명, 판매가, 정가 통합 크롤링

# selenium driver 로드
driver = webdriver.Chrome(chrome_driver_path, options=chrome_options)

# 상품 정보를 받을 리스트
prod_info_list = []

# 링크 전달
driver.get("https://www.gmarket.co.kr/n/best?viewType=G&groupCode=G03")

# CSS_SELECTOR를 활용해서 li 태그를 모두 가져오기
lis = driver.find_elements(By.CSS_SELECTOR, "li")

# li들을 돌면서
for li in lis:
  try:  # itemname 가져오기 시도하는데
    itemname = li.find_element(By.CSS_SELECTOR, "a.itemname")
  except:  # 실패할 경우
    continue  # 다음 루프로 넘어감
  # sale_price 가져오기
  sale_price = li.find_element(By.CSS_SELECTOR, "div.s-price")
  try:
    original_price = li.find_element(By.CSS_SELECTOR, "div.o-price")
  except:
    original_price = ""
  # prod_info_list에 쌓기
  prod_info_list.append((itemname.text, sale_price.text, original_price.text))

# driver 종료
driver.quit()
print(prod_info_list)
print(len(prod_info_list))

 

 

  • 크롬 드라이버를 다시 로드합니다.
  • prod_info_list 리스트를 생성하여 상품 정보를 저장할 준비를 합니다.
  • G마켓 베스트 페이지로 이동합니다.
  • CSS 셀렉터를 사용하여 모든 li 태그를 찾습니다.
  • 각 li 태그를 돌면서 a.itemname, div.s-price, div.o-price 요소를 찾고 텍스트를 추출하여 prod_info_list에 추가합니다.
  • 드라이버를 종료하고 결과를 출력합니다.

 

6. 데이터프레임 생성 및 전처리

gmarket_df = pd.DataFrame(prod_info_list, columns=['상품명', '판매가', '정가'])

import re
def extract_number(x):
    price = re.findall(r"\d+", x)  # 숫자만 추출
    # 데이터가 빈 경우가 있으므로 try, except문 사용
    try:
        price_num = price[0].replace("원", "")  # replace로 "원"을 제거
        # 천원 아래 가격도 있을 수 있으므로 try, except문 사용
        try:
            price_num = int(price_num.replace(",", ""))  # replace로 쉼표까지 제거하고 int로 변환
        except:
            price_num = int(price_num)  # 아닐 경우 그냥 int로 변환
    except:
        return None
    return price_num if price else None  # 데이터가 있을 경우 price_num을 반환, 아닐 경우 None을 반환

gmarket_df['정가'] = gmarket_df['정가'].apply(extract_number)
gmarket_df['판매가'] = gmarket_df['판매가'].apply(extract_number)

# 각 행의 정가 열이 NaN이면 판매가를 대입
def fill_na_with_sales(row):
    if pd.isna(row['정가']):
        return row['판매가']
    else:
        return row['정가']

gmarket_df['정가'] = gmarket_df.apply(fill_na_with_sales, axis=1)
gmarket_df['정가'] = gmarket_df['정가'].apply(int)
gmarket_df

 

 

  • prod_info_list를 사용하여 데이터프레임을 생성합니다.
  • extract_number 함수를 정의하여 문자열에서 숫자만 추출합니다.
  • apply 메서드를 사용하여 정가와 판매가 컬럼에 extract_number 함수를 적용합니다.
  • fill_na_with_sales 함수를 정의하여 정가가 NaN인 경우 판매가로 대체합니다.
  • apply 메서드를 사용하여 fill_na_with_sales 함수를 정가 컬럼에 적용합니다.

7. 엑셀 파일로 저장

# 엑셀파일로 저장
gmarket_df.to_excel('gmarket_best_item.xlsx')

 

  • to_excel 메서드를 사용하여 데이터프레임을 엑셀 파일로 저장합니다.