머신러닝
파이썬_크롤링5 (Selenium, 네이버 쇼핑, 첫번째 페이지, 상품명/가격/판매자명/링크 불러오기, csv파일 저장)
정문가
2022. 5. 8. 14:56
!pip install selenium
from selenium import webdriver #webdriver=웹 통제하는 라이브러리
from selenium.webdriver.common.keys import Keys #Keys=웹 통해 값 입력할 때 사용하는 라이브러리(키보드)
from selenium.webdriver.common.by import By
import time #time= 컴퓨터에게 쉬는시간 부여하는 라이브러리
#웹사이트 열기
driver = webdriver.Chrome() #webdriver야, chrome 실행시켜라. 경로는 ()에 있어. 크롤링 작업공간과 크롬 드라이버 같은 공간에 있을 경우 공란 ().
driver.get("https://www.naver.com") #네이버 페이지로 이동
driver.implicitly_wait(10) #로딩 끝날 때까지 10초 기다리기
#쇼핑 메뉴 클릭
#driver.find_element_by_css_selector("a.nav.shop").click()
driver.find_element(by=By.CSS_SELECTOR, value="a.nav.shop").click()
time.sleep(2)
#검색창 클릭
#search=driver.find_element_by_css_selector("input.co_srh_input._input")#검색창 위치(크롬>도구더보기>개발자모드 또는 F12)
search=driver.find_element(by=By.CSS_SELECTOR, value="input.co_srh_input._input")#검색창 위치(크롬>도구더보기>개발자모드 또는 F12)
# search=driver.find_element_by_id("query")
search.click()
#검색어 입력
search.send_keys("햇반") #Keys로 검색할 창에 검색할 단어 입력
search.send_keys(Keys.ENTER) #Keys로 키보드의 엔터라는 값 입력 또는
#btn=driver.find_element_by_id("search_btn") #btn.click() 검색이라는 버튼 위치+버튼 클릭하라는 명령어 click()
#낮은가격순 클릭
#driver.find_element_by_xpath("/html/body/div/div/div[2]/div[2]/div[4]/div[1]/div[1]/div[1]/div[1]/a[2]").click()
#driver.find_element_by_xpath("/html/body/div/div/div[2]/div[2]/div[3]/div[1]/div[1]/div/div[1]/a[2]").click()
#driver.find_element_by_css_selector(".subFilter_sort__rQUtM").click() #정보 버튼 클릭
#time.sleep(2)
#driver.back() #뒤로가기
import csv
#무한 스크롤 (반복문)
#스크롤 전의 스크롤바 높이
before_h=driver.execute_script("return window.scrollY")
while True :
driver.find_element(by=By.CSS_SELECTOR, value="body").send_keys(Keys.END) #맨 아래로 스크롤 내린다
time.sleep(2) #스크롤 하는 동안의 로딩시간
#스크롤 후의 스크롤바 높이
after_h=driver.execute_script("return window.scrollY")
if after_h==before_h:
break
before_h=after_h
##파일 생성
f = open(r"C:\\Users\\flyto\\네이버햇반크롤링0508.csv","w", encoding="CP949", newline="")
csvWriter = csv.writer(f)
#상품 정보 div
#items = driver.find_elements_by_css_selector(
# ".basicList_info_area__17Xyo") #상품정보 포함하고 있는 영역
#items = driver.find_elements_by_css_selector(
# ".basicList_item__2XT81") #상품정보 포함하고 있는 큰영역
items = driver.find_elements(by=By.CSS_SELECTOR, value=".basicList_item__2XT81") #상품정보 포함하고 있는 큰영역
for item in items:
##상품명##
name = item.find_element(by=By.CSS_SELECTOR, value=".basicList_title__3P9Q7").text
##가격##
try :
price =item.find_element(by=By.CSS_SELECTOR, value=
".price_num__2WUXn").text
except:
#오류가 발생했다면
price = "판매중단"
##링크##
link = item.find_element(by=By.CSS_SELECTOR, value=
".basicList_title__3P9Q7 > a").get_attribute('href')
##판매자명##
#item.find_element_by_css_selector(".common_btn_detail__1Fu0c").click() #정보 버튼 클릭
#seller = item.find_element_by_xpath("/html/body/div[2]/div/div[2]/div/strong").text #정보창 내 업체명을 텍스트로
#driver.find_element_by_css_selector(".layer_btn_close__2Reyi").click() #정보창 닫기
##판매자명리스트##
try:
item.find_element(by=By.CSS_SELECTOR, value=".basicList_brand__Sa0wB").click() #새탭 열기
driver.switch_to.window(driver.window_handles[-1]) #새로 열린 탭으로 전환 후 작업.
before_h=driver.execute_script("return window.scrollY") #스크롤 전의 스크롤바 높이
while True :
driver.find_element(by=By.CSS_SELECTOR, value="body").send_keys(Keys.END) #맨 아래로 스크롤 내린다
time.sleep(10) #스크롤 하는 동안의 로딩시간
after_h=driver.execute_script("return window.scrollY") #스크롤 후의 스크롤바 높이
if after_h==before_h:
break
before_h=after_h
sellerids = driver.find_elements(by=By.CSS_SELECTOR, value=".productList_inner__3wBIh") #판매자명 있는 리스트
for sellerid in sellerids :
name = sellerid.find_element(by=By.CSS_SELECTOR, value=".productList_title__uCZ0P").text
seller = sellerid.find_element(by=By.CSS_SELECTOR, value=".productList_mall_link__1-Q4X").text
price = sellerid.find_element(by=By.CSS_SELECTOR, value=".productList_value__XRe6h").text
#link = sellerid.find_element(by=By.CSS_SELECTOR, value=".productList_title__uCZ0P").get_attribute('href')
print(name, price, seller)#, link)
#driver.close()
driver.switch_to.window(driver.window_handles[0])
except:
item.find_element(by=By.CSS_SELECTOR, value=".common_btn_detail__1Fu0c").click() #정보 버튼 클릭
time.sleep(2)
seller = item.find_element_by_xpath("/html/body/div[2]/div/div[2]/div/strong").text #정보창 내 업체명을 텍스트로
driver.find_element(by=By.CSS_SELECTOR, value=".layer_btn_close__2Reyi").click() #정보창 닫기
print(name, price, seller)
csvWriter.writerow([name, price, seller])
f.close()