(250122)

mini_bang·2025년 1월 21일

11번가 크롤링

1. Selenium과 Chrome 설정

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(options=chrome_options)

왜 이렇게 해야 하나요?

  • 우리는 웹사이트에 직접 접속해서 데이터를 가져오고 싶습니다. 이걸 프로그램으로 하려면 브라우저가 필요합니다.
  • Selenium은 브라우저를 조종할 수 있는 도구입니다. 여기서 Chrome 브라우저를 선택했죠.
  • --headless 모드는 브라우저를 눈에 보이지 않게 실행합니다. 즉, 백그라운드에서만 작동해 사람이 보는 브라우저 창이 뜨지 않습니다.

결론: 프로그램이 직접 브라우저를 실행하고, 사람 대신 웹사이트에서 정보를 가져오도록 준비하는 단계입니다.


2. 11번가 베스트셀러 페이지로 이동

driver.get('https://www.11st.co.kr/browsing/BestSeller.tmall?method=getBestSellerMain&xfrom=main^gnb')

왜 이렇게 해야 하나요?

  • 우리가 정보를 가져오고 싶은 곳은 11번가 베스트셀러 페이지입니다.
  • driver.get(URL)은 브라우저를 해당 URL로 이동시키는 명령입니다.

결론: Selenium이 브라우저를 열고, 우리가 크롤링하고 싶은 웹페이지에 도착하게 합니다.


3. 스크롤 다운

SCROLL_PAUSE_SEC = 1
last_height = driver.execute_script('return document.body.scrollHeight')

while True:
    driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
    time.sleep(SCROLL_PAUSE_SEC)
    new_height = driver.execute_script('return document.body.scrollHeight')
    if new_height == last_height:
        break
    last_height = new_height

왜 이렇게 해야 하나요?

  • 11번가의 베스트셀러 페이지는 스크롤을 내려야 모든 상품이 로드됩니다.
  • 기본적으로 웹사이트는 "필요한 만큼만 데이터를 보여주는 방식"을 사용해 속도를 높입니다.
    • 이를 무한 스크롤 방식이라고 합니다.
  • 위 코드는 스크롤을 맨 아래로 내려서 추가 데이터를 로드하는 역할을 합니다.
    • driver.execute_script('window.scrollTo(...)'): 스크롤을 아래로 내립니다.
    • time.sleep(SCROLL_PAUSE_SEC): 데이터를 로드할 시간을 줍니다.
    • 새로 로드된 데이터가 없으면 스크롤을 멈춥니다.

결론: 페이지에 보이지 않는 상품 데이터를 불러오기 위해 "스크롤 다운" 과정을 추가한 겁니다.


4. 상품 데이터를 가져오기

lists = driver.find_element(By.ID, 'bestPrdList').find_element(By.CLASS_NAME, 'viewtype')
bestlist = lists.find_elements(By.TAG_NAME, 'li')

for item in bestlist:
    rank = item.find_element(By.CLASS_NAME, 'best').text
    product_name = item.find_element(By.CLASS_NAME, 'pname').find_element(By.TAG_NAME, 'p').text
    price = item.find_element(By.CLASS_NAME, 'sale_price').text
    product_url = item.find_element(By.CLASS_NAME, 'box_pd.ranking_pd').find_element(By.TAG_NAME, 'a').get_attribute('href')
    image_url = item.find_element(By.CLASS_NAME, 'img_plot').find_element(By.TAG_NAME, 'img').get_attribute('src')

왜 이렇게 해야 하나요?

  • HTML 구조를 보면, 상품 정보는 <li> 태그로 나열되어 있습니다.
  • Selenium은 HTML에서 특정 요소를 찾아 데이터를 가져올 수 있습니다.
    • find_element(By.ID, ...)는 특정 ID를 가진 HTML 요소를 찾습니다.
    • find_elements(By.TAG_NAME, ...)는 다수의 태그를 리스트로 가져옵니다.
    • .text는 HTML 요소 안의 텍스트 데이터를 가져옵니다.
    • .get_attribute('href').get_attribute('src')는 링크(URL) 같은 속성 값을 가져옵니다.

결론: 상품 이름, 가격, 순위, 이미지 등 필요한 데이터를 하나씩 뽑아오기 위한 작업입니다.


5. 데이터를 리스트에 저장

all_data.append({
    "Rank": rank,
    "Product Name": product_name,
    "Price": price,
    "Product URL": product_url,
    "Image URL": image_url
})

왜 이렇게 해야 하나요?

  • 데이터를 깔끔하게 정리하려면 딕셔너리 형태로 저장하는 것이 좋습니다.
    • Rank: 순위
    • Product Name: 상품명
    • Price: 가격
    • Product URL: 상품 링크
    • Image URL: 이미지 링크
  • 각 상품 정보를 딕셔너리에 저장한 뒤, 이를 리스트(all_data)에 추가합니다.

결론: 수집한 정보를 정리해서 나중에 활용하기 쉽게 저장합니다.


6. 데이터를 DataFrame으로 변환 및 저장

df = pd.DataFrame(all_data)
df.to_csv('./11st_best_sellers.csv', index=False, encoding='utf-8')

왜 이렇게 해야 하나요?

  • 데이터를 보기 편하게 정리하려면 표 형태로 변환해야 합니다.
    • 판다스(pandas)의 데이터프레임은 행/열로 데이터를 다루기 쉽게 만들어줍니다.
  • 데이터를 파일로 저장하기 위해 CSV 형식을 사용합니다.
    • CSV는 엑셀 등에서 쉽게 열 수 있는 형식입니다.

결론: 데이터를 구조화하고 파일로 저장해 나중에 분석하거나 확인할 수 있도록 합니다.


이 코드가 필요한 이유 정리

  1. 반복적인 작업 자동화: 사람이 웹사이트를 방문하고 하나씩 데이터를 복사하는 대신, 코드를 사용해 자동으로 데이터를 가져옵니다.
  2. 무한 스크롤 페이지 처리: 데이터를 다 불러오려면 스크롤을 끝까지 내려야 하므로, 프로그램이 이를 대신 처리합니다.
  3. 구조화된 데이터 저장: 상품 정보를 표 형태로 정리하고 파일로 저장해 데이터를 쉽게 분석하거나 활용할 수 있습니다.
  4. 시간과 노력을 절약: 수십 개, 수백 개의 상품 데이터를 클릭 없이 몇 초 만에 가져올 수 있습니다.

0개의 댓글