무분별한 크롤링, 과도한 작동은 삼갑시다.
네이버 스마트 스토어 운영하시는 분이 전동 킥보드 관련 물품을 다루시는데 문의 전화가 올 때마다 그때그때 문의 들어오는 것에 대한 정보를 찾아볼 수 있는 데이터베이스가 있으면 좋을 거 같다 하셔서, 재능기부 및 공부 겸 크롤링과 텍스트 마이닝을 활용하여 간단하게 킥보드 제품명을 검색하면 전압, 충전규격 등을 알 수 있는 DB를 만들어 보았다.
데이터는 네이버 상위 랭크 10페이지까지 있는 킥보드 종류로 하였다.
품목을 살펴보니 네이버 쇼핑에 전동킥보드를 검색하면 상위 말고는 킥보드의 부품이나 소모품들이 훨씬 많았다.
driver = webdriver.Chrome('c:/chromedriver.exe')
url = 'https://www.naver.com'
driver.get(url)
driver.implicitly_wait(5)
driver.maximize_window()
driver.find_element(By.CSS_SELECTOR ,'a.nav.shop').click()
search = driver.find_element(By.CSS_SELECTOR,'input._searchInput_search_text_3CUDs')
search.click()
search_nm = '전동킥보드'
search.send_keys(search_nm)
search.send_keys(Keys.ENTER)
다음과 같은 코드로 자동화로 네이버쇼핑의 전동 킥보드 검색을 할 수 있었다.
상위 상품들을 살펴 보면 이렇다.
상품명의 제목들을 살펴보면 브랜드, 킥보드 이름, V, Ah 정보를 얻을 수 있어 제목을 타깃으로 정하여 데이터를 수집하기로
결정하였다!
old_h = driver.execute_script("return window.scrollY")
while True:
driver.find_element(By.CSS_SELECTOR,'body').send_keys(Keys.PAGE_DOWN)
time.sleep(1)
new_h = driver.execute_script("return window.scrollY")
if new_h == old_h:
break
old_h = new_h
이와 같은 동작으로 스크롤로 맨 아래 까지 내려가서 한 페이지에 담을 수 있는 최대의 상품을 탐색했다.
titleList=[]
priceList=[]
linkList=[]
items = driver.find_elements(By.CSS_SELECTOR,'div.basicList_info_area__TWvzp')
for item in items:
title = item.find_element(By.CSS_SELECTOR,'.basicList_title__VfX3c').text
price = item.find_element(By.CSS_SELECTOR,'.price_num__S2p_v').text
link = item.find_element(By.CSS_SELECTOR,'.basicList_title__VfX3c > a').get_attribute('href')
titleList.append(title)
priceList.append(price)
linkList.append(link)
그리고 각각의 정보들을 titleList, priceList, linkList 에 담기 위해 빈 리스트를 만들고
해당하는 정보의 Elements의 태그를 찾아 올바르게 입력해줍니다.
해당 웹사이트의 개발자 모드에 진입하여 제목, 가격, 링크에 관한 데이터를 수집했습니다.
data = {'제품명':titleList, '가격':priceList,'링크정보':linkList}
df = pd.DataFrame(data)
df.to_csv('전동킥보드db.csv', encoding='utf-8-sig',index=False)
이렇게 수집된 정보를 저장합니다.
잘 저장된 모습.
이제 데이터프레임을 열어 깔끔하고 보기 좋게 정형해주는 작업을 시작하겠습니다.
총 464개의 정보가 수집되었다.
이 비정형데이터의 정형은 제품명에서 브랜드, 제품명, Ah, W, V(볼트) 를 각각 뽑아내서
새로운 칼럼에 넣어줘야 합니다.
a = df['제품명'].str.contains('Ah|ah|AH|W|w')
value에 원하는 값 Ah, ah, AH, W, w 가 포함된 제목만을 뽑아내기 위해 탐색해보았다.
원하는 값을 포함된 value는 153개인 것을 확인했다.
내가 원하는 값을 가진 data는 총 153개인 것을 확인 후 데이터 프레임으로 보았다.
temp = df['제품명'].str.split(' ', expand = True, n=15)
temp
이제 이걸 어떻게 만지고 만져 각각 칼럼에 원하는 값을 넣어줘야 한다.
우선은... 153개를 추출한 것을 엑셀 파일로 만들어
임시 DB를 완성했다.
이렇게 된 데이터에서 컨트롤 F 눌러서 찾아야 된다
아직 나아가야 할게 많다.
데이터를 직접 수집하고 처리하였지만 더 예쁘게 가공하고 싶은 마음이 굴뚝같다.
더 나아가서는 애플리케이션으로도 구동해보고 싶다.
많이 배우고 경험해야겠다.
'프로젝트 (Project)' 카테고리의 다른 글
[CI/CD] SSH into my VM - Using git action & docker-compose (0) | 2023.05.01 |
---|---|
[Woodpecker] Secure & Open-source CI/CD tool 구축 (1) | 2023.04.11 |
BMI 지수를 간단하게 도출해보는 페이지 만들어보기 (with java script) (0) | 2022.10.23 |
SQLD (SQL개발자) 자격시험 도전! (4) | 2022.10.07 |
국민의례에 사용되는 기능을 탑재한 웹사이트 만들기 도전! (3) | 2022.09.06 |
댓글