본문 바로가기
개발/Python

[py] 네이버 상품 목록 크롤링 해오기 (ft. 셀레니움, csv로 옮기기)

by 코딩하는 갓디노 2022. 9. 25.

네이버 쇼핑 목록 크롤링 해오기 (ft. 셀레니움)

 

셀레니움을 이용한
동적사이트 데이터 csv로 가져오기

 

예제는 스타트 코딩, 이것이 진짜 크롤링이다 기본편 강의를 들으면서 공부한 내용입니다.

 

구현 화면

mac - 여러페이지 크롤링

 

mac- 단일 페이지 크롤링

 

window

 

requests의 한계

로그인이 필요한 경우, 세션처리하는 것으로 크롤링이 어려움
동적으로 html을 만드는 경우 크롤링이 어려움

동적으로 html을 만드는 경우
v 스크롤 하거나 클릭하면 데이터가 생성됨
v url 주소가 그대로 인데 데이터가 변경되었을 경우임
v 표나 테이블 형태의 데이터


셀레니움

웹 어플리케이션 테스트를 위한 도구 
브라우저를 실제로 띄워서 사람처럼 동작하도록 만들 수 있음

 

셀레니움 설치

  • 크롬 드라이버 설치
  • 셀레니움 설치
#window
pip install selenium
pip install webdriver_manager
#mac
pip3 install selenium
pip3 install webdriver_manager

 

네이버 쇼핑 검색어 리스트 CSV로 가져오기

크롬 드라이브 최신 버전 자동 설치 코드 후(최신 코드)

#셀레니움 기본설정
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager #크롬 드라이버 자동 업데이트
import time
import csv
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys

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)
driver.get("http://www.naver.com") #웹페이지 해당 주소 이동

# 로딩이 끝날때까지 10초간 기다리기
driver.implicitly_wait(10)

# 쇼핑메뉴 클릭
driver.find_element(By.CLASS_NAME, 'shop').click()
#클릭 후 2초간 기다리기, time import 후 사용하
time.sleep(2)

# 검색창 클릭
search = driver.find_element(By.CLASS_NAME, '_searchInput_search_text_3CUDs')
search.click()

# 검색어 입력
search.send_keys('아이폰 14')
# enter 치는 명령어
search.send_keys(Keys.ENTER)

# 무한 스크롤로 상품 최대한 많이 가져오기
# 스크롤 전 높이, execute_script: 자바스크립트 실행 명령어
before_h = driver.execute_script('return window.scrollY')
# 무한 스크롤 
while True:
    #맨 아래로 스크롤을 내린다. - 키보드의 END(화살표 위) 실행
    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

# 파일 생성 - 경로, 쓰기 모드, 인코딩(mac:UTF-8, window:CP949), newline='': window에서 들어가는 자동 줄바꿈 문자 없애기
f = open(r'iphonedata.csv', 'w',encoding= 'UTF-8') #mac
#window - r'C:\project\python\iphonedata.csv', 'w',encoding= 'CP949', newline=''
cssWriter = csv.writer(f)

#상품 찾아오기
items = driver.find_elements(By.CSS_SELECTOR, '.basicList_info_area__TWvzp')
for item in items:
    name = item.find_element(By.CSS_SELECTOR, '.basicList_title__VfX3c').text
    try:
        price = item.find_element(By.CSS_SELECTOR, '.price_num__S2p_v').text
    except: #오류나는 부분 except로 처리
        price = '출시예정'
    link = item.find_element(By.CSS_SELECTOR, '.basicList_title__VfX3c > a').get_attribute('href')
    print(name, price, link)
    # 데이터 쓰기
    cssWriter.writerow([name, price, link])


# 파일 닫기
f.close()

 

크롬 드라이브 최신 버전 자동 설치 코드 전

from selenium import webdriver
# 추가로 by import 해야 함
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys
import time
import csv

# window 브라우저 생성
browser = webdriver.Chrome('C:/chromedriver.exe') 
# mac일때 /User/mac user name../Documents/chromedriver

# 사이트 열기
browser.get('https://www.naver.com')

# 로딩이 끝날때까지 10초간 기다리기
browser.implicitly_wait(10)

# 쇼핑메뉴 클릭
browser.find_element(By.CLASS_NAME, 'shop').click()
#클릭 후 2초간 기다리기, time import 후 사용하기
time.sleep(2)

