파이썬으로 AliExpress 스크래핑하는 방법

파이썬으로 AliExpress 스크래핑 마스터하기: 단계별 가이드로 제품 데이터, 가격, 리뷰를 효율적으로 추출하세요.
5 분 읽기
How to Scrape AliExpress blog image

이 가이드에서는 다음을 배우게 됩니다:

  • AliExpress 스크레이퍼란 무엇이며 어떻게 작동하는지
  • AliExpress에서 자동으로 수집 가능한 데이터 유형
  • 파이썬을 사용한 AliExpress 스크래핑 스크립트 구축 방법

자, 시작해 보겠습니다!

AliExpress 스크레이퍼란 무엇인가요?

AliExpress 스크레이퍼는 AliExpress 페이지에서 특정 데이터를 자동으로 추출합니다. 사용자의 브라우징 습관을 모방하여 AliExpress 페이지를 탐색합니다. 웹 페이지 콘텐츠를 CSV나 JSON과 같은 사용 가능한 형식으로 변환하고 페이지네이션과 같은 상호작용을 제어합니다. 최종 목표는 제품 이미지, 제품 상세 정보, 고객 피드백, 가격 등 구조화된 정보를 추출하는 것입니다.

웹 스크레이퍼 구축에 대해 더 알고 싶다면, 스크레이핑 봇 구축 방법 가이드를 읽어보세요.

AliExpress에서 스크래핑할 수 있는 데이터: 단계별 가이드

AliExpress에는 다음과 같은 방대한 정보가 포함되어 있습니다:

  • 제품 상세 정보: 이름, 설명, 이미지, 가격대, 판매자 정보 등.
  • 고객 피드백: 평점, 제품 리뷰 등.
  • 카테고리 및 태그: 상품 카테고리, 관련 태그 또는 라벨.

이제 이 정보를 스크래핑하는 방법을 배워볼 시간입니다!

파이썬으로 알리익스프레스 스크래핑하기

이 튜토리얼 섹션에서는 AliExpress 스크레이퍼를 구축하는 방법에 대한 단계별 가이드를 제공합니다.

목표는 AliExpress의 “인체공학적 의자” 페이지에서 정보를 자동으로 추출하는 Python 스크립트 작성 과정을 안내하는 것입니다:

the AliExpress “ergonomic chair” page

1단계: 프로젝트 설정

로컬 컴퓨터에 Python 3이 설치되어 있는지 확인하세요. 설치되어 있지 않다면 공식 문서에서 다운로드하고 설치 마법사를 따라 설정하세요.

다음으로 아래 명령어를 사용하여 프로젝트 디렉터리를 생성하세요:

mkdir aliexpress-scraper

이 디렉토리에 Python 코드를 저장할 예정입니다.

터미널에서 디렉터리로 이동한 후 가상 환경을 생성하세요:

cd aliexpress-scraper
python -m venv env

이제 Visual Studio Code와 같은 선호하는 Python IDE (Python 확장 기능 포함)에서 프로젝트 폴더를 로드하세요.

IDE 터미널에서 가상 환경을 활성화하세요. macOS 또는 Linux 사용 시 다음 명령어를 실행하세요:

.env/bin/activate

Windows에서는 다음 명령어를 사용하세요:

env/Scripts/activate

좋습니다!

루트 프로젝트 디렉터리에서 scraper.py 파일을 생성하세요. 이제 프로젝트 폴더 구조는 다음과 같아야 합니다:

This is how the folder should look like for your AliExpress scraper

좋아요! AliExpress 웹 스크래핑을 위한 Python 환경이 준비되었습니다.

2단계: 스크래핑 라이브러리 선택

현재 목표는 AliExpress가 동적 페이지와 정적 페이지 중 어떤 방식을 사용하는지 확인하는 것입니다. 브라우저의 개인 모드 또는 시크릿 모드로 대상 AliExpress 페이지로 이동하세요. 그런 다음 웹페이지 배경의 빈 공간을 마우스 오른쪽 버튼으로 클릭하고 “검사” 옵션을 선택한 후 “네트워크” 탭으로 이동하세요. “Fetch/XHR” 필터를 적용하고 페이지를 새로 고침하세요:

