이 가이드에서는 다음을 배우게 됩니다:
- AliExpress 스크레이퍼란 무엇이며 어떻게 작동하는지
- AliExpress에서 자동으로 수집 가능한 데이터 유형
- 파이썬을 사용한 AliExpress 스크래핑 스크립트 구축 방법
자, 시작해 보겠습니다!
AliExpress 스크레이퍼란 무엇인가요?
AliExpress 스크레이퍼는 AliExpress 페이지에서 특정 데이터를 자동으로 추출합니다. 사용자의 브라우징 습관을 모방하여 AliExpress 페이지를 탐색합니다. 웹 페이지 콘텐츠를 CSV나 JSON과 같은 사용 가능한 형식으로 변환하고 페이지네이션과 같은 상호작용을 제어합니다. 최종 목표는 제품 이미지, 제품 상세 정보, 고객 피드백, 가격 등 구조화된 정보를 추출하는 것입니다.
웹 스크레이퍼 구축에 대해 더 알고 싶다면, 스크레이핑 봇 구축 방법 가이드를 읽어보세요.
AliExpress에서 스크래핑할 수 있는 데이터: 단계별 가이드
AliExpress에는 다음과 같은 방대한 정보가 포함되어 있습니다:
- 제품 상세 정보: 이름, 설명, 이미지, 가격대, 판매자 정보 등.
- 고객 피드백: 평점, 제품 리뷰 등.
- 카테고리 및 태그: 상품 카테고리, 관련 태그 또는 라벨.
이제 이 정보를 스크래핑하는 방법을 배워볼 시간입니다!
파이썬으로 알리익스프레스 스크래핑하기
이 튜토리얼 섹션에서는 AliExpress 스크레이퍼를 구축하는 방법에 대한 단계별 가이드를 제공합니다.
목표는 AliExpress의 “인체공학적 의자” 페이지에서 정보를 자동으로 추출하는 Python 스크립트 작성 과정을 안내하는 것입니다:

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 파일을 생성하세요. 이제 프로젝트 폴더 구조는 다음과 같아야 합니다:

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

이 개발자 도구 섹션에서 페이지가 동적 쿼리를 수행하는지 확인하세요. 페이지를 새로 고친 후 여러 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 브라우저가 아래와 같이 자동으로 열립니다:

훌륭합니다! “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 요소를 검사하여 선택 방법, 포함된 데이터 유형 식별, 데이터 추출 방식을 파악합니다.

각 제품 요소가 .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 구조를 이해하세요:

제품 이미지, 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 파일에 다음과 같이 추출된 데이터가 포함됩니다:

기능적인 스크래핑 스크립트를 완성한 후 수행할 수 있는 몇 가지 추가 단계가 있습니다. 여기에는 실행 프로세스 자동화 및 스크래퍼가 시간이 지나도 가치 있는 데이터를 지속적으로 제공하도록 보장하기 위한 최적화 구현이 포함됩니다.
결론
이 가이드에서는 알리익스프레스 스크레이퍼의 정의와 추출 가능한 데이터 유형을 살펴보았습니다. 또한 최소한의 코드로 알리익스프레스 상품 스크레이핑을 위한 Python 스크립트를 만드는 방법도 배웠습니다.
그러나 AliExpress 스크래핑에는 여러 가지 어려움이 따릅니다. 플랫폼은 강력한 봇 방지 보호 기능을 구현하고 페이지네이션과 같은 기능을 사용하여 스크래핑 과정을 복잡하게 만듭니다. 강력한 Alibaba 스크래핑 솔루션을 개발하는 것은 상당히 어려울 수 있습니다.
당사의 AliExpress 스크레이퍼 API는 이러한 어려움을 해소할 수 있는 전문적인 솔루션을 제공합니다. 간단한 API 호출만으로 대상 사이트에서 데이터를 원활하게 가져올 수 있으며 차단 위험도 완화됩니다. 데이터를 빠르게 필요하시나요?
스크레이퍼 API를 사용해 보시거나 데이터셋을 살펴보고 싶으신가요? 지금 바로 Bright Data 계정을 생성하고 무료 체험을 시작하세요!