반응형

- requests의 한계 

   1. 로그인이 필요한 사이트의 경우

   2. 동적으로 html을 만드는 경우 ***

   

- 셀레니움 : 웹 어플리케이션 테스트를 위한 도구 ( 브라우저를 실제로 띄움)

- 셀레니움 설치 

  1. 크롬 드라이버 다운로드 ( 사용하고 있는 크롬버전 정보랑 동일한 드라이버로 설치)

      https://chromedriver.chromium.org/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 98, please download ChromeDriver 98.0.4758.48 If you are using Chrome version 97, please download ChromeDriver 97.0.4692.71 If you are using Chrome version 96, please download ChromeDriver 96.0.4664.45 For o

chromedriver.chromium.org

설치 후 c드라이브로 이동  

 

2. 명령어로 라이브러리 설치 pip install selenium

......

3. 설치 후 코드작성 후 실행하면 크롬창이 뜨는것을 확인

from selenium import webdriver

#브라우저 생성
browser = webdriver.Chrome('C:/chromedriver.exe')

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

 

위의 창에서 쇼핑탭을 개발자 도구로 확인하여 css 선택자 확인하기

(a태그 이면서 class속성값이 nav shop)

from selenium import webdriver

#브라우저 생성
browser = webdriver.Chrome('C:/chromedriver.exe')

#웹사이트 열기
browser.get('https://www.naver.com')
browser.implicitly_wait #로딩이 끝날 때 까지 10초까지는 기다림

#쇼핑 메뉴 클릭
browser.find_element_by_css_selector('a.nav.shop').click()

실행 시 네이버 쇼핑화면이 뜸

개발자도구 확인하여 검색창 css 선택자 확인

(input 태그 이면서 class속성값이 co_srh_input _input)

from select import select
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

#브라우저 생성
browser = webdriver.Chrome('C:/chromedriver.exe')

#웹사이트 열기
browser.get('https://www.naver.com')
browser.implicitly_wait(10) #로딩이 끝날 때 까지 10초까지는 기다림

#쇼핑 메뉴 클릭
browser.find_element_by_css_selector('a.nav.shop').click()
time.sleep(2) #동시에 실행됨을 막기위해 잠깐 기다림

#검색창 클릭
search = browser.find_element_by_css_selector('input.co_srh_input._input')
search.click()

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

실행해보면 naver창 뜨고 네이버쇼핑접속해서 검색상에 '아이폰 13'입력 후 검색까지...되는것을 확인

selenium은 만능이네 이것저것 다 할 수 있구나 짱짱

 

이제 상품명, 가격, 링크를 크롤링해보자

네이버쇼핑 검색결과창에서 개발자 도구 열어서 분석, 필요한 정보가 담긴 css 선택자 찾기

(부모태그 ul에 리스트들 전체정보가 담겨있음, 제목과 링크는 a태그 )

 

코드작성

( 스크롤을 끝까지 내려서 페이지 내 전체 리스트 가져오기)

from select import select
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

#브라우저 생성
browser = webdriver.Chrome('C:/chromedriver.exe')

#웹사이트 열기
browser.get('https://www.naver.com')
browser.implicitly_wait(10) #로딩이 끝날 때 까지 10초까지는 기다림

#쇼핑 메뉴 클릭
browser.find_element_by_css_selector('a.nav.shop').click()
time.sleep(2) #동시에 실행됨을 막기위해 잠깐 기다림

#검색창 클릭
search = browser.find_element_by_css_selector('input.co_srh_input._input')
search.click()

#selenium은 만능이네 이것저것 다 할 수 있구나
#검색어 입력
search.send_keys('아이폰 13')
search.send_keys(Keys.ENTER)   #enter 치는 명령어

#스크롤 내리기 전 높이 확인, 스크립트 실행함수
before_h = browser.execute_script("return window.scrollY")
#무한스크롤(반복문 활용)
while True:
    # 맨 아래로 스크롤을 내린다.
    browser.find_element_by_css_selector("body").send_keys(Keys.END) #키보드 END키

    #스트롤 사이 페이지 로딩시간
    time.sleep(1)

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

    if after_h == before_h:
        break
    before_h  = after_h

각 상품정보 div  내용가져오기 (for 문)

코드작성

from select import select
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

#브라우저 생성
browser = webdriver.Chrome('C:/chromedriver.exe')

#웹사이트 열기
browser.get('https://www.naver.com')
browser.implicitly_wait(10) #로딩이 끝날 때 까지 10초까지는 기다림

#쇼핑 메뉴 클릭
browser.find_element_by_css_selector('a.nav.shop').click()
time.sleep(2) #동시에 실행됨을 막기위해 잠깐 기다림

