네이버 쇼핑 크롤링 - 세팅하기
1. pip 설치 명령어
pip install openpyxl==3.1.2 requests==2.31.0 selenium==4.12.0 webdriver_manager==4.0.0
2. 가상환경 활성화 명령어
2-1. Windows
source .venv/Scripts/activate
2-2. macOS
source .venv/Scripts/activate
chat GPT4.0 답변
# Windows (cmd.exe)
.\venv\Scripts\activate
# Windows (powershell.exe)
.\venv\Scripts\Activate.ps1
# macOS / Linux
source venv/bin/activate
네이버 쇼핑 크롤링 - 페이지 진입
무한 스크롤
스크롤을 내릴때 마다 데이터를 조회해서 노출 시키는 방식
- 현상: 네이버 > 쇼핑 > 임의 검색 (ex. 후드티) > 스크롤 아래로 이동 > 스크롤 영역 확인 시 스크롤 위치가 올라간다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
import requests
from io import BytesIO
# Chrome 브라우저를 제어할 때 사용할 옵션을 설정할 수 있는 Options 객체 생성
# 나중에 Chrome을 실행할 때 필요한 여러 설정을 추가할 수 있게 해준다.
chrome_options = Options()
# 브라우저가 실행된 후에 자동으로 닫히지 않도록 설정하는 옵션 추가
# 코드 실행이 끝나도 브라우저가 계속 열려 있어서 결과 확인 가능 (기본적으로 Selenium은 브라우저를 닫음)
chrome_options.add_experimental_option("detach", True)
# 브라우저 실행 시에 나오는 불필요한 로그 메시지를 숨기는 옵션 추가
# 보통 Chrome을 제어할 때 콘솔에 여러 로그 메시지가 출력되는데,
# 이 설정을 통해 특정 로그(특히 enable-logging 관련된 로그)를 제외시켜 깔끔하게 가능
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
# webdriver.Chrome()을 사용해 Chrome 브라우저를 chrome_options을 적용해서 브라우저를 실행
driver = webdriver.Chrome(options=chrome_options)
# 웹 사이트 열기
driver.get('https://www.naver.com')
# 2초 대기
time.sleep(2)
# 네이버 접속 후 [쇼핑] Tab 클릭 (개발자 도구 확인 시 class=service_icon type_shopping > 클래스니까 . 사이 공백에도 .)
driver.find_element(By.CSS_SELECTOR, '.service_icon.type_shopping').click()
# 2초 대기
time.sleep(2)
# 쇼핑 선택 시 새 탭에 열리는데, 그 창으로 이동
new_window = driver.window_handles[1] # index 0부터니까 웹 브라우저에서 2번째 탭은 [1] > new_window 넣기
driver.switch_to.window(new_window) # new_window인 새 탭(쇼핑 탭)으로 전환
driver.maximize_window() # 창 최대화
# 검색창 선택
serach = driver.find_element(By.CSS_SELECTOR, 'input._searchInput_search_text_3CUDs') # input 태그의 클래스가 _searchInput_search_text_3CUDs 찾아
serach.click() # 검색창 선택
# 검색어 입력
serach.send_keys('후드티')
serach.send_keys(Keys.ENTER)
# 스크롤 위치 초기값 저장 (웹 브라우저 스크롤 위치 가져오기)
before_h = driver.execute_script("return window.scrollY")
while True:
# 스크롤 내리기 (body를 찾고 스크롤을 내리기 위해 END 키를 선택하는 것)
driver.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END)
# 스크롤 후 대기 (END 키 한번 누르고 1초 대기)
time.sleep(1)
# 스크롤 후 위치 저장 (END 키 한번 누르고 나서 스크롤 위치)
after_h = driver.execute_script("return window.scrollY")
# 스크롤 위치 비교 및 종료 조건: 내리기 전과 후의 위치가 같은지 확인
# 만약 두 값이 같다면, 더 이상 페이지를 아래로 스크롤할 수 없다는 뜻이야. (즉, 페이지의 끝에 도달)
if after_h == before_h:
break
before_h = after_h
# 검색어에 따른 검색 데이터 찾기
items = driver.find_elements(By.CSS_SELECTOR, '.product_item__MDtDF')
# 검색 데이터 가져오기 (2개 이상이니까 반복문!)
for item in items:
# 상품명
names = item.find_elements(By.CSS_SELECTOR, '.product_title__Mmw2K')
name = names[0].text if names else "이름 없음"
# 가격 찾기
prices = item.find_elements(By.CSS_SELECTOR, '.price_num__S2p_v')
price = prices[0].text if prices else "가격 없음"
# 링크 찾기
links = item.find_elements(By.CSS_SELECTOR, '.product_title__Mmw2K > a') # 상품명 안에 있는 <a> 선택 시 상품 이동하니까.
link = links[0].text if links else "링크 없음"
# 리뷰 개수
review_totals = item.find_elements(By.CSS_SELECTOR, '.product_num__fafe5')
review_total = review_totals[0].text if review_totals else "리뷰 없음"
# 이미지 찾기 (썸네일)
images = item.find_elements(By.CSS_SELECTOR, '.thumbnail_thumb__Bxb6Z > img')
image = images[0].get_attribute('src') if images else "이미지 없음" # <img> 태그 안 src 속성 값을 가져와야 하니까 get_attribute
# 정보들을 딕셔너리 타입으로 묶어주기
product_info = {
'상품명': name,
'가격': price,
'링크': link,
'총 리뷰 수': review_total,
'이미지': image,
}
print(product_info)
# 드라이버 종료
driver.quit()
'🔍QA & TEST > 🧑🏻💻Python' 카테고리의 다른 글
vs code > wsl > Linux/Ubnutu > oh my zsh (0) | 2024.08.23 |
---|---|
[팀 스파르타-업무자동화] 3주차 - openpyxl 라이브러리 (0) | 2024.08.18 |
[팀 스파르타-업무자동화] 2주차 - 2-5 Selenium으로 오늘의 날씨 가져오기 (0) | 2024.08.11 |
[Python] 날개 달기 : 예외 처리 (try-except/finally/else) (0) | 2024.07.27 |
[Python] 날개 달기 : 패키지 (Package) (0) | 2024.07.26 |