Inspecting the Fetch/XHR under the network tab

이 개발자 도구 섹션에서 페이지가 동적 쿼리를 수행하는지 확인하세요. 페이지를 새로 고친 후 여러 Fetch/XHR 요청이 표시됩니다. 이는 페이지가 추가 콘텐츠를 로드하기 위해 동적 요청을 사용함을 의미합니다. 서버에서 반환된 HTML 문서와 비교하여 페이지 DOM을 살펴보면 AliExpress가 자바스크립트 렌더링을 사용한다는 점도 확인할 수 있습니다.

AliExpress를 효과적으로 스크래핑하려면 대상 페이지가 렌더링에 자바스크립트를 의존하므로 Selenium과 같은 브라우저 자동화 도구가 필요합니다. Selenium 웹 스크래핑에 관한 저희 블로그는 초보자에게 훌륭한 자료입니다.

Selenium을 사용하면 웹 브라우저를 조작하고, 사용자 상호작용을 모방하며, 자바스크립트로 렌더링된 콘텐츠를 스크래핑할 수 있습니다. 설치하고 사용을 시작하세요!

3단계: Selenium 설치 및 구성

활성화된 가상 환경에서 다음 명령어로 Selenium을 설치하세요:

pip install -U selenium

scraper.py 파일에서 Selenium의 WebDriver를 임포트하고 초기화합니다.

from selenium import webdriver

# Chrome 드라이버 초기화
driver = webdriver.Chrome()

# 스크래핑 로직...

# 드라이버 종료
driver.quit()

위 코드에서는 Chrome 인스턴스를 처리하기 위해 WebDriver를 초기화합니다. AliExpress에는 헤드리스 브라우저의 사이트 접근을 차단할 수 있는 스크래핑 방지 조치가 적용되어 있다는 점을 유의해야 합니다.

따라서 --headless 플래그를 설정하는 것은 권장되지 않습니다. 대신 Playwright Stealth와 같은 대안을 고려하세요.

이제 AliExpress 스크래핑을 시작할 준비가 모두 완료되었으니, 대상 페이지에 연결하는 방법을 살펴보겠습니다.

4단계: 대상 페이지에 연결하기

Selenium WebDriver 객체가 제공하는 get() 메서드를 사용하여 대상 페이지를 방문합니다. scraper.py 파일은 이제 다음과 같아야 합니다:

from selenium import webdriver

# Chrome 드라이버 초기화
driver = webdriver.Chrome()

# 대상 페이지 URL
url = "https://www.aliexpress.com/w/wholesale-ergonomic-chair.html?spm=a2g0o.productlist.search.0"

# 대상 페이지에 연결
driver.get(url)

# 스크래핑 로직...

# 드라이버 종료
driver.quit()

마지막 줄에 디버깅 중단점을 설정하고 디버거로 스크립트를 실행하세요. 제어되는 Chrome 브라우저가 아래와 같이 자동으로 열립니다:

The page that was automatically opened on AliExpress

훌륭합니다! “Chrome이 자동화 테스트 소프트웨어에 의해 제어되고 있습니다”라는 알림은 Selenium이 설정된 대로 Chrome을 성공적으로 제어하고 있음을 나타냅니다.

단계 #5: 제품 요소 선택

AliExpress 제품 페이지에는 여러 제품이 포함되어 있으므로, 스크래핑된 데이터를 저장할 데이터 구조를 먼저 초기화해야 합니다. 이를 위해 배열이 완벽하게 작동합니다:

products = []

사이트 레이아웃이 변경되더라도 스크래퍼가 계속 작동하도록 하려면, 선택자가 변경 사항에 더 강건하게 대응할 수 있도록 헬퍼 함수를 만들어야 합니다:

def find_element_smart(parent, by_list):
    """요소가 발견될 때까지 여러 선택자를 시도"""
    for by_type, selector in by_list:
        try:
            element = parent.find_element(by_type, selector)
            if element.is_displayed():
                return element
        except:
            continue
    return None