#검색창 클릭
search = browser.find_element_by_css_selector('input.co_srh_input._input')
search.click()

#selenium은 만능이네 이것저것 다 할 수 있구나
#검색어 입력
search.send_keys('아이폰 13')
search.send_keys(Keys.ENTER)   #enter 치는 명령어

#스크롤 내리기 전 높이 확인, 스크립트 실행함수
before_h = browser.execute_script("return window.scrollY")
#무한스크롤(반복문 활용)
while True:
    # 맨 아래로 스크롤을 내린다.
    browser.find_element_by_css_selector("body").send_keys(Keys.END) #키보드 END키

    #스트롤 사이 페이지 로딩시간
    time.sleep(1)

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

    if after_h == before_h:
        break
    before_h  = after_h

#상품 정보 div , elemets사용해서 여러건 가져오기 ( element는 한건)
items = browser.find_elements_by_css_selector(".basicList_info_area__17Xyo")

for item in items:
    name = item.find_element_by_css_selector(".basicList_title__3P9Q7").text    #상품명
    #판매 중단된 경우는 price정보가 없으므로 에러, 예외처리로 해결 (try_except)
    try :
        price = item.find_element_by_css_selector(".price_num__2WUXn").text         #가격정보
    except:
        price = "판매중단"
    #get_attribute('속성값')
    link = item.find_element_by_css_selector(".basicList_title__3P9Q7 > a").get_attribute('href')   #가격정보

    print(name,price,link)

실행결과

터미널에 40건 리스트에 해당하는 각 상품의 이름,가격, 링크정보를 보여줌

크롤링 결과를 csv파일로 저장하기

코드작성

from select import select
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import csv

#브라우저 생성
browser = webdriver.Chrome('C:/chromedriver.exe')

#웹사이트 열기
browser.get('https://www.naver.com')
browser.implicitly_wait(10) #로딩이 끝날 때 까지 10초까지는 기다림

#쇼핑 메뉴 클릭
browser.find_element_by_css_selector('a.nav.shop').click()
time.sleep(2) #동시에 실행됨을 막기위해 잠깐 기다림

#검색창 클릭
search = browser.find_element_by_css_selector('input.co_srh_input._input')
search.click()

#selenium은 만능이네 이것저것 다 할 수 있구나
#검색어 입력
search.send_keys('아이폰 13')
search.send_keys(Keys.ENTER)   #enter 치는 명령어

#스크롤 내리기 전 높이 확인, 스크립트 실행함수
before_h = browser.execute_script("return window.scrollY")
#무한스크롤(반복문 활용)
while True:
    # 맨 아래로 스크롤을 내린다.
    browser.find_element_by_css_selector("body").send_keys(Keys.END) #키보드 END키

    #스트롤 사이 페이지 로딩시간
    time.sleep(1)

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

    if after_h == before_h:
        break
    before_h  = after_h

#파일 생성 (open(파일경로, 모드_'w'쓰기,encording, newline_줄바꿈없애줌 ))
f= open(r"C:\startcoding\Chapter03\data.csv", "w", encoding="CP949", newline='')
csvWriter = csv.writer(f)

#상품 정보 div , elemets사용해서 여러건 가져오기 ( element는 한건)
items = browser.find_elements_by_css_selector(".basicList_info_area__17Xyo")

for item in items:
    name = item.find_element_by_css_selector(".basicList_title__3P9Q7").text    #상품명
    #판매 중단된 경우는 price정보가 없으므로 에러, 예외처리로 해결 (try_except)
    try :
        price = item.find_element_by_css_selector(".price_num__2WUXn").text         #가격정보
    except:
        price = "판매중단"
    #get_attribute('속성값')
    link = item.find_element_by_css_selector(".basicList_title__3P9Q7 > a").get_attribute('href')   #가격정보

    print(name,price,link)
    #데이터쓰기
    csvWriter.writerow([name,price,link])
#파일닫기
f.close()

결과

data.csv 파일 생성되고 열어보기

 

참고 [무한 스크롤 처리방법]

현재 스크롤 된 높이를 알수있는 자바스크립트 명령어 이용 : window.scrollY

 

새로고침 한 검색결과 창에서 개발자 도구를 열고 Element가 아닌 consonle탭 선택

window.scrollY 입력하고 엔터 -> 스크롤을 내리지않은 상태이므로 결과값은 0

스크롤을 조금 내린 후 명령어 한번 더 실행 (방향키 위 누르면 이전 명령어 불러옴)

결과값(px)이 증가함을 확인

 

 

 

 

 

 

 

아..진짜 넘나신기

저절로 url창이 뜨고 검색하고 검색결과 크롤링하고 내려받기 까지~~~ 진짜 좋은 강의였다!

 

 

-끝-

+ Recent posts