Python 실습 | 웹 크롤링

2024. 12. 23. 21:59·Python

Selenium 환경 설정

  • 필수 라이브러리 설치
pip install selenium pandas

 

Selenium 기본 사용법

  • 기본 코드
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# 1) 브라우저 열기
driver = webdriver.Chrome()
driver.get("https://www.google.com")

# 2) 검색창 찾기
search_box = driver.find_element(By.XPATH, '//*[@id="APjFqb"]')

# 3) 검색어 입력 및 검색
search_box.send_keys("Selenium")  # 키워드로 Selenium넣기
search_box.send_keys(Keys.RETURN)  # 엔터누르기

# 4) 대기 후 브라우저 닫기
time.sleep(5)
driver.quit()

 

동적 페이지 스크롤 및 데이터 추출

  • 무신사 상품 데이터 크롤링
    • 목표 : 무신사 인기 상품의 이름과 가격을 추출하고 CSV파일로 저장

무신사 인기상품 이 페이지 크롤링 예정!

from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd
import time

# 1. 브라우저 열기
driver = webdriver.Chrome()
driver.get("https://www.musinsa.com/main/musinsa/ranking")
time.sleep(3)  # 페이지 로드 대기

# 팝업 끄기 (클릭까지 누르기)
driver.find_element(By.XPATH, '/html/body/section/div[2]/button').click()


# 페이지 끝까지 스크롤
prev_height = driver.execute_script("return document.body.scrollHeight")
# 일단 최대 스크롤 길이 확인
prev_height
# 요건 옵션으로 맨 위에 부분을 가져오거나, 0픽셀부터 1000픽셀 위치까지 스크롤할 때 등 사용하는 코드 
driver.execute_script("window.scrollTo(0, 0);")
driver.execute_script("window.scrollTo(0, 1000);")
driver.execute_script("window.scrollTo(1000, 2000);")
# 그리고 만약에 자동 크롤링이 막히면 이 코드 쓰면 됨
scroll_amount = 1000  # 스크롤 할 양 (1000 픽셀씩)
prev_height = 0  # 초기 높이

while True:
    # 스크롤 내리기
    driver.execute_script(f"window.scrollBy(0, {scroll_amount});")
    time.sleep(2)

    # 새로운 높이 가져오기
    new_height = driver.execute_script("return window.scrollY + window.innerHeight")
    max_height = driver.execute_script("return document.body.scrollHeight")

    # 더 이상 스크롤할 곳이 없으면 종료
    if new_height >= max_height:
        break
# 2. 데이터 수집
# f12로 개발자도구 들어가서 수집 원하는 영역의 xpath 카피, 여러 개 해서 패턴 찾기 
# //*[@id="commonLayoutContents"]/article/div[101]/div[1]/div[2]/div[1]/a[1]/p
# //*[@id="commonLayoutContents"]/article/div[4]/div[2]/div[2]/div[1]/a[1]/p
# //*[@id="commonLayoutContents"]/article/div[10]/div[1]/div[2]/div[1]/a[1]/p
# //*[@id="commonLayoutContents"]/article/div[36]/div[2]/div[2]/div[1]/a[1]/p

# 위와 같은 xpath들에서 공통점 찾아서 다른 부분은 지우고 같은 것만 남기기
# //*[@id="commonLayoutContents"]/article/div/div/div[2]/div/a[1]/p

# find_element's'는 비슷한 애들 다 긁어오는거
driver.find_elements(By.XPATH,'//*[@id="commonLayoutContents"]/article/div/div/div[2]/div/a[1]/p')

# 새로운 변수에 담기
title_list = driver.find_elements(By.XPATH,'//*[@id="commonLayoutContents"]/article/div/div/div[2]/div/a[1]/p')

# 개수 확인 (이따가 title말고 price도 확인할거니까 둘다 개수 같은가 확인해야 함)
len(title_list)
'''
296
'''

# 3. 텍스트 추출
title_list = [t.text for t in title_list]
title_list

여기까지 하면 이렇게 리스트 나옴

 

# price도 똑같이 시행 
price_list = driver.find_elements(By.XPATH,'//*[@id="commonLayoutContents"]/article/div/div/div[2]/div/div/span')
len(price_list)
'''
812 <- 근데 812로 len이 다름. 왜일지 찾아보자
'''
price_list = [p.text for p in price_list]
price_list

보니까 가격이 아닌 것들까지 다 포함이 되어있어서임

 

# 그래서 이렇게 '원'을 포함하는 것만 다시 리스트에 담음
filtered_price_list = [item for item in price_list if "원" in item]
# 이 코드도 동일하게 사용 가능함 (%를 제외하는 방식)
filtered_price_list = [item for item in price_list if "%" not in item]

len(filtered_price_list)
'''
296 <- 이제 개수가 동일함
'''

 

# 한번 잘 나오나 확인하고
pd.DataFrame({'브랜드':title_list,'price':filtered_price_list})

# 4. 데이터 저장
df = pd.DataFrame({'브랜드':title_list,'price':filtered_price_list})
# 파일 형태로 컴퓨터에 저장 완료!
df.to_csv('my_data.csv',index=False)

# 5. 브라우저 닫기
driver.quit()

 

  • 날짜별로 크롤링 파일 저장
# 날짜별로 크롤링 파일 저장
import datetime

now = datetime.datetime.now()
file_name = f"{now.strftime('%Y-%m-%d')}_output.csv"
df.to_csv(file_name, index=False, encoding="utf-8-sig")
'Python' 카테고리의 다른 글
  • Python 실습 | 데이터 조회, 정렬, 조건 필터 / 데이터 합치기 / iris 데이터 활용 / 삼성전자 주가 데이터 처리
  • Python 실습 | 짝수와 홀수, 평균 구하기
  • Python 공부 | Pandas로 데이터 선택하기
  • Python 공부 | Pandas로 데이터 확인, 데이터 타입 변경
초담
초담
4년차 마케터입니다
  • 초담
    그로스마케터의 기록
    초담
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (117)
      • Data Analytics Project (3)
      • SQL (55)
      • Python (43)
      • GA4 (0)
      • Tableau (8)
      • 아티클 스터디 (7)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
초담
Python 실습 | 웹 크롤링
상단으로

티스토리툴바