[Python] 네이버 데이터랩 크롤링 (BeautifulSoup & Selenium)
네이버 데이터랩에서는 급상승 검색어, 검색어 트렌드, 쇼핑인사이트 등 네이버에서 발생하는 검색 결과를 요약해서 보여주는 서비스가 있다. 여기서 급상승 검색어를 크롤링해볼건데 BeautifulSoup과 Selenium을 사용하는 2가지 방식으로 해보고 비교해보려고 한다.
1. BeautifulSoup
# 필요한 라이브러리 추가하기
import requests
from bs4 import BeautifulSoup as bs
네이버는 beautifulsoup으로 크롤링을 할 때 header 정보를 제공해주지 않으면 접근이 되지 않는다.
해커등의 비정상적인 접근이 아니라는 것을 알려주기 위해서 내 접근 정보를 넘겨주어야한다.
1) html 정보 가져오기
header 없이 접근했을 때
header 추가해서 접근
검사도구 > network > headers
# 본인의 컴퓨터 네트워크정보 넣어주세요.
header = {
'accept': '',
'accept-encoding':'',
'accept-language': '',
'cache-control': '',
'cookie': '',
'sec-fetch-mode': '',
'sec-fetch-site': '',
'upgrade-insecure-requests': '',
'user-agent': ''
}
url='https://datalab.naver.com/keyword/realtimeList.naver'
res = requests.get(url,headers=header)
soup = bs(res.content, 'html.parser')
2) select 로 필요한 정보 가져오기
soup.select (클래스명)
rank_list = soup.select('.ranking_list .ranking_item .item_title')
3) .text로 텍스트 정보만 가져오기
위에서 <span class="item_title"> 검색어 </span> 결과를 리스트 형태로 받아왔다.
이제 for문을 돌리면서, 각 span 안에 있는 검색어 부분을 .text로 뽑아보자
for index,rank in enumerate(rank_list):
print(index+1,rank.text)
2. Selenium
BeautifulSoup 으로도 크롤링이 가능한데 Selenium은 뭐지? 라고 생각했는데, 네이버, 구글등 일부 사이트에서는 header 정보를 넘겨주지 않으면 크롤링이 안되도록 막아놓은 사이트들이 있다. 셀레니움은 그런 것들을 뚫고 다!! 거의 모든 문서를 다 크롤링 해올 수 있는 라이브러리이다. 그리고 페이지 내에서 마우스로 스크롤을 내리면 데이터가 더 나오는 형식의 사이트 처럼 동적으로 데이터를 가져올 수 있다는 점이 있다.
1) webdriver 다운로드
selenium은 사람이 직접 사이트에서 탐색하는 것 같이 웹페이지를 요청하고 응답을 받을 수 있다.
그래서 파이썬에서 브라우저를 열고 제어할 수 있는 webdriver를 설치해주어야 한다.
자신이 사용하고 있는 크롬 버전 확인 후 맞는 웹드라이버 설치해주면된다.
만약에 사용하다가 크롬 버전을 업데이트하면, 웹드라이버도 업데이트한 버전으로 다시 받아주어야하는게 좀 불편하다.
* 크롬: https://chromedriver.chromium.org/downloads
Downloads - ChromeDriver - WebDriver for Chrome
WebDriver for Chrome
chromedriver.chromium.org
다운로드 한 웹드라이버는 작업하고 있는 폴더에 넣어준다.
2) 라이브러리 불러오기
from selenium import webdriver
3) page 로드하기
driver.implicitly_wait(3) : 창 로드되고 3초 기다리기
-> 왜 하냐면 로드가 덜 되었는데 크롤링하면 오류가 발생함!
driver = webdriver.Chrome('./chromedriver')
#페이지가 모두 로드될 때까지 3초 기다려주는 코드
driver.implicitly_wait(3)
#셀레니움을 통해 실제 크롬창에서 접속한 것과 동일하게 해당 url 내용을 가져옴
driver.get(url)
3) 소스 읽어서 beautifulsoup으로 파싱
#소스를 읽어 Beautifulsoup을 이용해 파싱
html = driver.page_source
soup = bs(html,'html.parser')
4) 이전에 했던것과 동일하게 코드 작성
driver.close() 로 크롬페이지 닫아주기
# 그다음은 이전에 requests와 beautifulsoup 을 이용했던 코드와 동일하게 처리
rank_list = soup.select('.ranking_list .item_title')
rank_result_list = []
for (index, rank) in enumerate(rank_list):
rank_result_list.append({'rank':index+1,'value':rank.text})
print(rank_result_list)
driver.close()
selenium에서는 beautifulsoup의 select, find 처럼 자주 사용하는 함수들이 따로 있는데, 다음시간에 알아보자.
오늘은 셀레니움을 왜 쓰고, 뷰티풀솝이랑 뭐가 다른지 알기! 완료