섹션 5
📌 셀레니움 ver 4.0 가이드
셀레니움 다운로드
: cmd에 pip install selenium 입력
webdriver_manager 다운로드
: cmd에 pip install webdriver_manager 입력
웹사이트 자동화 종류
- 크롤링
- 로그인
- 업로드
- 다운로드
- 좋아요
셀레니움 기본 설정
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)
# 웹페이지 해당 주소로 이동
driver.get("https://www.naver.com")
네이버 로그인 자동화
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 webdriver_manager.chrome import ChromeDriverManager
import time
import pyautogui
import pyperclip
# 브라우저 꺼짐 방지
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.implicitly_wait(5) # 웹 페이지가 로딩될 때까지 5초 기다림.
driver.maximize_window() # 화면 최대화
driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/")
# 아이디 입력 창
id = driver.find_element(By.CSS_SELECTOR, "#id")
id.click()
pyperclip.copy("...")
pyautogui.hotkey("ctrl", "v")
time.sleep(2)
# 비밀번호 입력 창
pw = driver.find_element(By.CSS_SELECTOR, "#pw")
pw.click()
pyperclip.copy("...")
pyautogui.hotkey("ctrl", "v")
time.sleep(2)
# 로그인
login_btn= driver.find_element(By.CSS_SELECTOR, "#log\.login")
login_btn.click()
📌 셀레니움 기초 사용법 정리
requests의 한계
- 로그인이 필요한 사이트의 크롤링이 어려움
- 동적으로 HTML으로 만드는 경우에 크롤링이 어려움
동적으로 HTML을 만드는 경우
: 스크롤하거나 클릭 시 데이터가 생성됨.(URL 주소는 변하지 않았는데 데이터가 변함, 보통 표나 테이블 형태의 데이터)
셀레니움
- 웹 어플리케이션 테스트를 위한 도구
- 브라우저를 실제로 띄워서 사람처럼 동작하도록 만들 수 있음
셀레니움 기초 사용법
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
# 크롬 드라이버 자동 업데이트
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://shopping.naver.com/home"
driver.get(url)
driver.implicitly_wait(10)
search = driver.find_element(By.CSS_SELECTOR, "#__next > div > div.pcHeader_header__eETRe > div > div > div._gnb_header_area_150KE > div > div._gnbLogo_gnb_logo_3eIAf > div > div._gnbSearch_gnb_search_3O1L2 > form > div._gnbSearch_inner_2Zksb > div > input")
search.click()
# 검색어 입력
search.send_keys('아이폰 13')
search.send_keys(Keys.ENTER)
무한 스크롤 처리 방법
현재 스크롤된 높이를 알 수 있는 자바스크립트 명령어를 이용한다.
window.scrollY : 픽셀 단위
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
# 크롬 드라이버 자동 업데이트
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://shopping.naver.com/home"
driver.get(url)
driver.implicitly_wait(10)
search = driver.find_element(By.CSS_SELECTOR, "#__next > div > div.pcHeader_header__eETRe > div > div > div._gnb_header_area_150KE > div > div._gnbLogo_gnb_logo_3eIAf > div > div._gnbSearch_gnb_search_3O1L2 > form > div._gnbSearch_inner_2Zksb > div > input")
search.click()
# 검색어 입력
search.send_keys('아이폰 13')
search.send_keys(Keys.ENTER)
# 스크롤 전 높이
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
📌 네이버 쇼핑 상보 정보 수집하기
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import csv
import time
# 크롬 드라이버 자동 업데이트
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://shopping.naver.com/home"
driver.get(url)
driver.implicitly_wait(10)
search = driver.find_element(By.CSS_SELECTOR, "#__next > div > div.pcHeader_header__eETRe > div > div > div._gnb_header_area_150KE > div > div._gnbLogo_gnb_logo_3eIAf > div > div._gnbSearch_gnb_search_3O1L2 > form > div._gnbSearch_inner_2Zksb > div > input")
search.click()
# 검색어 입력
search.send_keys('아이폰 13')
search.send_keys(Keys.ENTER)
# 스크롤 전 높이
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"C:\startcoding\03. 네이버 쇼핑 크롤링\data.csv", 'w', encoding='CP949', newline='')
csvWriter = csv.writer(f)
# 상품 정보 div
items = driver.find_elements(By.CSS_SELECTOR, ".product_info_area__xxCTi")
for item in items:
name = item.find_element(By.CSS_SELECTOR, ".product_title__Mmw2K").text
try:
price = item.find_element(By.CSS_SELECTOR, ".price_num__S2p_v").text
except:
price = "판매중단"
link = item.find_element(By.CSS_SELECTOR, ".product_title__Mmw2K > a").get_attribute('href')
print(name, price, link)
# 데이터 쓰기
csvWriter.writerow([name, price, link])
# 엑셀 파일 닫기
f.close()
섹션 5와 6을 듣고 완강했습니다! 데이터를 분석하고 시각화하는 것을 배운 뒤에 이러한 데이터를 어떻게 얻어야하는지에 대한 강의를 들으면서 하나의 절차를 머릿속으로 완성한 것 같습니다. 이제부터는 직접 프로젝트를 진행할 예정입니다.
'학회&동아리 > FORZA' 카테고리의 다른 글
[FORZA STUDY] 스타트 코딩 - 이것이 진짜 크롤링이다 기본편 week2 (0) | 2023.06.30 |
---|---|
[FORZA STUDY] 스타트 코딩 - 이것이 진짜 크롤링이다 기본편 week1 (0) | 2023.06.21 |
[FORZA STUDY] 나도코딩 - 데이터분석 및 시각화 week6 (2) | 2023.05.27 |
[FORZA STUDY] 나도코딩 - 데이터분석 및 시각화 week5 (0) | 2023.05.21 |
[FORZA STUDY] 나도코딩 - 데이터분석 및 시각화 week4 (0) | 2023.05.14 |