Today I Learned/Python & Pandas

[Python] 네이버 데이터랩 크롤링 (BeautifulSoup & Selenium)

하나719 2020. 11. 4. 18:05
반응형

네이버 데이터랩에서는 급상승 검색어, 검색어 트렌드, 쇼핑인사이트 등 네이버에서 발생하는 검색 결과를 요약해서 보여주는 서비스가 있다. 여기서 급상승 검색어를 크롤링해볼건데 BeautifulSoupSelenium을 사용하는 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')

soup 결과

2) select 로 필요한 정보 가져오기

soup.select (클래스명) 

rank_list = soup.select('.ranking_list .ranking_item .item_title')

11.04 시점 급상승 검색어

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 처럼 자주 사용하는 함수들이 따로 있는데, 다음시간에 알아보자.

오늘은 셀레니움을 왜 쓰고, 뷰티풀솝이랑 뭐가 다른지 알기! 완료

반응형