네이버 쇼핑몰 크롤링하기(셀레니움, python, thread)




📍 네이버 쇼핑몰 크롤링




📌 필수 라이브러리


Python
#쇼핑몰 크롤링 필수 라이브러리 설치
from selenium import webdriver # 셀레니움 라이브러리
from selenium.webdriver.common.by import By # 홈페이지 선택자를 가져오는 라이브러리
import time # 시간을 잠시 멈추기 위한 라이브러리
from selenium.webdriver.common.keys import Keys # 키
import pandas as pd 
import numpy as np
import threading # 스레드 라이브러리



📌 크롬창 열기


Python
# 크롬 열어주기
driver = webdriver.Chrome()
driver.get('https://shopping.naver.com/home')

# 찾고싶은 물건 입력
catagori = input("찾고 싶은 물건을 입력해주세요 : ")

try :
    driver.get(f'https://search.shopping.naver.com/search/all?query={catagori}&frm=NVSHSRC&vertical=search')
    time.sleep(1)
    
except(e):
    print(e)



📌 스레드 함수 정의


Python
# 상품 내용 dictionary로 저장(elements)
# findElements 매게변수 
#p_count = 현재 상품 index, 현재 상품 셀레니움 elements, 선택자 종류, 크롤링할 선택자
def findElements(p_count,j, By, selector):
    for k in j.find_elements(By, selector):
        # 공백 지우기
        if k.text.strip() != "":
            # 객체 나누기
            content_split = k.text.split(":")
            data[p_count][content_split[0]] = content_split[-1]




📌 크롤링 하기


Python
# 쇼핑몰 크롤링하기
# 크롤링한 시간 세기
start_time = time.time()
# 크롤링 페이지 개수
count = 7
product_count = 0
data = []

# 입력된 페이지만큼 크롤링
for i in range(count):
    # 페이지 맨 밑으로 스크롤 내리기
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    time.sleep(1)
    # 모든 상품 크롤링
    search_content_input = driver.find_elements(By.CLASS_NAME, 'product_info_area__xxCTi')
    # 크롤링한 상품 개수 만큼 객체에 넣기
    for j in search_content_input:
                data.append({})
                # 스레드로 상품정보 입력 함수
                content = threading.Thread(target=findElements,args=(product_count,j,By.CSS_SELECTOR,'.product_desc__m2mVJ a'))
                content.start()
                # 이름, 가격, 등록날짜, 배송비 크롤링
                title = j.find_element(By.CLASS_NAME,'product_title__Mmw2K').text
                cost = j.find_element(By.CSS_SELECTOR,'.price_num__S2p_v em').text
                delivery = j.find_element(By.CSS_SELECTOR,'.price_delivery__yw_We').text.split("\n")[-1]
                regist = j.find_element(By.CSS_SELECTOR,'.product_etc__LGVaW:not(.linkAnchor)').text.split(" ")[-1]
                
                # 크롤링한 내용 입력
                data[product_count]['title'] = title
                data[product_count]['cost'] = cost
                data[product_count]['delivery'] = delivery
                data[product_count]['regist'] = regist
                
                
                content.join()
                product_count+=1
                        
    # 다음 페이지
    page = driver.find_element(By.CSS_SELECTOR,'.pagination_btn_page___ry_S.active + a')
    print('성공페이지', int(page.text)-1)
    page.click()
    time.sleep(1)
end_time = time.time()
# 크롤링 걸린 시간
print("초", end_time - start_time)




📌 결과 확인



크롤링 결과
결과 data info



📌 불필요한 데이터 key 제거하기


Python
## 데이터 제거하기
# 데이터 프레임 들기
data_df = pd.DataFrame(data)
# 모든 칼럼
for i in data_df.columns:
    # 칼럼 데이터가 10개 이하인 칼럼 제거하기
    if data_df[i].count() < 10:
        del data_df[i]
data_df.info()




📌 칼럼 정리하기


Python
# 칼럼 데이터 많은 순으로 정렬하기
sortcolumn = {}
# 칼럼 : 데이터 개수 dictionary로 만들기
for i in data_df.columns:
    sortcolumn.update({i : data_df[i].count()})
# 칼럼 데이터 많은 순으로 정렬
sortcolumn = sorted(sortcolumn.items(), key=lambda x:x[1],reverse=True)
# 데이터 key 값만 추출하기
sortcolumn_key = [x[0] for x in sortcolumn]
sortcolumn_key

# Nan 뒤로 빼기
data_df_final = pd.DataFrame(data,columns=sortcolumn_key)
data_df_final.sort_values(by='CPU제조사 ', na_position='last', ignore_index=True)






셀레니움으로 네이버 항공권 자동으로 검색하기 1편 python