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 메서드를 사용하여 데이터프레임을 엑셀 파일로 저장합니다.