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")