파진기와 함께 코딩을
비전공자도 할수있는 크롤링 본문
이번에는 비전공자도 할 수 있는 환경세팅부터 시작해서 크롤링을 상세히!! 알려드릴게요..
윈도우 기준이라 몇가지가 조금 다르긴할테지만 아마 대부분 상관없으실겅에요
환경 세팅
1. vs code설치
vs code라는 코드 쓰기 편하게 만든 코딩 전용 메모장..? 이라고 해야할까요 암튼 그친구를 본인 os에 맞는 버전으로 깔아주세요(맥, 윈도우, 리눅스 맞춰서)
깔때 막 여러개의 선택창이 나오는데 대부분 그냥 원래 세팅대로 하고 다 next 누르심 됩니다~
2. 폴더 및 파일 정리
일단 바탕화면이나 뭐 본인이 편하신 곳에 폴더를 하나 만들어 주세요.
전 원래쓰던 폴더가 있어서 얘를 써줄게요

그리구 vs코드로 들어와서 아까 본인이 만드신 경로에 있는 폴더를 찾아서 열어주세요
좌상단 파일 버튼 누르시고

폴더 열기 누르셔서

아까 만든 폴더의 경로 찾아서 열어주심 됩니다!!

그러면!! 이렇게 열리고 좌측에 종이 두장 곂친 저 아이콘을 눌러주세요
그럼 좌측에 긴 화면이 펴집니당

그리구 만든 폴더 이름에 커서를 갖다대면
저 빨간줄 그어져있는애가 나오고 저게 좌: 파일 생성 우: 폴더 생성 버튼입니다 !!
폴더버튼을 눌러 data라는 '폴더'와
파일버튼을 눌러 크롤링 '파일'을 만들어주세요.
중요한건 폴더명이 무조건 data 여야합니다!! (코드에서 경로가 해당이름으로 지정이 되어있어서 이건 꼭 지켜주세요)
여기서 또 중요한건 무조건 크롤링 파일의 이름은 상관없으나 py라는 확장자로 끝나게 만들어야합니다!!
cf) 크롤링.py, 크롤링올영.py, analysis.py etc......

그 후에 좌측에 있는 창에서 만든 크롤링파이썬 파일을 눌러주시면 오른쪽에 비어있는 창이 뜰겁니다!!

그 창에 아래 코드 복붙해주시면 됩니다!!
# [25_크롤링]올영_innercare.py
from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup
from pathlib import Path
import csv
import time
# ==== 경로를 스크립트 기준으로 고정 ====
BASE_DIR = Path(__file__).resolve().parent
DATA_DIR = BASE_DIR / "data"
if DATA_DIR.exists() and not DATA_DIR.is_dir():
DATA_DIR.unlink() # data가 '파일'이면 삭제
DATA_DIR.mkdir(parents=True, exist_ok=True)
OUT_CSV = DATA_DIR / "innercare_sales_list.csv"
def crawl_category_page_html(page, page_idx: int):
# 네가 준 생리/위생용품 카테고리 (중카테고리 페이지) + 판매정렬 prdSort=03 그대로
url = (
"https://www.oliveyoung.co.kr/store/display/getMCategoryList.do"
"?dispCatNo=100000200040001"
f"&pageIdx={page_idx}"
"&rowsPerPage=24&prdSort=03&searchTypeSort=btn_thumb"
"&plusButtonFlag=N&isLoginCnt=0&aShowCnt=0&bShowCnt=0&cShowCnt=0"
"&gateCd=Drawer&trackingCd=Cat100000200040001_MID"
)
page.goto(url, wait_until="domcontentloaded")
# 상품 카드가 로드될 때까지 대기
try:
page.wait_for_selector(".prd_info", timeout=8000)
except Exception:
# 비었을 경우 확인용 스크린샷
page.screenshot(path=str(DATA_DIR / f"innercare_p{page_idx}_empty.png"))
time.sleep(0.5)
return page.content()
def parse_list(html: str):
soup = BeautifulSoup(html, "lxml")
cards = soup.select(".prd_info")
data = []
for it in cards:
brand_el = it.select_one(".tx_brand")
name_el = it.select_one(".tx_name")
link_el = it.select_one("a")
if not (brand_el and name_el and link_el):
continue
brand = brand_el.get_text(strip=True)
name = name_el.get_text(strip=True)
href = link_el.get("href", "")
if href.startswith("/"):
href = "https://www.oliveyoung.co.kr" + href
data.append({
"product_name": name,
"product_brand": brand,
"product_link": href,
})
return data
def write_csv(rows):
print(f"[DEBUG] Writing to: {OUT_CSV}")
with OUT_CSV.open("w", encoding="utf-8-sig", newline="") as fw:
writer = csv.DictWriter(fw, fieldnames=["product_name", "product_brand", "product_link"])
writer.writeheader()
writer.writerows(rows)
if __name__ == "__main__":
num_pages = 5 # 필요한 만큼 늘리세요
total = []
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context(
user_agent=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
),
locale="ko-KR"
)
context.set_extra_http_headers({
"X-Requested-With": "XMLHttpRequest",
"Referer": "https://www.oliveyoung.co.kr/store/category/list.do?dispCatNo=100000200040001",
"Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
})
page = context.new_page()
for i in range(1, num_pages + 1):
html = crawl_category_page_html(page, i)
rows = parse_list(html)
print(f"[PAGE {i}] collected: {len(rows)} items")
# 다음 페이지가 비면 중단 (마지막 페이지 도달)
if i > 1 and len(rows) == 0:
print("[INFO] No more items. Stop.")
break
total.extend(rows)
browser.close()
if not total:
print("[WARN] 수집 0건 - 셀렉터(.prd_info)나 정렬/카테고리 파라미터 점검 필요")
write_csv(total)
print(f"[DONE] total collected: {len(total)} rows → {OUT_CSV}")
그후에 저 빨간줄 돼있는 실행 버튼 누르면 알아서 끌어와집니다!!!

크롤링이 끝날때까지 기다리시면 !! 아까만든 데이터 폴더에 알아서 정보들이 정리 되어 있는걸 보실수 있어요!!
끝!!