셀레니움을 이용한
동적사이트 데이터 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×tamp=&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 파일
반응형
'개발 > Python' 카테고리의 다른 글
[py] 네이버 로그인 자동화 (ft. 셀레니움) (0) | 2022.09.25 |
---|---|
[py] 셀레니움 기본 설정 (0) | 2022.09.25 |
[py] ModuleNotFoundError: No module named 'selenium' (0) | 2022.09.22 |
[py] 크롤링한 데이터 엑셀 저장, 수정 (65) | 2022.08.07 |
[py] 네이버 뉴스 타이틀, url 크롤링 (65) | 2022.08.07 |
댓글