find_element_smart() 함수는 by_list에 포함된 선택기 전략 목록을 순회하며 지정된 부모 요소 내의 요소를 찾습니다. 가시적인 요소를 찾을 때까지 각 <by_type, selector> 쌍을 시도하며, 성공 시 해당 요소를 반환합니다. 일치하는 요소가 없으면 None을 반환합니다.

다음으로 페이지의 제품 HTML 요소를 검사하여 선택 방법, 포함된 데이터 유형 식별, 데이터 추출 방식을 파악합니다.

Checking the elements of the product card on AliExpress

각 제품 요소가 .list-–gallery—-C2f2tvm 노드임은 명백합니다.

list--gallery--C2f2tvm은 무작위로 생성된 문자열을 포함하므로 언제든지 변경될 수 있습니다. 따라서 요소 선택에 이 클래스만 의존해서는 안 됩니다. 대신 이미지 및 링크를 모두 포함하는 div 요소와 같이 제품의 구조를 기반으로 제품을 찾는 것부터 시작해야 합니다. 이 방법이 통하지 않으면 콘텐츠를 기반으로 제품을 찾거나 더 구체적인 HTML 요소에 집중해 보세요.

제품 선택 로직을 아래와 같이 구현하세요:

# 구조적 패턴으로 제품을 먼저 찾고, 실패 시 클래스 패턴으로 대체
product_selectors = [
    (By.XPATH, "//div[.//img and .//a[contains(@href, 'item')]]"),
    (By.XPATH, "//div[.//img and .//*[contains(text(), '$')]]"),
    (By.CSS_SELECTOR, "div[class*='gallery']")
]
# 제품 대기 및 획득
wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div[class*='gallery']")))

products_found = []
for selector_type, selector in product_selectors:
    try:
        elements = wait.until(EC.presence_of_all_elements_located((selector_type, selector)))
        if elements:
            products_found = elements
            break
    except:
        continue

위 코드는 일반적인 CSS 선택자를 사용하여 페이지의 요소를 검색하는 선택자 전략을 적용합니다.

Python 스크립트에 다음 임포트를 포함하세요:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 

그런 다음 WebDriver 초기화 직후, 페이지 상호작용 전에 WebDriverWait 인스턴스를 도입하세요:

wait = WebDriverWait(driver, 20)

AliExpress와 같은 동적 웹사이트를 스크래핑할 때 페이지의 요소를 즉시 찾지 않고, WebDriverWait는 스크래퍼에게 인내심을 갖고 지정된 시간(이 경우 20초)까지 요소가 나타날 때까지 기다리도록 지시합니다. 이는 웹 페이지가 요소를 서로 다른 속도로 로드하기 때문에 중요합니다. 적절한 대기 시간 없이 스크래퍼가 아직 로드되지 않은 요소로 작업하면 오류가 발생할 수 있습니다.

이제 알리익스프레스 완전 스크래핑에 한 걸음 더 가까워졌습니다!

6단계: AliExpress 상품 요소 스크래핑

제품 요소를 검사하여 HTML 구조를 이해하세요:

Inspecting a product on AliExpress to see its HTML

제품 이미지, URL, 이름 또는 제목, 가격, 할인을 스크래핑할 수 있음이 분명합니다.

각 제품을 스크래핑하기 전에 뷰포트에 표시되는지 확인하세요:

wait.until(EC.visibility_of(product))

이제 각 제품 데이터를 스크래핑할 선택기를 설정합니다. 변경될 수 있는 특정 클래스명 대신 다음과 같은 패턴을 사용하세요:

# 이미지 가져오기 - 소스 패턴으로 제품 이미지 찾기
img_element = find_element_smart(product, [
        (By.XPATH, ".//img[contains(@src, 'item') or contains(@src, 'product')]"),
        (By.CSS_SELECTOR, "img[src*='item']"),
        (By.CSS_SELECTOR, "img[class*='image']")
    ])

# URL 가져오기 - 제품 링크 찾기
url_element = find_element_smart(product, [
        (By.CSS_SELECTOR, "a[href*='item']"),
        (By.XPATH, ".//a[contains(@href, 'product')]")
    ])

# 제목 가져오기 - 가장 긴 텍스트 요소를 우선 검색
price_element = find_element_smart(product, [
        (By.CSS_SELECTOR, "*[class*='price-sale']"),
        (By.CSS_SELECTOR, "*[class*='price']"),
        (By.XPATH, ".//*[contains(@class, 'price')]")
    ])

