본문 바로가기
1. 코드/1.1 크롤링

네이버, 카페 검색 결과 크롤링 하기

by 하고 싶은게 많음 2022. 12. 11.

 

썸네일

 

(다른 업무 또한 마찬가지 겠지만) 마케팅 업무를 하다보면, 특정 키워드나 브랜드에 대한 검색결과로 부터 인사이트를 발견해야 할때가 종종 있다.

 

그것이 상품이나 브랜드에 대한 고객 반응이 될 수도 있고(혹은 경쟁사에 대한 조사가 될 수도 있다),

자료나 보고서를 만드는데 근거가 될 수 있는 정량적으로 수치일수도 있으며,

타겟에 대한 관심사 확인을 통해 마케팅 전략이나 신제품 개발에 쓰일 수도 있는 등

자료를 해석하고 활용하는 능력에 따라 발견할 수 있는 인사이트는 무궁무진하다. 

 

 

 

 

 

이런 경우, 가장 기초적으로 검색엔진(구글, 네이버)에서 특정 키워드에 대한 검색 결과를 크롤링하는것이 가장 보편적, 선제적으로 진행된다. 나 또한 타부서에 네이버 크롤링 결과를 요청해 자주 활용했는데, 자료를 만들거나 분석을 진행하다보면 추가적으로 알아보고 싶은 것은 계속 생겨나고, 이럴 때마다 매번 요청하기가 미안해 난감했던 적이 여러 번 있었다. 그래서 이번에는 직접 네이버에서 검색 결과 크롤링을 진행해보고자 한다. 

 

크롤링 코드는 대부분 비슷하기에 뼈대가 되는 하나의 코드만 가지고 있다면, 그때 그때 상황에 맞게 수정해가며 사용할 수 있으므로 자기만의 크롤링 코드는 하나씩 가지고 있는게 좋다!라고 들음

 

오늘은 특히 네이버 검색>VIEW>카페 검색결과를 크롤링해보고자 한다.

검색결과를 1차로 필터링해주지 않으면  '파워링크', '네이버 쇼핑', 'view'탭 등 서로 다른 코드구조를 고려해야 할 뿐만 아니라 크롤링 결과 raw를 가공할 때 할 일이 많아 질 수 있다.

 

ex) 네이버에 사과를 검색할 경우, 통합 검색 결과에는 파워링크>지식백과>네이버 쇼핑>내돈내산 리뷰 상품>계절별 제철요리 등이 순서대로 검색된다.. 우리는 이걸 다 크롤링 할 수 없다ㅠㅠ

 

나는 주로 view탭 중 블로그 검색결과 (특히 상위 1페이지에 노출되는 검색결과)는 대단히 불신하기 때문에 거의 하지 않는 편이다. 나(우리 회사)부터가 SEO작업을 위해 네이버 블로그 인플루언서 광고 대행을 주기적으로 맡긴다ㅎㅎㅎ

카페 침투광고도 많이 하긴 하지만, 그래도 체감상 카페 상위 검색결과가 광고의 농도라고 해야할까 암튼 이게 좀 옅은 느낌이다. 

 

그럼 바로 시작!

1. 필요한 라이브러리 불러오기

1
2
3
from selenium import webdriver
import time
import pandas as pd
cs

2. url 구조 파악하기

네이버에 "사과"를 검색>VIEW탭으로 이동>'카페' 검색 결과만 보기를 선택했을 때 선택결과는 위와 같다. 복잡한 URL 중간에 "사과"라는 단어를 확인할 수 있는데, 우리는 이걸 이용해 URL중간에 우리가 알아보고자 하는 키워드를 넣어줄 거다

이렇게 하면 키워드가 바뀌거나 여러 키워드에 대해 크롤링 할 때도 편하다!

 

* 실행전에 꼭! 구글에서 'chromedriver'을 검색, 최신 크롬드라이버를 다운받아 c드라이버와 가장 가까운 어딘가에 설치해두자!

1
2
3
4
5
6
7
8
keyword="사과" 
driver = webdriver.Chrome("C:/Windows/chromedriver.exe")#웹드라이버 생성
 
 
driver.implicitly_wait(3#사이트가 로딩될때까지 기다려줌
url="https://search.naver.com/search.naver?query={}&nso=&where=article&sm=tab_opt".format(keyword)
driver.get(url) #원하는 웹사이트 접속
time.sleep(1)
cs

 

3. 데이터 프레임 만들어 두기

크롤링한 정보를 깔끔하게 담기 위해서 테이블과 칼럼을 먼저 생성해 두자!

1
2
3
#데이터 프레임 만들어 놓기
table=pd.DataFrame(columns=['카페 명','제목','날짜','조회수','내용','닉네임','댓글 수'])
 
cs

 

 

4. 자동화+크롤링 하기(검색 결과 상위 500개만 추출)

 - 포커스 변환하기 : 검색결과를 차례로 클릭해서 카페내용을 긁어 올 경우, 검색결과 페이지에 포커스를 둘 것인지, 검색 결과를 클릭해 새로 만들어진 탭에 포커싱을 둘 것인지 설정해 줘야함

driver.current_window_handle[0] # 첫 번째 탭 - 사과에 대한 네이버 검색 결과
driver.current_window_handle[1] # 두 번째 탭 - 검색결과를 클릭해서 새로 생긴 탭

- iframe : 크롤링을 어디선가 배우고 와서 네이버 검색 크롤링 부터 막히는 경우가 바로 이 iframe이란 녀석 때문임.

네이버 카페, 블로그는 포스팅 내용물은 iframe이란 곳에 넣어두는데, 네이버 카페, 블로그 크롤링시에는 iframe으로 이동해주는 작업이 꼭 필요하다.

driver.switch_to.frame('cafe_main')

네이버 카페, 블로그 크롤링시 우리를 괴롭히는 iframe이라는 존재, 위 이미지를 보면 iframe 안에 글 제목이 들어가 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#데이터 프레임 만들어 놓기
table=pd.DataFrame(columns=['카페 명','제목','날짜','조회수','내용','닉네임','댓글 수'])
 
# 검색 결과 페이지로 계속 돌아올 것이기 때문에 저장해 놓기
search_result_window = driver.current_window_handle
i=1
results = driver.find_elements_by_class_name('api_txt_lines')
 
for result in results :
    result.click()   
    time.sleep(3)
    # i번째 탭으로 포커스 이동
    driver.switch_to.window(driver.window_handles[1])
    
    ###########################내용 크롤링##########################
    cafe=driver.find_element_by_class_name('d-none').text
    
    ## iframe 으로 이동
    driver.switch_to.frame('cafe_main')
    
    title=driver.find_element_by_class_name('title_text').text
    date=driver.find_element_by_class_name('date').text
    views=driver.find_element_by_class_name('count').text
    contents=driver.find_element_by_class_name('se-component-content').text
    nickname=driver.find_element_by_class_name('nickname').text
    comments=driver.find_element_by_class_name('num').text
    
    #창 종료
    driver.close()
    #데이터 프레임에 행 추가하기
    table.loc[i]=[cafe,title,date,views,contents,nickname,comments]
    if(i>500):
        break
    elif:
        i+=1
    # 검색 결과 페이지로 포커스 이동 - 그래야 아이템 (result)를 클릭할 수 있음
    driver.switch_to.window(search_result_window)
 
cs

5. 엑셀 파일로 변환

키워드가 많을 때는 엑셀 이름에 키워드를 넣어서 저장하면 나중에 편해진다.

1
2
name="{} 크롤링 결과.xlsx".format(keyword)
table.to_excel(name)
cs

 

 

 

 

댓글