# 검색창 클릭
search = browser.find_element(By.CLASS_NAME, '_searchInput_search_text_3CUDs')
search.click()

# 검색어 입력
search.send_keys('아이폰 14')
# enter 치는 명령어
search.send_keys(Keys.ENTER)

# 무한 스크롤로 상품 최대한 많이 가져오기
# 스크롤 전 높이, execute_script: 자바스크립트 실행 명령어
before_h = browser.execute_script('return window.scrollY')
# 무한 스크롤 
while True:
    #맨 아래로 스크롤을 내린다. - 키보드의 END(화살표 위) 실행
    browser.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END)
    # 스크롤 사이 페이지 로딩 시간 추가 
    time.sleep(1)
    after_h = browser.execute_script('return window.scrollY')
    if after_h == before_h:
        break
    before_h = after_h

# 파일 생성 - 경로, 쓰기 모드, 인코딩, newline='' window에서 들어가는 자동 줄바꿈 문자 없애기
f = open(r'C:\project\python\iphonedata.csv', 'w',encoding= 'CP949', newline='')
cssWriter = csv.writer(f)

#상품 찾아오기
items = browser.find_elements(By.CSS_SELECTOR, '.basicList_info_area__TWvzp')
for item in items:
    name = item.find_element(By.CSS_SELECTOR, '.basicList_title__VfX3c').text
    try:
        price = item.find_element(By.CSS_SELECTOR, '.price_num__S2p_v').text
    except:
        price = '출시예정'
    link = item.find_element(By.CSS_SELECTOR, '.basicList_title__VfX3c > a').get_attribute('href')
    print(name, price, link)
    # 데이터 쓰기
    cssWriter.writerow([name, price, link])


# 파일 닫기
f.close()

 

여러 페이지 상품 크롤링 해오기(업그레이드 코드)

  • pyautogui를 이용해 검색어와 마지막 페이지 번호를 입력 받아 여러 페이지 한번에 크롤링
  • 검색어와 페이지 번호가 들어간 쿼리를 이용하여 페이지 불러오기
  • open(r'iphonedata.csv', 'a', encoding= 'UTF-8') 사용하여 기존의 'w'는 매번 새로운 데이터를 덮어쓰기를 하므로 'a'로 기존에 있는 파일에 새로운 행을 추가
  • open 함수에 append 모드의 'a' 옵션을 주어 csv 파일의 마지막행에 데이터를 추가함
  • # 파일 열기 모드 w : 새로 만들기, a : 추가, r : 읽기
#셀레니움 기본설정
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager #크롬 드라이버 자동 업데이트
import time
import csv
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys
import pyautogui

keyword = pyautogui.prompt('검색어를 입력하세요.')
lastPage = pyautogui.prompt('마지막 페이지 번호를 입력하세요.')

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)

for i in range (1, int(lastPage)+1): #int형으로 lagePage 형변환
    print(f'{i} 페이지 -------------------')
    driver.implicitly_wait(4)
    driver.get(f'https://search.shopping.naver.com/search/all?origQuery={keyword}&pagingIndex={i}&pagingSize=40&productSet=total&query={keyword}&sort=rel&timestamp=&viewType=list')
    time.sleep(2)

    before_h = driver.execute_script('return window.scrollY')
    while True:
        #맨 아래로 스크롤을 내린다. - 키보드의 END(화살표 위) 실행
        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

    # 파일 생성 - 경로, 쓰기 모드, 인코딩
    # 기존의 #'w'에서 'a'로 변경
    f = open(r'iphonedata.csv', 'a', encoding= 'UTF-8')
    cssWriter = csv.writer(f)

        #상품 찾아오기
    items = driver.find_elements(By.CSS_SELECTOR, '.basicList_info_area__TWvzp')
    for item in items:
        name = item.find_element(By.CSS_SELECTOR, '.basicList_title__VfX3c').text
        try:
            price = item.find_element(By.CSS_SELECTOR, '.price_num__S2p_v').text
        except: #오류나는 부분 except로 처리
            price = '출시예정'

        link = item.find_element(By.CSS_SELECTOR, '.basicList_title__VfX3c > a').get_attribute('href')
        #print(name, price, link)
        # 데이터 쓰기
        cssWriter.writerow([name, price, link])
            
# 파일 닫기
f.close()

 

iphonedata.csv 파일

 

 

반응형

댓글