# 가격 가져오기 - 통화 기호/패턴 찾기
price_element = find_element_smart(product, [
        (By.XPATH, ".//*[contains(text(), '$') or contains(text(), 'US') or contains(text(), 'GHS')]"),
        (By.XPATH, ".//*[contains(@class, 'price')]")
    ])

# 할인 정보가 있으면 가져오기 시도
discount_element = find_element_smart(product, [
        (By.XPATH, ".//*[contains(text(), '%') or contains(text(), 'OFF')]"),
        (By.CSS_SELECTOR, "[class*='discount']")
    ])

find_element() 함수는 지정된 CSS 선택자와 일치하는 첫 번째 요소를 반환합니다. 이후 text 속성을 사용하여 해당 텍스트 콘텐츠를 추출할 수 있습니다.

스크랩한 데이터를 products 배열에 추가하고 이를 사용하여 제품 사전(dictionary)을 채웁니다:

products.append({
    "image_url": img_element.get_attribute("src"),
    "product_url": url_element.get_attribute("href"),
    "product_title": title_element.text.strip(),
    "product_price": price_element.text.strip(),
    "product_discount": discount_element.text.strip() if discount_element else "N/A"
})

이제 데이터 추출 로직이 완성되어 사용할 준비가 되었습니다.

7단계: 스크랩된 데이터를 CSV로 내보내기

현재 설정에서는 스크랩된 데이터가 products 배열에 저장됩니다. 다른 사람과 공유하고 접근할 수 있도록 CSV 파일과 같은 사람이 읽을 수 있는 형식으로 내보내야 합니다. 스크랩된 데이터로 CSV 파일을 생성하고 채우는 방법은 다음과 같습니다:

# CSV에 데이터 쓰기
csv_file_name = "aliexpress_products.csv"
with open(csv_file_name, mode="w", newline="", encoding="utf-8") as csv_file:
    fieldnames = ["image_url", "product_url", "product_title", "product_price", "product_discount"]
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    writer.writeheader()
    for product in products:
        writer.writerow(product)

이 코드는 스프레드시트처럼 작동하는 CSV 파일을 생성합니다. 각 상품은 별도의 행을 가지며, 상품에 대한 다양한 세부 정보(이미지, URL, 제목, 가격, 할인 정보 등)가 별도의 열에 배치됩니다. 최종 생성된 aliexpress_products.csv 파일을 열면 스크랩한 모든 AliExpress 상품 정보가 깔끔하게 열별로 정리된 것을 확인할 수 있습니다.

마지막으로, Python 표준 라이브러리에서 csv 라이브러리를 스크립트에 임포트하세요:

import csv

8단계: 모든 코드 통합

모든 코드를 통합한 후 최종 스크래핑 스크립트는 다음과 같아야 합니다:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import csv


def find_element_smart(parent, by_list):
    """여러 선택자를 시도하여 요소를 찾을 때까지"""
    for by_type, selector in by_list:
        try:
            element = parent.find_element(by_type, selector)
            if element.is_displayed():
                return element
        except:
            continue
    return None


# 드라이버 초기화
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)

# 대상 URL
url = "https://www.aliexpress.com/w/wholesale-ergonomic-chair.html?spm=a2g0o.productlist.search.0"
driver.get(url)

# 초기 상품 로드 대기
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div[class*='gallery']")))

# 스크랩된 데이터 저장 위치
products = []

# 패턴을 사용해 제품을 찾은 후, 클래스 패턴으로 대체
product_selectors = [
    (By.XPATH, "//div[.//img and .//a[contains(@href, 'item')]]"),
    (By.XPATH, "//div[.//img and .//*[contains(text(), '$')]]"),
    (By.CSS_SELECTOR, "div[class*='gallery']")
]
# 제품 대기 및 획득
wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div[class*='gallery']")))
products_found = []
for selector_type, selector in product_selectors:
    try:
        elements = wait.until(EC.presence_of_all_elements_located((selector_type, selector)))
        if elements:
            products_found = elements
            break
    except:
        continue

