brunch

You can make anything
by writing

C.S.Lewis

by 마크 Sep 16. 2021

파이썬으로 네이버 연관 검색어(키워드) 추출하기

추석 연관 검색어(키워드)를 뽑아보자

프로그래밍은 내가 반복하는 작업을 컴퓨터가 혼자서 할 수 있도록 만든 작업 절차서 같은 것이다. 기계 대신 사람이 해야 할 일도 있지만 굳이 사람이 직접 하지 않더라도 올바른 작업지시만 한다면 컴퓨터도 혼자서 일을 할 수 있다.


추석을 앞두고 있으니 추석이라는 키워드의 네이버 연관검색어를 파싱 해주는 프로그램을 한번 만들어보자. 언어는 파이썬(Python)을 사용할 것이다. 먼저 우리가 파싱 해야 할 것이 어디 있는지 확인해 보자.


네이버 검색에서 '추석'을 검색해보면 검색 결과 페이지 맨 아래에 연관 검색어가 나온다.


물론 내가 직접 검색해서 이 연관검색어를 찾아 직접 다른 파일에 적어 옮길 수도 있지만 프로그래밍을 통해 컴퓨터가 하게 할 수도 있다. 우리가 만들 프로그램의 목적은 추석으로 검색한 결과 페이지에서 연관검색어 부분의 연관검색어(2021년 추석, 달력, 추석연휴, 설날, 9월 달력, 추석 달력, 2021 추석, 추석 날짜, 추석당일, 명절)를 추출하여 출력해주는 것이다.


웹 크롤링

방법은 이렇다. 해당 url의 결과 페이지를 웹 크롤링 기술을 통해 html 문서를 불러온 다음 연관검색어에 해당하는 부분만 떼어와 보여주면 끝나는 것이다. 여기서 웹크롤링, 웹 스크래핑, 파싱 모두 같은 의미로 쓰인다. 다 다른 의미라고 얘기하는 사람도 있지만 최소한 나는 같은 의미로 쓴다. 모두 웹페이지 정보를 가져오기(긁어오기) 기술이라고 볼 수 있다.


웹브라우저에서 보이는 모든 것은 html로 만들어진 문서이다. 파이썬에는 이 웹문서를 스크래핑하는데 도움을 주는 라이브러리들이 있다.

requests

bs4

이 그것이다.


requests는 HTTP 호출 라이브러리이다. requests를 통해 특정 url을 호출하면 그 url의 response 값을 가져올 수 있다. 말이 어렵지만, requests를 통해 그 url의 내용을 가져온다라고 이해하면 된다.


bs4 라이브러리는 HTML 문서를 분석해주는 라이브러리이다. BS4의 BeautifulSoup을 통해 requests에서 받아온 HTTP 응답 데이터를 HTML 형태로 보기 쉽게 만들어준다. 뿐만 아니라, find, select와 같은 함수를 통해 쉽게 파싱이 가능하다.


requests와 BeautifulSoup은 내장 라이브러리가 아니기 때문에 pip를 통해 설치를 해주어야 한다. 설치 방법은 다른  블로그 글을 참고해 보길 바란다. 파이참을 쓰는 분들이라면 메뉴 중 File > Setting > Python Interpreter에서 requests 라이브러리 및 bs4 라이브러리를 검색해서 설치를 할 수 있다.


추석 키워드로 네이버 연관 키워드 추출하기

파이썬 파일 하나를 생성한 뒤, 앞서 설치한 라이브러리를 import 해 준다.


다음, 추석이란 키워드로 검색했을 때 나오는 화면의 url을 확인해본다.

query라는 쿼리 스트링에 추석이란 키워드가 보인다. 일단 이 주소를 전체 복사해 url 이란 변수에 담아둔다.


이 url을 requests로 호출하고 text 함수를 이용하여 HTTP 응답 내용을 문자열로 변환한 다음, bs4를 이용해 html 문서를 분석한다.


