Today I Learned

셀레니움(Selenium) 시작하기 - 네이버 쇼핑 크롤링

by Holly Yoon

* 해당 포스팅은 스타트코딩님의 (무료)이것이 크롤링이다를 학습하고 정리한 내용입니다.

1. 네이버 창을 띄워보자 

해당 코드는 암기할 필요가 없으며, 복-붙해서 프로젝트마다 활용하면 됩니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options


# 크롬 드라이버 자동 업데이트
from webdriver_manager.chrome import ChromeDriverManager

# 브라우저 자동꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

#불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ['enable-logging'])

service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)

# 주소 이동
url = "https://www.naver.com"
driver.get(url)

 

2. 네이버 로그인을 해보자

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import pyautogui
import time
import pyperclip

# 크롬 드라이버 자동 업데이트
from webdriver_manager.chrome import ChromeDriverManager

# 브라우저 자동꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

#불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ['enable-logging'])
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)

# 네이버 로그인 주소 이동
url = "https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com"
driver.implicitly_wait(5) #로딩될 때 까지 5초 기다리기
driver.maximize_window() #화면 최대화
driver.get(url)

# 네이버 ID 입력창 찾기
id = driver.find_element(By.CSS_SELECTOR, "#id")

# 네이버 ID 입력창에 입력하기
id.click()
pyperclip.copy("아이디를 입력하세요!")
pyautogui.hotkey("ctrl","v")
time.sleep(2)

# 네이버 PW 창 찾고 입력하기
pw = driver.find_element(By.CSS_SELECTOR, "#pw")
pw.click()
pyperclip.copy("비밀번호를 입력하세요!")
time.sleep(2)

# 로그인 버튼 클릭하기
login_btn = driver.find_element(By.CSS_SELECTOR, "#log\.login")
login_btn.click()
  • time.sleep()을 통해 자동입력 방지문자가 나타나지 않도록 만들었습니다.
  • 내 맥에서는 pyautogui.hotkey가 동작하지 않아서, 다음 코드를 사용했습니다.
# 아이디 입력창
id = browser.find_element(By.CSS_SELECTOR,"#id")
id.click()
pyperclip.copy("ID를 입력하세요!")
pyautogui.keyDown('command') # ctrl 키를 누른 상태를 유지합니다.
pyautogui.press('v') # c key를 입력합니다. 
pyautogui.keyUp('command') # ctrl 키를 뗍니다. 
time.sleep(2)

 

3. 무한 스크롤을 해보자 (동적 웹스크랩핑)

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import pyautogui
import time
import pyperclip

# 크롬 드라이버 자동 업데이트
from webdriver_manager.chrome import ChromeDriverManager

# 브라우저 자동꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

#불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ['enable-logging'])

service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)

# 네이버 쇼핑 페이지로 이동
url = "https://search.shopping.naver.com/search/all?query=%EC%8B%9D%EB%AC%BC%EC%98%81%EC%96%91%EC%A0%9C&cat_id=&frm=NVSHATC"
driver.implicitly_wait(5) #로딩될 때 까지 5초 기다리기
driver.maximize_window() #화면 최대화
driver.get(url)
time.sleep(5)

# 스크롤 전 높이
before_h = driver.execute_script("return window.scrollY")

# 무한 높이
while True:
    #맨 아래로 스크롤을 내린다
    driver.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END)
    time.sleep(1)

    #스크롤 후 높이
    after_h = driver.execute_script("return window.scrollY")

    if after_h == before_h:
        break
    before_h = after_h
  • send_keys(Keys.END)가 잘 작동하지 않는다면, import Keys 앞에서 해줬는지 확인합니다.

 

4. 네이버 쇼핑페이지 항목을 크롤링해서 CSV파일로 저장해보자

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import pyautogui
import time
import pyperclip
import csv

# 크롬 드라이버 자동 업데이트
from webdriver_manager.chrome import ChromeDriverManager

# 브라우저 자동꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

#불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ['enable-logging'])

service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)

# 네이버 쇼핑 페이지로 이동
url = "https://search.shopping.naver.com/search/all?query=%EC%8B%9D%EB%AC%BC%EC%98%81%EC%96%91%EC%A0%9C&cat_id=&frm=NVSHATC"
driver.implicitly_wait(5) #로딩될 때 까지 5초 기다리기
driver.maximize_window() #화면 최대화
driver.get(url)
time.sleep(5)

# 스크롤 전 높이
before_h = driver.execute_script("return window.scrollY")

# 무한 높이
while True:
    #맨 아래로 스크롤을 내린다
    driver.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END)
    time.sleep(1)

    #스크롤 후 높이
    after_h = driver.execute_script("return window.scrollY")

    if after_h == before_h:
        break
    before_h = after_h
    
# 파일 생성
f = open(r"/Users/hollyyoon/Documents/python_basic/data.csv", 'w', encoding='UTF-8', newline='') 
csvWriter = csv.writer(f)

# 상품정보 불러오기
items = driver.find_elements(By.CSS_SELECTOR, 'div.basicList_info_area__TWvzp')
for item in items:
    name = item.find_element(By.CSS_SELECTOR, '.basicList_link__JLQJf').text
    try:
        price = item.find_element(By.CSS_SELECTOR, '.price_num__S2p_v').text
    except:
        price = '판매 중단'
    link = item.find_element(By.CSS_SELECTOR, 'a.basicList_link__JLQJf').get_attribute('href')
    print(name, price, link)
    # 데이터 쓰기
    csvWriter.writerow([name, price, link])

# 파일 닫기
f.close()
  • import csv 해줍니다.
  • 상품 정보 불러오기 전, 파일 생성해줍니다. open('파일 경로', '쓰기모드(w)', 인코딩 코드 정하기, 줄바꿈 문자 없애기)
  • 인코딩에 대한 자세한 글은 해당 블로그 글 참고합니다. 제 mac에서는 UTF-8로 하니 한글 잘 안깨지고 잘 나왔습니다.
  • VSCode Excel Viewer 설치하면, 파일 바로 볼 수 있어서 편합니다. (참고)

블로그의 정보

Study Log by Holly

Holly Yoon

활동하기