# 발견된 제품을 반복 처리하며 데이터를 추출
for product in products_found:
    # 제품이 표시되고 상호작용 가능해질 때까지 대기
    wait.until(EC.visibility_of(product))
    
    # 이미지 획득 - 소스 패턴으로 제품 이미지 검색
    img_element = find_element_smart(product, [
        (By.XPATH, ".//img[contains(@src, 'item') or contains(@src, 'product')]"),
        (By.CSS_SELECTOR, "img[src*='item']"),
        (By.CSS_SELECTOR, "img[class*='image']")
    ])
    # URL 가져오기 - 제품 링크 찾기
    url_element = find_element_smart(product, [
        (By.CSS_SELECTOR, "a[href*='item']"),
        (By.XPATH, ".//a[contains(@href, 'product')]")
    ])
    # 제목 가져오기 - 가장 긴 텍스트 요소를 먼저 찾음
    title_element = find_element_smart(product, [
        (By.XPATH, ".//div[string-length(text()) > 20]"),
        (By.XPATH, ".//*[contains(@class, 'title')]"),
        (By.CSS_SELECTOR, "[class*='name']")
    ])
    
    # 가격 요소 가져오기
    price_element = find_element_smart(product, [
        (By.CSS_SELECTOR, "*[class*='price-sale']"),
        (By.CSS_SELECTOR, "*[class*='price']"),
        (By.XPATH, ".//*[contains(@class, 'price')]")
    ])

    if all([img_element, url_element, title_element, price_element]):
        # 할인 정보가 있으면 가져옴
        discount_element = find_element_smart(product, [
            (By.XPATH, ".//*[contains(text(), '%') or contains(text(), 'OFF')]"),
            (By.CSS_SELECTOR, "[class*='discount']")
        ])

        products.append({
            "image_url": img_element.get_attribute("src"),
            "product_url": url_element.get_attribute("href"),
            "product_title": title_element.text.strip(),
            "product_price": price_element.text.strip(),
            "product_discount": discount_element.text.strip() if discount_element else "N/A"
        })

# 결과 저장
csv_file_name = "aliexpress_products.csv"
with open(csv_file_name, mode="w", newline="", encoding="utf-8") as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=["image_url", "product_url", "product_title", "product_price", "product_discount"])
    writer.writeheader()
    writer.writerows(products)

driver.quit()

이제 다음 명령어로 스크레이퍼를 실행하세요:

python scraper.py

스크립트가 성공적으로 실행되면 aliexpress_products.csv 파일에 다음과 같이 추출된 데이터가 포함됩니다:

Final results file of the AliExpress products

기능적인 스크래핑 스크립트를 완성한 후 수행할 수 있는 몇 가지 추가 단계가 있습니다. 여기에는 실행 프로세스 자동화 및 스크래퍼가 시간이 지나도 가치 있는 데이터를 지속적으로 제공하도록 보장하기 위한 최적화 구현이 포함됩니다.

결론

이 가이드에서는 알리익스프레스 스크레이퍼의 정의와 추출 가능한 데이터 유형을 살펴보았습니다. 또한 최소한의 코드로 알리익스프레스 상품 스크레이핑을 위한 Python 스크립트를 만드는 방법도 배웠습니다.

그러나 AliExpress 스크래핑에는 여러 가지 어려움이 따릅니다. 플랫폼은 강력한 봇 방지 보호 기능을 구현하고 페이지네이션과 같은 기능을 사용하여 스크래핑 과정을 복잡하게 만듭니다. 강력한 Alibaba 스크래핑 솔루션을 개발하는 것은 상당히 어려울 수 있습니다.

당사의 AliExpress 스크레이퍼 API는 이러한 어려움을 해소할 수 있는 전문적인 솔루션을 제공합니다. 간단한 API 호출만으로 대상 사이트에서 데이터를 원활하게 가져올 수 있으며 차단 위험도 완화됩니다. 데이터를 빠르게 필요하시나요?

스크레이퍼 API를 사용해 보시거나 데이터셋을 살펴보고 싶으신가요? 지금 바로 Bright Data 계정을 생성하고 무료 체험을 시작하세요!