유유정정을 위해 써보는 셀레니움 도전기
크롬 - 설정 - 좌측하단 Chrome 정보 클릭
버전 확인 후
https://chromedriver.chromium.org/downloads
ChromeDriver - WebDriver for Chrome - Downloads
Current Releases If you are using Chrome version 109, please download ChromeDriver 109.0.5414.25 If you are using Chrome version 108, please download ChromeDriver 108.0.5359.71 If you are using Chrome version 107, please download ChromeDriver 107.0.5304.62
chromedriver.chromium.org
링크 들어가서 버전에 맞는 드라이버를 누른다.
리눅스, 맥, 윈도우에 따라서 다운받는다.
드라이버 파일을 윈도우는 C:에, 맥은 document에 놓는다.
터미널에 pip install selenium을 쳐서 다운 받는다.
.py 파일 만들고
저기서 hani는 사용자 이름이 들어가는 자리다.
윈도우일 경우 .exe를 붙이고 맥인 경우엔 붙이지 않는다.
User가 아니고 Users 다.
from selenium import webdriver
browser = webdriver.Chrome('/Users/hani/Documents/chromedriver')
browser.get('https://www.naver.com')
이 코드를 실행시키면 자동으로 크롬 창이 열린다!
근데 이런 에러가 뜬다.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import warnings
chrome_options = Options()
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) # 셀레니움 로그 무시
warnings.filterwarnings("ignore", category=DeprecationWarning) # Deprecated warning 무시
# 브라우저 생성
browser = webdriver.Chrome("/Users/hani/Documents/chromedriver", options=chrome_options)
# 웹 사이트 열기
browser.get('https://www.naver.com')
# 쇼핑 메뉴 클릭
browser.find_element(By.CLASS_NAME,'a.nav.shop').click()
검색해서 코드를 수정했는데 이번엔 By를 찾을 수 없다고 나온다.
왜냐면.. 이것도 import 해와야하는 거였다!!!!
근데 자꾸 강제종료 된다.
pip install webdriver_manager
깔아준다.
깔았는데 없다고 뜨면 pip3 install webdriver_manager 하면 될 수도 있다.
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
# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
# 불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
service = Service(executable_path=ChromeDriverManager().install())
browser = webdriver.Chrome(service=service, options=chrome_options)
# 웹 사이트 열기
browser.get('https://www.naver.com')
# 쇼핑 메뉴 클릭
browser.find_element(By.CLASS_NAME,'a.nav shop').click()
동적크롤링시 크롬창 꺼짐, 웹드라이버매니저 임포트 불가 - 인프런 | 질문 & 답변
저 동적크롤링할때 크롬창이 잠시 켜졌다가 바로꺼지면서 deprecated에러가 떠서 이전버전(3.x.x)으로 다운을 받았는데도 계속꺼지고 구글링을해보니 웹드라이버 매니저를 임포트해서 하는방법이
www.inflearn.com
이러니까 꺼지진 않는데 클릭이 안된다.
.a.nav shop 이라고 되어있는데 네이버에서 마우스를 갖다대보면 a.nav.shop으로 나온다.
클래스로 찾는다고 해서 자동으로 앞에 .을 붙이나보다.
css slecetor로 바꾸거나 a. 을 뗀다.
// 크롬 켜서 네이버의 쇼핑 클릭해 들어가게 하기
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
# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
# 불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
service = Service(executable_path=ChromeDriverManager().install())
browser = webdriver.Chrome(service=service, options=chrome_options)
# 웹 사이트 열기
browser.get('https://www.naver.com')
# 쇼핑 메뉴 클릭
browser.find_element(By.CLASS_NAME,'nav.shop').click()
이게 되는 코드다!!!
지금 보니까 CSS_SELECTOR가 있네... 그냥 이걸로만 바꿔줬어도 됐을 것 같다ㅎㅎ
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 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())
browser = webdriver.Chrome(service=service, options=chrome_options)
# 웹 사이트 열기
browser.get('https://www.naver.com')
browser.implicitly_wait(10) # 로딩이 끝날 때까지 10초까진 기다림
# 쇼핑 메뉴 클릭
browser.find_element(By.CLASS_NAME,'nav.shop').click()
# 나는 클래스 네임으로 찾았다.
time.sleep(2)
# 검색창 클릭
search = browser.find_element(By.CLASS_NAME,'_searchInput_search_text_fSuJ6')
search.click()
# 검색창 입력
search.send_keys('곰 인형')
search.send_keys(Keys.ENTER)
크롬으로 네이버 들어가서 쇼핑 들어가서 곰 인형 검색하기!!!
짱 신기하다...
그리고 상품명, 가격을 가져오려고 하는데,
똑같은 애만 왔다.
item이 전부 같은 걸로 찍히는 걸 보니 items를 가져올 때 문제가 있나보다.
... 밑에 browser를 item으로 바꿔줘야 하는데 안 바꿔서 그런 거였다.
for item in items:
print(item)
name = item.find_element(By.CLASS_NAME,'basicList_title__VfX3c').text
price = item.find_element(By.CLASS_NAME,'price_num__S2p_v').text
link = item.find_element(By.CSS_SELECTOR,'.basicList_title__VfX3c > a').get_attribute('href')
print(name, price)
이렇게 바꾸고 해결 ㅎㅎ...... 거의 한 시간 잡혀있었던 것 같은데ㅠㅠ
이제 이걸 csv파일로 만들기
f = open("/Users/hani/Documents/Python/04.네이버_쇼핑_크롤링/검색어.csv", 'w', encoding='CP949', newline='')
원하는 폴더 경로복사해서 붙여넣고 뒤에 '/파일명.csv' 써준다.
f = open("/Users/hani/Documents/Python/04.네이버_쇼핑_크롤링/검색어.csv", 'w', encoding='CP949', newline='')
csvWriter = csv.writer(f)
...
# 상품 정보 div
items = browser.find_elements(By.CLASS_NAME,'basicList_inner__xCM3J')
for item in items:
print(item)
name = item.find_element(By.CLASS_NAME,'basicList_title__VfX3c').text
try:
price = item.find_element(By.CLASS_NAME,'price_num__S2p_v').text
except:
price = "판매 중지 됐음!"
link = item.find_element(By.CSS_SELECTOR,'.basicList_title__VfX3c > a').get_attribute('href')
print(name, price)
# 데이터 쓰기
csvWriter.writerow([name, price, link])
# 파일 닫기
f.close()
for문에 csvWriter.writerow 이 부분을 추가하고
마지막에 파일 닫으면 끝
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 time
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())
browser = webdriver.Chrome(service=service, options=chrome_options)
# 웹 사이트 열기
browser.get('https://www.naver.com')
browser.implicitly_wait(10) # 로딩이 끝날 때까지 10초까진 기다림
# 쇼핑 메뉴 클릭
browser.find_element(By.CLASS_NAME,'nav.shop').click()
time.sleep(2)
# 검색창 클릭
search = browser.find_element(By.CLASS_NAME,'_searchInput_search_text_fSuJ6')
search.click()
# 검색창 입력
search.send_keys('브라이스 인형')
search.send_keys(Keys.ENTER)
# 스크롤 전 높이
before_h = browser.execute_script("return window.scrollY")
# 무한 스크롤 - 반복문 활용
while True:
# 맨 아래로 스크롤을 내린다.
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
# 파일 생성
f = open("/Users/hani/Documents/Python/04.네이버_쇼핑_크롤링/검색어.csv", 'w', encoding='CP949', newline='')
csvWriter = csv.writer(f)
# 상품 정보 div
items = browser.find_elements(By.CLASS_NAME,'basicList_inner__xCM3J')
for item in items:
print(item)
name = item.find_element(By.CLASS_NAME,'basicList_title__VfX3c').text
try:
price = item.find_element(By.CLASS_NAME,'price_num__S2p_v').text
except:
price = "판매 중지 됐음!"
link = item.find_element(By.CSS_SELECTOR,'.basicList_title__VfX3c > a').get_attribute('href')
print(name, price)
# 데이터 쓰기
csvWriter.writerow([name, price, link])
# 파일 닫기
f.close()
'공부👻' 카테고리의 다른 글
no such element: Unable to locate element (0) | 2023.01.06 |
---|---|
/bin/sh: python: command not found (0) | 2023.01.04 |
XHR failed Vscode Extension 설치 안 됨 (0) | 2023.01.03 |
카카오톡 크롤링 - 워드 클라우드, 파이썬 🥳~ (2) | 2022.12.29 |