여기까지가 기본이다. html 이란 변수에 해당 페이지의 html 문서가 담기게 된다. print(html)을 적고 실행해보면 아래와 같이 html 문서가 출력된다.


이 html 문서에서 원하는 부위만 핀셋으로 골라내듯 뽑아내면 된다. 그러려면 내가 가져올 부위의 html 문서가 어떻게 되어 있는지 알아본다. 네이버 검색 결과에서 F12를 눌러 개발자 도구를 연 다음, 연관검색어 부분을 살펴본다.

<div class="tit">연관키워드</div> 이런 형태로 담겨 있음을 볼 수 있다. 그렇다면 <div class="tit">만 모두 골라내면 된다. bs4 라이브러리 중 find 함수를 이용하면 된다. 하나의 요소를 찾을 때는 find를 여러 개를 찾을 때는 find_all을 이용한다. 연관 키워드가 여러 개 있으므로 find_all을 이용한다.


html 변수에 있는 내용 중 div 태그 그중에서도 item이라는 class 명을 가진 요소를 모두 찾는 코드는 다음과 같다.


html.find_all("div", {"class":"item"})


find_all 함수는 찾은 아이템을 리스트(list) 형태로 리턴해 준다. 리스트란 자료 형태 중 하나로 배열이라고 보면 된다. [a, b, c, d] 이런 형태의 자료를 말한다.


이 내용을 result라는 변수에 담고 출력을 해보자.


결과는 [<div class="tit">2021년 추석</div>, <div class="tit">달력</div>, <div class="tit">추석연휴</div>, <div class="tit">설날</div>, <div class="tit">9월 달력</div>, <div class="tit">추석 달력</div>, <div class="tit">2021 추석</div>, <div class="tit">추석 날짜</div>, <div class="tit">추석당일</div>, <div class="tit">명절</div>] 이렇게 출력된다. tit라는 class를 가진 div 코드를 다 리스트로 보여주는 것이다. 그런데 우리가 실제로 필요한 것은 태그 내부 문자이기에 문자만 따로 추출해야 한다.


for i in result:
    print(i.text)


반복문을 이용한다. result에 있던 리스트 하나씩 뽑아서 변수 i에 담는다. 아마 처음 i는 <div class="tit">2021년 추석</div> 이 내용이 담길 것이다. 태그를 제외하고 문자만 추출하기 위해서는 text 함수를 사용한다. print(i.text)를 통해 result 내부에 있던 내용에서 문자만 추출한 결과를 출력한다.


아래와 같이 출력된다.



원하는 대로 출력이 되었다. 전체 코드는 다음과 같다.


import requests
import bs4

url = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%EC%B6%94%EC%84%9D"

http = requests.get(url)

html = bs4.BeautifulSoup(http.text, 'html.parser')

result = html.find_all("div", {"class":"tit"})

for i in result:
    print(i.text)


키워드 입력받아 연관 키워드 뽑기

이 간단한 코드로 네이버 검색 결과 중 연관 키워드를 뽑아낼 수 있었다. 근데 추석 말고 내가 원하는 키워드의 연관 키워드를 뽑을 순 없을까? 당연히 된다. url 중 query= 뒤에 내가 원하는 키워드만 넣으면 된다.


먼저 내가 입력한 키워드를 담는 변수를 하나 만들자


kwd = input("키워드를 입력하세요 :")


코드 처음에 이렇게 적고 시작하면 프로그램 시작하기 전에 input 값을 기다리게 됩니다. input값이 생기면 kwd 변수에 그 내용이 담기게 됩니다. 그리고 url 중 https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query= 여기 뒤에 kwd 내용을 붙여주면 해당 키워드로 검색한 페이지가 된다. URL 구조에 대한 글도 한번 읽어보자.


url = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=" + kwd


이렇게 input 값에 따라 url이 변경되게 할 수 있다. 전체 코드는 다음과 같이 될 것이다.

실행 결과는 다음처럼 쓸 수 있다.


키워드 입력받아 연관 키워드 출력하기

전체 코드는 txt 파일로 공유한다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari