<개인공부>/[Python]

[python] 파이썬 크롤링 (네이버 실시간 검색어)

BlockDMask 2019. 12. 16. 02:03
반응형

안녕하세요. BlockDMask 입니다.

오늘은 파이썬 가지고 네이버 실시간 검색어를 크롤링 해보려 합니다.

파이썬은 웹 크롤링을 위한 모듈들이 이미 존재하더군요.

네이버에 따로 API들을 검색해 봤지만, 네이버에서는 따로 실시간 검색어 API를 제공하지 않더라구요.

그래서 한번 직접 크롤링을 해봤습니다. (불법은 아니겠지요..)


<목차>

1. 크롤링이란?

2. 크롤링을 할때 목적지를 찾는 방법

3. 네이버 크롤링 가즈아 (두가지 방법)


1. 웹 크롤링(web crawling)에 필요한 모듈?


웹 크롤링을 하기 위해서는 특별한 모듈이 필요합니다.

html을 우리가 쉽게 사용할 수 있도록 파싱해 줄 수 있는 BeautifulSoup이 존재하는 bs4 라는 모듈을 설치해야합니다.

> pip install bs4


그리고 파이썬에서 웹사이트에 http 요청을 하기위해 requests라는 모듈도 사용할 것 입니다. 

대부분 설치 되어있긴 하지만, 그렇지 않은 경우도 있으니 설치가 필요합니다.

> pip install requests


2. 크롤링을 할때 목적지를 찾는 방법


▶ 네이버 실시간 검색어 크롤링 STEP 1 - html 열기

목적지 페이지 : https://www.naver.com/ 로 가서 F12를 누릅니다.

그러면 아래 사진과 같은 이런 HTML로 이루어진 페이지가 나옵니다.



▶ 네이버 실검 크롤링 STEP 2 - 목적지 찾기

그러면 이제 우리가 목적하는 부분을 찾으면 됩니다. 

이런방식으로 마우스를 오른쪽 클래스 부분에 갖다 대면 파란색으로 해당부분에 색칠이 됩니다. (움짤입니다.)

▶ 파이썬 네이버 크롤링 STEP 3 - ctrl + f로 원하는 문자열 찾기

만약 저런식으로 일일히 찾기 어렵다면, 

F12로 열은 html이 적혀있는 창을 클릭한 후, CTRL + F 를 눌러서 찾고싶은 문자열을 검색해 봅니다.

지금 글을 쓰고 있는 2019년 12월 15일 23시 53분 기준으로 실시간 검색어는 아래와 같습니다.

그중 우리는 제일 평험한 단어인 "호흡"을 검색해 보겠습니다. 

다른거 검색어들은 특정인의 이름이거나 하니까 건들지 말아봅시다.


그러면 아래와 같이 이렇게 

<span class="ah_k">호흡</span> 으로 나오는걸 볼 수 있습니다.



▶ 파이썬 네이버 크롤링 STEP 4 - 태그와 클래스를 찾았네?

그럼 이제 우리가 찾고자할 문자열, 크롤링할 문자들의 태그와 클래스를 가지고 왔습니다.

<span class="ah_k">호흡</span>

메타 태그는 span 이고 classs는 "ah_k" 입니다.


자 이제 우리는 html을 파싱해주는 BeautifulSoup 모듈(라이브러리)과 우리가 찾은 태그를 이용해서 크롤링을 GOGO 하면 됩니다


**참고로

네이버에서 따로 API를 제공하지 않는걸 보면, 아무래도 실시간 검색어를 공유하길 원하지 않는것으로 보입니다.

이처럼 사이트에서 공개적으로 제공해주는 api가 없는 경우에, 웹 크롤링을 하게 되면 문제가 될 수 있습니다.

단순 학습용이라면 괜찮을것 같지만, 그걸 상업적으로 이용한다던가 하는 행동을 하게 되면 법적으로 문제가 될 수 있습니다.

웹 크롤링을 할때는 항상 조심하셔야 합니다.


3. 파이썬 네이버 크롤링 하는 방법


▶ 네이버 실검 파이썬 웹 크롤링 방법1

이 방법은 조금 간단한 방법입니다. span 메타에서 클래스가 ah_k인 키들을 다 가지고 오게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 파이썬 크롤링 예제 - 네이버 실시간 검색어
import requests
from bs4 import BeautifulSoup
 
source = requests.get("https://www.naver.com/").text
soup = BeautifulSoup(source, "html.parser")
hotKeys = soup.select("span.ah_k")
 
index = 0
for key in hotKeys:
    index += 1
    print(str(index) + ", " + key.text)
    if index >= 20:
        break
cs


▷ 크롤링 방법1 결과


파이썬 네이버 실검 크롤링 결과가 잘 나오는 것을 볼 수 있습니다.

코드를 한줄 한줄 살펴볼까요?


import requests

from bs4 import BeautifulSoup

=> requests 모듈과, bs4의 BeautifulSoup을 임포트 합니다.


source = requests.get("https://www.naver.com/").text

=> 네이버 사이트에 요청을 해서 html 소스들을 문자열( .text)로 바꿔서 "source" 변수에 집어 넣습니다.


soup = BeautifulSoup(source, "html.parser")

=> 일련의 문자열만 가지고는 원하는 데이터를 이쁘게 가지고 올 수 없기 때문에 BeautifulSoup을 이용합니다.

요청해서 받은 "source 변수"을 가지고  BeautifulSoup에 html 소스로 파싱해야한다고 옵션을 정하고 그 옵션을 통해 파싱한 결과값을 "soup" 변수에 집어 넣습니다.


hotKeys = soup.select("span.ah_k")

=> html을 이쁘게 파싱한 soup 변수내부에서. span 메타의 ah_k 클래스를 가지고 있는 문자열들을 다 select 해서 가지고 옵니다. 

select를 하게 되면 해당 키워드들을 리스트 형태로 반환해 줍니다. 반환한 리스트를 hotKeys 변수에 담습니다.


index = 0

for key in hotKeys:

    index += 1

    print(str(index) + ", " + key.text)

    if index >= 20:

        break

=> hotKeys 리스트에서 하나하나 순위를 뽑고 index를 통해서 번호를 알려줍니다. 

이때 if index>=20을 해준 이유는 네이버 웹사이트에 왜그런진 모르겠지만 실시간 검색어가 두번씩 들어가 있습니다.

index >= 20 을 넣지 않고 그냥 출력하게 되면 똑같은 리스트가 한번더 나오게 됩니다. 

(이건 그냥 사이트가 그렇게 되어있음 중복 제거는 아래 방법2에서 해결하도록 해봅시다.)

그래서 한번만 출력하도록 index >= 20을 넣게 된 것 입니다.



▶ 네이버 실검 파이썬 크롤링 방법2

방법 1번에서는 단순하게 ah_k 를 찾아서 크롤링을 수행했습니다. 그래서 각 순위들을 두번씩 가지고 오게 되었고, index>=20이라는 깔끔하지 않은 코드를 넣게 되었습니다.

그럼 이번엔 실시간 검색어 구조를 이번엔 좀더 자세히, 세세하게, 눈을 크게 뜨고 봐 볼까요?

잘 보면 "ah_roll"라는 클래스가 존재하고 그안에 "ah_item"이라는 클래스들이 쫘르르르르르르르륵 존재합니다.

그리고 각 "ah_item"들을 살펴보면 실검들이 하나하나 들어가 있는 것을 볼 수 있죠.

<span class="ah_r">1</span>

<span class="ah_k" ...... >토트넘 울버햄튼</span>

그리고 각 item 내부에는 이런식으로 "ah_r", "ah_k" 클래스로 이루어져 있는 것을 볼 수 있습니다.

그러면 우리는 "ah_roll과 ah_item으로 select를 한 후에 ah_r, ah_k로 for문을 통해서 하나하나 뽑으면 되겠구나" 하고 결론을 내릴 수 있습니다.


중복된 다른 1~20 리스트는 ah_roll 내부가 아닌 ah_list에 들어가 있습니다. 

우리는 ah_roll에 있는 item만 뽑기 때문엔 이번엔 중복된 다른 리스트를 가지고 오지 않게 됩니다.


코드를 한번 보시죠.

1
2
3
4
5
6
7
8
9
10
11
12
# 파이썬 네이버 실시간 검색어 크롤링 예제
import requests
from bs4 import BeautifulSoup
 
source = requests.get("https://www.naver.com/").text
soup = BeautifulSoup(source, "html.parser")
hotKeys = soup.select(" .ah_roll .ah_item")
 
for key in hotKeys:
    print(key.select_one(".ah_r").get_text()
          + ". "
          + key.select_one(".ah_k").get_text())
cs


▷ 네이버 실검 크롤링 방법2 결과


게임한판 하고 온 사이에  실검이 바뀌었네요. 이슈가 이렇게 빨리빨리 바뀌다니.

이렇게 같은 웹 크롤링을 하는데, 어떤 것을 기준으로 삼고 찾는지에 따라서 코드가 조금씩 달라지곤 합니다.

또한, 중복 데이터를 가지고 오기도 하고 그렇지 않기도 합니다.

저도 잘 하지는 못하지만, 크롤링을 할때 html 구조를 보면서 어떻게 설계되어있는지 확인하면서 파싱할 기준을 잡으면 좋을것으로 보입니다.


감사합니다. 이상으로 파이썬 네이버 실시간 검색어 크롤링 포스팅을 마치겠습니다.

여러분들의 댓글과 하트 버튼 클릭 한번이 제게 큰 힘이 됩니다.


반응형