Yours Ever, Data Chronicles

[Python Crawling] 네이버 쇼핑 검색결과 크롤링하기 (1) - Selenium, BeautifulSoup 본문

Skillset/Data Engineering

[Python Crawling] 네이버 쇼핑 검색결과 크롤링하기 (1) - Selenium, BeautifulSoup

Everly. 2022. 11. 21. 06:57

최근 파이썬으로 크롤링할 일이 생겼는데, 여러 방법을 동원하며 얻은 새로운 정보들이 있어서

이를 정리할 겸, 공유 목적으로 포스팅해보고자 한다 :)

 

내가 크롤링한 페이지는 네이버 쇼핑 검색 결과 페이지인데, 얻고자 한 결과물은 다음과 같은 엑셀 파일이었다.

 

네이버쇼핑 검색 결과 화면
크롤링 완료된 엑셀 화면

네이버 쇼핑 페이지에 '샤인머스캣'을 치고, "리뷰 많은순"으로 정렬해서 나온 값을 뽑았다. 

내가 원하는 정보는 이런 값들이었다.

  • 상품명
  • 판매처에서 올린 이미지
  • 판매처
  • 판매처 판매가
  • 상품 URL 

 

그리고 다음과 같은 시행착오를 거쳤다.

 

먼저 파이썬 Selenium, BeautifulSoup를 활용하여 자동화된 크롬 창을 띄워놓고 긁어오는 방식을 사용

  • 장점: 가장 간단하고 많이 알려진 방식
  • 단점: 정보가 중간에 안 긁어지는 케이스가 있다. (그 이유는 포스팅에서 찬찬히 설명하겠다), 또 이미지를 아무리 가져오려고 해도 에러가 났다. 그리고 시간이 꽤 걸린다.

다음으로는 네이버에서 제공하는 API로 Request와 Json을 활용해 크롤링 → 좀 더 추천하는 방법

  • 장점: 정보가 놓치는 것 없이 모두 긁어와지고, 시간이 얼마 안 걸린다. (10초도 안 걸림!) 이미지도 잘 가져와졌다.
  • 단점: 딱히 없었다. 하지만 네이버 API이기 때문에 정보 수집 개수에 제한이 있을 수 있다. (자세한 내용은 추후 포스팅에서 이어진다)

 

결과부터 먼저 요약하자면 위와 같으며, 크롤링했던 2가지 방법 모두를 하나씩 포스팅하고자 한다.

Note: 코드는 마우스 커서를 올리면 'Copy'가 뜨며, 이를 클릭하면 클립보드에 복사됩니다.

 

 

Selenium, BeautifulSoup를 활용한 네이버 쇼핑 크롤러 만들기 


이번 포스팅은 '기본편'으로, html 코드를 하나하나 뜯어보며 설명하려고 한다.

결과물은 '샤인머스캣'을 검색했을 때의 1, 2페이지에 해당하는 검색 결과(정렬 기준은 리뷰 많은 순서)를 뽑아 엑셀로 출력하는 것이다.

 

크롤러를 만들기 위해 크롬(Chrome) 브라우저를 활용할 것이고, 이를 위해서는 크롬드라이버(Chromedriver)를 설치해야 한다.

다음 링크에 접속해 크롬드라이버를 설치하자.

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 108, please download ChromeDriver 108.0.5359.22 If you are using Chrome version 107, please download ChromeDriver 107.0.5304.62 If you are using Chrome version 106, please download ChromeDriver 106.0.5249.61

chromedriver.chromium.org

 

여기서 중요한 것은 현재 자신의 크롬 버전에 맞는 크롬드라이버를 설치해 주어야 한다는 점!

지금 크롬버전은 크롬 설정에 들어가면 확인 가능하다. 나는 현재 107 버전이다.

 

 

그래서 나는 크롬드라이버의 107.0.5304.62를 설치해 주었다.

 

 

다운을 받고 받은 크롬드라이버를 현재 자신이 크롤링하고자 하는 쥬피터 노트북 파일이 저장되어 있는 폴더 안에 넣으면 완료!

 


이제 본격적으로 네이버 쇼핑 페이지에 들어가 html을 뜯어보자.

먼저 크롬드라이버를 활용해, 코드만으로 네이버 쇼핑 페이지를 자동으로 뜨게 할 수 있다. 다음을 입력한다.

 

### for Windows 
import time
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
import pandas as pd

# chromedriver 위치에서 코드작업 필수 
driver = webdriver.Chrome('chromedriver.exe')

URL = 'https://search.shopping.naver.com/search/all?frm=NVSHATC&origQuery=%EC%83%A4%EC%9D%B8%EB%A8%B8%EC%8A%A4%EC%BC%93&pagingIndex=1&pagingSize=40&productSet=total&query=%EC%83%A4%EC%9D%B8%EB%A8%B8%EC%8A%A4%EC%BC%93&sort=review&timestamp=&viewType=list'

driver.get(URL)

 

위를 입력하게 되면 다음과 같은 페이지가 자동으로 뜬다. (상단에 "Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다." 라고 나오면 잘 한 것!)

 

 

위의 코드는 윈도우에서만 작동하는데, 맥os의 경우 조금 코드가 다르다.

 

### for MacOS
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import pandas as pd

# chromedriver 위치에서 코드작업 필수 
chrome_options = Options()
driver = webdriver.Chrome(service=Service('경로입력/chromedriver'), options=chrome_options)

URL = 'https://search.shopping.naver.com/search/all?frm=NVSHATC&origQuery=%EC%83%A4%EC%9D%B8%EB%A8%B8%EC%8A%A4%EC%BC%93&pagingIndex=1&pagingSize=40&productSet=total&query=%EC%83%A4%EC%9D%B8%EB%A8%B8%EC%8A%A4%EC%BC%93&sort=review&timestamp=&viewType=list'

driver.get(URL)

 

맥os의 경우에는 크롬드라이버의 service, options 를 install해야 하고, 또 크롬드라이버의 경로를 정확히 입력해줘야 한다. (나는 맥북을 사용하는 관계로 위 코드를 사용하였다.)

 

html을 살펴보기 전에 URL을 잠시 살펴보자.

자세히 보면, https 뒤에 네이버쇼핑/search/ 하고 뒤에 여러 가지 말들이 붙는데 여기에는 이 페이지에 대한 정보들이 들어있다.

 

  • query: 검색어 (저는 '샤인머스캣' 한국어를 입력했기에 특수문자로 처리가 되었다)
  • pagingIndex: 현 페이지의 인덱스. 지금은 샤인머스켓 1페이지 검색결과라 1로 나와 있다.
  • pagingSize: 몇개씩 보는지를 나타낸다. 지금은 40개씩 보기를 선택해서 40으로 나온다.
  • sort: 정렬기준. 나는 리뷰 많은순으로 선택했기에 review라고 나온다. 

그 외에도 다양한 값들이 있는데 대표적인 값들만 정리해보았다.

 


이제 크롬 개발자 모드로 들어가면, 이 페이지의 html을 확인할 수 있다.

  • 윈도우는 F12를,
  • 맥은 option+command+i 를 눌러보자.

 

그럼 다음과 같이 오른쪽에 html 코드가 보인다.

이 코드를 활용하면 우리가 원하는 값을 파이썬을 활용해 자동으로 긁어오게 만들 수 있다.

 

오른쪽 상단의 마우스처럼 보이는 부분을 클릭해, 왼쪽 상품페이지 위에 올려놓으면 다음과 같이 해당 html 정보로 이동한다.

우선 나는 첫번째 상품정보가 궁금하므로 눌러보았다.

 

 

보시다시피 전체 상품정보는 "basicList_item__0T9JD" 라는 클래스(class)로 되어 있으며, 이 안에 상품의 제목, 가격, 등록일, 판매자 등의 정보가 들어있음을 확인할 수 있다. (꼭 첫번째 상품만 그런 게 아니라, 모든 상품에 대해 같은 클래스값을 가진다! 한번 눌러서 직접 확인해보자.)

그래서 나는 beautifulsoup (이하 'bs') 를 활용하여 이 정보를 'goods_list'에 저장하였다. 이제 여기에는 '샤인머스캣' 검색 결과 모든 값에 대한 정보가 들어있다.

 

soup = BeautifulSoup(driver.page_source, 'html.parser')
goods_list = soup.select('li.basicList_item__0T9JD')

 

다음으로는 goods_list 안에 있는 정보들을 하나씩 쏙쏙 골라내보자.

먼저 상품제목을 알기 위해, 역시 상품제목 위에 마우스 커서를 두고 해당 html로 이동하였다.

 

 

위 사진을 보면 이 정보는 "basicList_title__VfX3c" 클래스 안에 들어있는 것을 확인할 수 있으며, title을 확인하면 "신선식품 최대 50% 행사" 라고 상품제목과 똑같은 값이 들어있는 것을 확인 가능하다.

 

좀 더 확대한 화면. class와 title 값에 정보가 들어있다.

 

나는 이 상품제목 값을 가져오기 위해 bs의 select_one 메서드를 활용해 가져왔다.

goods_list 는 첫번째 상품부터 ~ 마지막(40번째) 상품까지의 정보가 있으므로 for문을 활용해 하나씩 뽑아보겠다.

 

for v in goods_list:
    item_name = v.select_one('div.basicList_title__VfX3c > a').get('title')

 

bs의 select_one을 활용하면, get 메서드를 통해 원하는 정보를 뽑아낼 수 있다.

여기서는 해당 클래스 내 a 위치에 있는 'title' 값을 얻고 싶으므로 위의 코드를 사용한다.

 

글이 길어지는 관계로, 다음 포스팅에서 상품제목 외에 판매가, 등록일, 판매자, URL 정보를 가져와보자.

반응형